为复杂项目加载Ajax

时间:2011-11-26 20:08:37

标签: php ajax jquery asynchronous page-refresh

我的问题实际上不是ajax加载本身,更多是没有javascript加载它的能力。我的意思是,当我根据ajax-availability OR 编码整个项目 而不使用ajax时,我很容易应对。

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

基本上我只是感到沮丧,在同一页面上编码所有内容两次,以确保没有和启用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>';
}

现在在module_two.phpmodule_two.php我的代码执行方式取决于$ function的返回变量。 像:

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

现在因为重新加载很容易,当我想在keyUp / enter / submit或其他任何东西上加载两个模块时,我基本上有一些问题:

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

我发现这有点令人讨厌,我想知道你们是怎么做到的。我希望我的编码方式不是太傻,但我想不出另一种方式。可能很难与我的基本示例联系起来,但是用代码带来整个项目会太多了。 总结一下,我正在寻找一种更好的方法来编码和清理这个混乱 - 必须有办法!我想过会议,但为了兼容性我不想依赖他们(如果有人不允许使用cookies)。

如果您无法通过我的代码组装方式与我想要完成的事情联系起来,我将解释一个我面临很多情况的场景(如果你已经理解的话,那就不重要了我的痛苦):

  1. 基本上我有index.php页面,其中所有内容都被执行,html正文和css样式等等。此页面需要一些变量,这些变量从需要索引的页面设置(如我的示例中的$another_var)。
  2. 现在也可以设置其他变量(例如从表单中设置)。根据不同的类和方法加载在我的模块中的while循环中使用的新变量(数组)来回显所有内容。
  3. 希望这不是太抽象。想想一个预订系统,其中一些变量是从您来自的页面(您要预订的事件)设置的,然后是用户设置的更多内容(时间跨度,一些偏好,......)。最后,它应该从数据库一直显示到最终结果的结果 - 你可以说用户逐步缩小结果。

2 个答案:

答案 0 :(得分: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

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

<强>捷希凯 对于一个简单的解耦的php微框架,我真的会推荐使用symfony2制作的silex。它易于实现和学习,但包含了这里描述的概念的主要内容;并使用所有php 5.3+好东西,如命名空间和闭包。

请参阅:http://silex.sensiolabs.org/

前控制器模式 只有一个,只有一个代码入口点。我通常只在您的应用程序中有一个,也只有一个点。通常一个前控制器&#39;发送&#39;对应用程序其余部分的请求

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

<强>路由

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

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

<强>控制器

控制器是应用商务逻辑的地方。从数据库获取数据,检查权限,设置模板,设置布局等(尽管如果它变得过于单独关注,它也会移出控制器之外)。

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

一步到位:ORM 应用程序中经常使用的方法是对象关系模型,这些&#39; map&#39; SQL记录到PHP对象。 Doctrine和Propel是这些精心设计的两个库。在我的开发中,我非常依赖这些系统。从这个意义上说,学说或推进部分将代表模型层。

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

我喜欢: - 树枝: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中的依赖注入:Dependency Injection in 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

值得关注的框架(imho):CodeIgniter,Kahona,CakePHP,Symfony(1.4 / 2.0),Silex,Zend Franework,Yii。还有很多,每个都有他们的粉丝和仇恨者。

答案 1 :(得分: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请求。 (或书签/分享链接。)