6

我的问题实际上不是 ajax 加载本身,更多的是在没有 javascript 的情况下加载它的能力。我的意思是,当我基于 ajax 可用性 不使用 ajax对整个项目进行编码时,我可以轻松应对。

//编辑:虽然阿伦德已经有了或多或少有效的答案,但同时“这个问题没有直接的答案”。但是,我希望看到开发人员针对像我这样的场景的其他一些方法!即使只是几个链接也可以提供帮助!

基本上我只是感到沮丧,在同一页面上对所有内容进行两次编码,以确保没有和启用 Javascript 的用户都有相同的体验。这很烦人,我一直想知道其他人如何解决这个问题。

例如,当我更新依赖于相同变量的两个 div 时,它会变得混乱。这是一个例子:

非 js 版本

require 'classobject.class.php';
$another_var = 'something';
$class = new classobject($_POST['variable']); // just an example to show that this is dynamic - I'm aware of injection!
$function = $class->returnsth(); // returns 1

if(isset($_POST)) {
    echo '<div id="one">Module 1 says:'; $require 'module_one.php'; echo '</div>';
    echo '<br /><br />';
    echo '<div id="two">Module 2 says:'; $require 'module_two.php'; echo '</div>';
}

现在我有了根据 $functionmodule_two.phpmodule_two.php返回变量执行不同的代码。像:

if($function >= 1 && another_var != 'something') {
   // do stuff
}
else { 
   // do other stuff 
}

现在,由于重新加载很容易,当我想在 keyUp/enter/submit 或其他什么上加载两个模块时,我基本上有一些问题:

  • 我必须$_POST手动将变量发送到模块才能使用它们
  • 我必须重新执行类和它的方法,并在每个模块文件中为它们建立一个链接(require_once)。
  • 由于模块中不存在 $another_var ,因此我也必须将此变量发送到每个模块(例如使用 post ),然后在使用它之前,我必须像“更改”它一样$another_var = $_POST['another_var'];

我觉得这有点烦人,我想知道你们是怎么做到的。我希望我的编码方式不会太傻,但我想不出另一种方式。可能很难与我的非常基本的示例相关联,但是将整个项目与代码一起带来太多了。总而言之,我正在寻找一种更好的方法来编码和清理这个烂摊子——一定有办法!我考虑过会话,但为了兼容性,我也不想依赖它们(如果有人不允许使用 cookie)。

如果您无法通过这种组装代码的方式与我试图完成的工作相关联,我将解释一个我经常面临的场景(如果您已经了解我的痛苦,这并不重要):

  1. 基本上,我有我的index.php页面,所有内容都在其中执行,包括 html 正文和 css 样式等。此页面需要一些变量,这些变量是从需要索引的页面中设置的(如$another_var我的示例中)。
  2. 现在也可以设置其他变量(例如从表单中)。根据不同的类和方法加载新变量(数组),这些变量在我的模块中的 while 循环中使用,以回显所有内容。

希望不要太抽象。考虑一个预订系统,其中一些变量是从您来自的页面(您想要预订的活动)设置的,然后用户设置更多的东西(时间跨度,一些偏好,......)。最后,它应该显示从数据库一直到最终结果的结果——你可以说用户一步一步地缩小结果。

4

2 回答 2

11

你的问题没有直接的答案,但有一些值得深思的地方。

关注点分离 您可以考虑是否可以分离您的业务逻辑和布局逻辑。通常,使用模板引擎可以对此有很大帮助。我对例如 Twig 或 Smarty 有过积极的体验(前段时间,不知道他们现在如何衡量)。它要求您以(较少线性)但更合乎逻辑的方式编写代码。

像关注点分离这样的 OOP 的典型示例可能是这样的:

$this->setParam('Myparam','myvalue');

if ($this->isAjax())
{
    $this->setTemplate('ajax.php');        
    $this->setLayout(false);
} else {
    $this->setTemplate('normal.php');
    $this->setLayout('Mylayout');
}

return $this->render();

这是一种富有想象力的情况,可以在许多类似 MVC 的应用程序和框架中找到。主要思想是您应该有可能将布局与数据分开。我建议从一些现代框架中寻找灵感(如 symfony、codeigniter、zend 框架)。

词汇表 / 解耦 PHP 应用程序 中常用的概念 这里是可以使用的概念的快速列表。

php 中的示例 mvc: http ://www.phpro.org/tutorials/Model-View-Controller-MVC.html

注意:我不太喜欢这个实现。我更喜欢现有的框架。我确实喜欢本教程的全部解释。例如,对我来说,此链接用于学习,而不是用于实施。

