0

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

大家好,

我正在尝试在 symfony 中使用 pjax 以加快我们的网站速度(我们将能够在大多数情况下保持页眉和页脚静态,并避免重新加载大量 css/js 和其他文件)。

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

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

    mySfActions 扩展了 sfActions

    moduleActions 扩展了 mySfActions

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

4

3 回答 3

1

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

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

这将跳过模板调用。

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

于 2011-07-13T15:13:13.887 回答
0

没有什么可以做的。

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

您需要将所有“静态”资产和 html 放入布局中,仅此而已。

于 2011-07-13T17:01:43.487 回答
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 上)

于 2011-07-27T10:39:36.650 回答