Symfony2控制器,视图和JavaScript

时间:2013-01-30 10:29:32

标签: php javascript symfony controller twig

我正在Symfony2下做一个项目。 我在同一个控制器(历史,日历)和两个视图中有两个动作。

我的历史操作调用日历操作,默认值为本周。 然后它呈现历史视图,它自己呈现日历视图。

第一个问题,它的工作原理,但在日历HTML视图之前,symfony添加了一个句子:HTTP/1.0 200 OK Cache-Control: no-cache Date: Wed, 30 Jan 2013 10:17:13 GMT我该如何删除这句话?

我这样做,因为我有一些JavaScript链接,通过调用日历控制器(上一周或下周不同)使日历在上一周或下周进行,并在他的div中打印新日历。 它有点工作,但我有一些奇怪的行为。我已将JavaScript代码放在日历视图中。我第一次加载页面JavaScript显示在代码源中,并工作。 如果我按上一个或下一个按钮,日历控制器会返回我的日历新视图但没有javascript。我不能再在firebug中看到JS了。但是(这是最奇怪的部分),JavaScript仍然有效(如果我按下它重新加载日历di​​v)。

以下是我的一些代码:

calendar.html.twig:

<script type="text/javascript">
$('.nextWeek').live('click', function () {
    $.ajax({
        url: 'prof_calendrier/{{ nextWeek }}',
        success: function (html) {$('.calendrier').html(html);}
    });
});
$('.lastWeek').live('click',function () {
    $.ajax({
        url: 'prof_calendrier/{{ lastWeek }}',
        success: function (html) {$('.calendrier').html(html);}
    });
});
</script>
<p>Week from {{datesWeek.0}} to {{datesWeek.6}}</p>
[...] display rest of informations

prof_calendrierAction(日历操作):

public function prof_calendrierAction ($date) {
        $erreur='';
        $message='';
        $session = $this->container->get('session');

        [...] // lot of operations

    return $this->render('CDUserBundle:Default:prof_calendrier.html.twig', array(
        'next_cours' => $liste_prochains_cours,
        'today' => date('D'),
        'nextWeek' => $nextWeek,
        'lastWeek' => $lastWeek,
        'datesWeek' => $datesWeek
    ));
}

有人能帮帮我吗?*

编辑:为避免HTTP消息,我的历史操作不再调用日历操作。我渲染了历史性的,在历史的观点中,我得到了ajax init,他将在今天的一周检查日历操作。但是当我用上一周或下周按钮刷新JavaScript时,html会发生变化,但JavaScript不会更新。 JavaScript是在日历视图中编写的,因此为什么日历操作不会比第一次更多地返回JS。

Edit²:我做了几次测试。我的上/下周的JavaScript按钮位于日历视图中。这就像是在这个视图中编写的所有JS行都被捕获并缓存了一段时间。我的意思是我第一次按下周,它显示下周没有问题。第二次,萤火虫向我展示了两个ajax请求,一个是同一周,一个是后一个。就像第一个JavaScript行被保存和缓存一样,然后在下周的第二次按下时,它会调用旧的,然后调用新的...

3 个答案:

答案 0 :(得分:2)

您可以使用Symfony的响应组件从控制器发送特定响应。添加

use Symfony\Component\HttpFoundation\Response;

然后构建你的“html”变量响应并发送它:

return new Response($return,200,array('Content-Type'=>'application/json'));

这里,$ return是一个json实体。 200是响应的状态代码,'Content-Type'=&gt;'application / json'必须与$ return的类型匹配。

这就是我对Symfony2 calendar的处理方式,效果很好。

编辑JS:您无法使用twig通过ajax更改您的JavaScript。您应该在javascript中定义全局变量,并按照您需要的任何参数进行操作。当您处理ajax响应时,可以在javascript中访问这些全局变量。例如,你可以在树枝上做:

<script>
var globalMonth = {{ month }}; // set up the starting month
...

然后当ajax发送响应时,您更新globalMonth并将其用于下一个ajax调用。

阿尔

答案 1 :(得分:1)

我想我知道你的JS发生了什么。 当您有ajax响应时,您可能会将新操作绑定到nextWeek链接上的click事件。但在添加该操作之前,您必须执行

$('#nextWeek').unbind();

为了摆脱以前的绑定事件。

答案 2 :(得分:0)

而不是$this->render(),请在第二个控制器中调用$this->renderView()

为了更好地使用Symfony,请使用控制器中的path或url函数生成网址。