Symfony 1.4和pjax(ajax pushstate)?

时间:2011-07-13 13:49:06

标签: ajax symfony1 pushstate pjax

symfony:http://www.symfony-project.org pjax:https://github.com/defunkt/jquery-pjax

大家好,

我正在尝试在symfony中使用pjax来加速我们的网站(我们将能够在大多数时间保持页眉和页脚静态,并且还避免重新加载大量的css / js和其他文件)。 / p>

我对ajax或symfony没有问题,但我想知道是否有更好的方法:

  1. 使用postExecute立即返回html代码是一个好主意,而无需转到模板
  2. 如果是这样,我可以以某种方式只为所有模块写一次吗?我想我能做到:

    mySfActions扩展了sfActions

    moduleActions扩展了mySfActions

  3. 我想知道是否有更好的方法? 3.有没有办法在控制器/动作中获取当前布局名称(在模块的view.yml中定义)?

3 个答案:

答案 0 :(得分:1)

问题1:不要像这样使用后执行。如果您需要在操作中从ajax调用返回html,那么您的操作应该返回如下:

return $this->renderText("<p>Your html result.</p>");

这将跳过模板调用。

问题2:这是正确的。您已经编写了一次编写函数的最佳方法,并将其用于所有模块操作。

答案 1 :(得分:0)

无所事事。

通过XmlHttpRequest调用动作时,symfony会自动跳过布局渲染,只返回模块渲染。

您需要将所有“静态”资源和html放在布局中,这就是全部。

答案 2 :(得分:0)

谢谢大家帮助我,你的所有答案都很有帮助,并指出了正确的方向。我想投票给两个答案,但由于我只能接受一个,我接受了第一个答案。

无论如何,这就是我所做的:

首先,我扩展了sfActions类,所以我不必在每个模块上添加preExecute:

<?php 

class mySfActions extends sfActions{
    public function preExecute(){
        $request = $this->getRequest(); 
        if ($request->getParameter('_pjax')) {
            $this->setLayout(false);
        }       
    }
}

当然,我的每个模块动作类都必须扩展这个新类。

在我的个人模板中,我有类似的内容:

<?php if($sf_request->getParameter('_pjax')):?>
         <script type="text/javascript" src="/js/question_list.js"></script>
<?php endif;?>

这对我来说似乎运行得很好,我很享受支持pushstate时令人难以置信的加载速度,并且当它不支持时仍然能够回退(例如,在愚蠢的IE上)