Silex 对于一个简单的解耦 php 微框架,我真的会推荐 symfony2 的 silex。它易于实现和学习,但包含此处描述的主要概念;并使用所有 php 5.3+ 的好东西,例如命名空间和闭包。

见:http ://silex.sensiolabs.org/

Frontcontroller 模式 只有一个,并且只有一个代码入口点。我通常只有一个,而且你的申请中只有一个点。通常前端控制器将请求“分派”到应用程序的其余部分

http://en.wikipedia.org/wiki/Front_Controller_pattern

路由

路由系统通常与前端控制器模式结合使用。它基本上描述了哪个 URL 连接到哪个模块/控制器。这允许您在不更改 URL 的情况下更改人们访问您的应用程序的方式。

请参阅:https ://stackoverflow.com/questions/115629/simplest-php-routing-framework

控制器

控制器是应用业务逻辑的地方。从数据库中获取数据、检查权限、设置模板、设置布局等(尽管如果单独关注太大,这也会移到控制器之外)。

模型 模型基本上是使用管理数据库的层。这可以是一个简单的类,您可以在其中移动所有 mysql_* 函数,也可以是一个功能齐全的 ORM。主要理念是所有与在数据库中获取和放置信息相关的逻辑都是分开的。

更上一层楼:ORM 应用程序中经常使用的一种方法是对象关系模型,这些将 SQL 记录“映射”到 PHP 对象。Doctrine 和 Propel 是其中两个精心设计的库。我在开发过程中严重依赖这些系统。从这个意义上说,学说或推进部分将代表模型层。

视图: 视图通常由模板引擎组成。一些使用普通的 PHP 作为模板,其他的,比如 symfony 创建一个单独的范围来放置变量。关于什么是最好的,有很多讨论和意见,其中一个就在 stackoverflow 上:

我喜欢的那些: - Twig:http ://twig.sensiolabs.org/ - sfTemplate:http ://components.symfony-project.org/templating/ - Smarty:http ://components.symfony-project.org/templating /

解耦机制:

  • 基于事件的系统 在你的代码中使用事件可以帮助分离代码。例如,如果您想在保存记录后发送电子邮件,事件是一个很好的解决方案;一般来说,模型不必了解电子邮件。因此,事件是连接它们的一种方式:您可以让您的 -email-send-class 监听某些记录,以便它们发送正确的电子邮件。(也许您更希望您的电子邮件从您的控制器发送,这可能是个人喜好问题)。

  • 依赖注入 在 PHP 中使用 OOP 代码时,许多依赖于运行单例类(配置等)。从 OOP 的角度来看,这可能被认为是不好的,因为它很难测试,而且像这样运行依赖项也不是很优雅。依赖注入是一种来自 Java 的模式,现在在较新的框架中使用来解决这个问题。可能有点难以理解,但你会看到它在几个新框架中回归。

php 中的依赖注入:PHP 5.3 中的依赖注入

构架:

这些方法很多都是困难的,或者自己实现的工作量很大。许多人会为此建立一个框架。您可能需要也可能不需要框架。您可能想要也可能不想要一个框架,这是您的选择。但是学习框架如何做到这一点仍然很有用,而不是尝试自己重新发明轮子。

无框架 php 框架:https ://stackoverflow.com/questions/694929/whats-your-no-framework-php-framework

好习惯:https ://stackoverflow.com/questions/694246/how-is-php-done-the-right-way

值得一看的框架(恕我直言):CodeIgniter、Kahona、CakePHP、Symfony (1.4/2.0)、Silex、Zend Fanework、Yii。还有更多,每个都有自己的忠实粉丝和仇恨者。

于 2011-11-26T21:25:40.460 回答
0

我用PHP写了这样的东西。我已经抽象了每个页面的渲染,因此我定义了一个$content变量,然后require('layout.php'). 该$content变量只是一个大的 HTML 字符串。

我编写了一个 PHP 函数来确定请求是否为 AJAX。

非 AJAX 响应$content在中间呈现布局,b/t 页眉和页脚布局内容。

AJAX 请求基本上得到这个:json_encode(Array("content"=>$content)). 我使用 jQuery 从 JSON 响应中获取 HTML 并修改 DOM。使用json_encode()将处理转义 javascript 的字符串。

最后,我有效地对每个页面进行了 AJAX 化,而无需过度设计复杂的解决方案。

任何支持 AJAX 的浏览器也可以在新选项卡/窗口中打开链接以模拟非 AJAX 请求。(或者也可以收藏/分享链接。)

于 2011-12-05T15:38:50.977 回答