【问题标题】:How to properly communicate a parent PHP with embeeded PHP?如何正确地将父 PHP 与嵌入式 PHP 进行通信?
【发布时间】:2016-09-14 11:01:42
【问题描述】:

您可能还记得不久前我向您寻求帮助,帮助您处理 PHP 中通过 $_SESSION 传输的对象(更多:Data loss during sending via $_SESSION from one script to another)。目前我正在重新设计整个项目,我不知道如何正确完成它。我的意思是,如何“根据艺术”做,而不是“不惜一切代价/最简单(但讨厌)的方式”。

这是我想要实现的模型(动画 gif)

如您所见,我希望我的网站在启动时仅显示导航,我希望用户在其中设置他的启动参数。将来,导航栏将具有折叠功能(以扩展数据显示部分的高度)。当用户设置参数(或不设置参数 - 用于默认视图)并单击“过滤和排序”(可能将重命名为“生成”)时,第二部分应显示为用户定义的数据过滤和排序。

数据从 CSV 文件中读取并存储在我在上面链接的问题中向您展示的自定义类定义的 PHP 对象中。所以我需要在 5 个文件之间进行数据通信:

前端:

index.php

前端-后端:

navigation.php

data.php

popup.php tinybox2 处理。

后端:

classes.php

  • tinybox2“库”。

我的沟通流程是: 显示在index.php顶部的navigation.phpdata.php发送过滤和排序参数,使其出现在index.php的底部。

data.phppopup.php 应使用由 CSV 文件 datafile.csv 构造的 classes.php 中包含的类。

当在data.php 中单击DataBox 时,popup.php 会出现在index.php 内容上以显示扩展对象数据。

那么,我应该怎么做才能正确地做到这一点? 哪个选项最好:$_POST、$_SESSION 或其他?也许由于在index.php 上嵌入了所有文件,因此可以以不需要通信的方式存储所有数据?如何嵌入文件 - 使用 include、require 或其他方式?

有很多辅助问题,但最重要的是:如何正确地做?提前感谢您的帮助:)

PS 为了确定,请在下面找到另外一个用例:

UC1:显示系统的标准使用

  1. 用户通过系统进入网站
  2. 用户选择过滤和排序参数
  3. 用户开始生成视图
  4. 正在从 *.csv 文件中读取数据
  5. 在上述过程中,正在过滤和排序数据
  6. 系统正在向用户显示数据

扩展:

5a。无数据显示:系统显示空数据部分

6a。用户想要再次过滤和排序:返回第 2 步。

UC2(可选):用户想要共享数据

  1. UC1
  2. 用户选择共享数据的选项
  3. 如果用户想将其发送到打印机或电子邮件,系统会显示问题
  4. 用户选择选项(对于这种情况:电子邮件)
  5. 系统要求提供电子邮件地址
  6. 用户提供电子邮件地址
  7. 系统发送一封电子邮件,其中包含网站上显示的当前data.php 数据。

PPS 我知道我应该给你看一些代码 sn-ps,但是我当前的代码是一团糟,有很多互换的 html、php 和 cmets,无法从系统中删除(或者我需要很长时间才能清理它在这里展示)。我主要是在向您寻求帮助,因为我真的想改造当前的解决方案,因此我从零开始重写代码,使用旧代码作为提示,而不是模板。就像微软对 Windows Vista 和 Windows 7 所做的那样:P 希望你能理解 ^^'

【问题讨论】:

  • 我认为这更多的是您要构建什么样的应用程序的问题。如果它是SPA,您的 php-backend 可能会简化为一个简单的 rest-server。但是您的客户端需要一些额外的技术(角度,反应,...)。如果它是一个更传统的应用程序(没有 ajax),那么就不需要 php 文件来通信。对服务器的每个请求都应该通过它需要呈现的视图来区分。并且通过请求的属性所有数据一知
  • 我知道这听起来很笼统,但您的问题也是如此。 ;) 这可能也是投反对票的原因(不是我的顺便说一句)。
  • @Yoshi,好的,我明白了。我不太了解 AJAX 和 JavaScript,我想以最简单的方式来做。首先出现导航,我输入了一些数据,并且没有重新加载我的页面,第二部分出现了过滤和排序的数据。如果可能的话,所有干净的 PHP 和 HTML。但是,如果我正确地解释了您的评论,没有一些额外的技术,那是不可能的?
  • appearing 基本上与 ajax 齐头并进。如果你想单独使用 php,即使它是一个很大的障碍,我强烈建议你使用框架。那里有很多,很难我随时推荐symfony

