为复杂项目加载Ajax

Ano*_*ous 6 php ajax jquery asynchronous page-refresh

我的问题实际上不是ajax加载本身,更多的是没有javascript加载它的能力.我的意思是,我应付自如,当我编写我的整个项目基于Ajax的可用性 只是不使用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>';
}
Run Code Online (Sandbox Code Playgroud)

现在我module_two.phpmodule_two.php我的代码执行不同取决于$ function的返回变量.喜欢:

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

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

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

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

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

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

希望这不是太抽象.想想一个预订系统,其中一些变量是从您来自的页面(您要预订的事件)设置的,然后是用户设置的更多内容(时间跨度,一些偏好,......).最后,它应该显示从数据库到最终结果的结果 - 您可以说用户逐步缩小结果.

Are*_*end 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();
Run Code Online (Sandbox Code Playgroud)

这是一个富有想象力的情况,可以在许多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 Pattern 只为您的代码提供一个和一个入口点.我通常只在您的应用程序中有一个,也只有一个点.通常,前端控制器将请求"发送"给应用程序的其余部分

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

路由

路由系统通常与前控制器模式结合使用.它基本上描述了哪个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

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

  • 我认为你应该使用相同的控制器,因为使用ajax做的任何重要事情通常都需要在没有ajax的情况下完成.因此,它会有很多交叉.我只需要在你的控制器"isAjaxRequest"中有一个布尔值,你可以随时查询为ajax特定的任何东西做一个简单的if语句. (3认同)
  • 这是一个很好的例子,很多MVC(模型,控制器,视图)都像应用程序一样工作; 但它需要更多的抽象编码.(并不总是很令人兴奋的事情).我将为您发布一些链接,作为一些背景信息. (2认同)
  • 我只想重新执行Arend所说的话.这个问题确实需要~2000行源代码来回答.但基本概念是,您应该能够设置一个环境,其中处理数据的代码用于ajax和非ajax请求,并且只有最终输出(HTML vs JSON)发生更改.确切地说,它是如何做的真正是个人品味的问题.研究Zend/etc有点灵感.不要局限于PHP!查看Ruby on Rails或iPhone的UIKit,两者都是MVC框架,比我所知道的任何PHP都要好,充满了借用的好技术. (2认同)
  • 一个好的开始是确保*every*table有一个专用于查询的"模型"类.并使用HTML模板(你可以使用PHP作为模板文件,但它们应该专门用于生成HTML而不包含比基本if语句更复杂的东西),然后你有一个"控制器"类谁的工作是绑定所有它在一起.他们不做任何数据库查询,也不打印任何HTML.在非常复杂的代码中,每个表可能有多个类,数十个甚至数百个控制器类和模板文件也可能将其部分工作推送到类中. (2认同)