0

我在 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。我在萤火虫中再也看不到JS了。但是(这是最奇怪的部分),JavaScript 仍然有效(如果我按下按钮它会重新加载日历 div)。

这是我的一些代码:

日历.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。

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

4

3 回答 3

2

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

use Symfony\Component\HttpFoundation\Response;

然后构建您的“html”变量响应并像这样发送它:

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

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

这就是我使用Symfony2 日历的方式,它运行良好。

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

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

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

阿尔班

于 2013-01-30T13:39:36.793 回答
1

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

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

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

于 2013-01-30T14:10:59.163 回答
0

而不是$this->render(),调用$this->renderView()你的第二个控制器。

为了更好地使用 Symfony,请使用控制器中的路径或 url 函数来生成 url。

于 2013-01-30T13:19:24.943 回答