标签: php html css csv


【解决方案1】:

好的,就是这样。一些人认为过于宽泛的问题的最终答案。

是怎么回事:

我想实现一个双节页面,其中第一个(部分)部分接受用户输入并使用它来过滤第二个部分中的数据。问题在于从父端向被调用端提供参数。

我必须改变我的观念:

一开始我想用 $_SESSION 或者其他 PHP 方式传递数据,但是这种思维方式存在一个主要问题:

由于PHP是服务器端解释的,它不能在不刷新的情况下动态添加另一个页面!

我知道我并没有打算使用新灯泡或探索美国,但正是这个结论让我接受了这样一个事实,即 JavaScript 的使用是不可避免的。我认为大多数初学者会发现这很重要:您需要彻底改变您的思维方式,因为网站与传统应用程序不同。在此之后,我终于想到(感谢@Yoshi),我最初使用 jQuery 的问题并不是阻止使用它的好理由,我必须找出它们是什么。

解决方案来了:

好的,那么解决办法是什么?

我已经开始找出我的 jQuery 出了什么问题......这是解释“包含在 php 中的代码的范围是什么”的错误方式。如果我将view/header.htm 文件包含到位于根目录中的index.php 中,它将像在根目录中一样运行,而不是在查看目录中。这是最愚蠢的,也是最常见的错误。

发现这一点后(再次感谢@Yoshi!):

  1. 我为我的应用程序创建了后端(模型),它可以:
    • 从文件中读取数据
    • 将数据放入基于类的存储中(将来将作为“伪数据库”导出到 php 文件中)
  2. 然后我创建了一种控制器,它可以使用模型将数据传递给我视图中的变量。
  3. 至少我已经为我的站点创建了一个视图,其中包含“父站点”(它有一个带有主控制器的后端部分和一个带有视图的前端部分)和一个“调用的站点”通过 jQuery 请求打开,并包含过滤后端和主数据视图。

这 3 个步骤起初并不那么容易,但现在却如此重要,这些步骤将我带到了这里。请在下面找到一些 php 伪代码:

model_Data.php

<?php
    // Class for single instance of data storage

model_DataSet.php

<?php
    // Class for set of data instances storage

model_ReadData.php

<?php
    // Code for reading CSV file with fgetcsv function

controller_DataMaster.php

<?php
    require_once 'model_Data.php';
    require_once 'model_DataSet.php';
    require_once 'model_ReadData.php';
    // Read data from file to a variable
    $reader = new ReadData();
    $reader->setConfiguration(//some setup);
    $tmp_data = $reader->read("filename");
    // Put data into the class
    $dataSet = DataSet($tmp_data);
    return $dataSet;

index.php(这是主控制器!)

<?php
    header('Content-Type: text/html; charset="UTF-8"');

    include 'view/header.htm';

header.htm 包含 HTML 标头,包括 jQuery 和 jQuery-UI(为了 datepicker)以及 css 引用,以及(当然)显示输入表单的网站的物理标头。

view.php

<?php
    $import = include 'controller_DataMaster.php';

    $usableData = $import->getAllDataSingles();

    if (isset($_POST['data_from_the_form']))
    {
        // Do something!!!
    }
?>

<table>
    <tr>
        <?php $i = 1; foreach($usableData as $singleData): ?>
            <td><pre><?php print_r($singleData->getAllProperties()); ?></pre></td>
            <?php if ($i++ % 3 == 0): ?>
                </tr><tr>
            <?php endif; ?>
        <?php endforeach; ?>
    </tr>
</table>

通过这种方式,您可以实现如下所示的效果(目前 - 未应用任何 CSS):

原来如此。对我自己的问题的简单,不是很长,不是很短的答案。结案:)

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多