我正在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仍然有效(如果我按下它重新加载日历div)。
以下是我的一些代码:
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行被保存和缓存一样,然后在下周的第二次按下时,它会调用旧的,然后调用新的...
答案 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函数生成网址。