【问题标题】:Symfony2 Controller,View and JavaScriptSymfony2 控制器、视图和 JavaScript
【发布时间】:2013-01-30 10:29:32
【问题描述】:

我在 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。

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

【问题讨论】:

    标签: php javascript symfony controller twig


    【解决方案1】:

    您可以使用 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 calendar 的处理方式,它运行良好。

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

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

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

    阿尔班

    【讨论】:

    • 我这样修改我的控制器:
    • $return=$this-&gt;renderView('CDUserBundle:Default:prof_calendrier.html.twig', array( 'next_cours' =&gt; $nextCours, 'today' =&gt; date('D'), 'nextWeek' =&gt; $nextWeek, 'lastWeek' =&gt; $lastWeek, 'datesWeek' =&gt; $datesWeek )); return new Response($return,200,array('Content-Type'=&gt;'text/html')); 它以更好的方式工作。我刚刚遇到一个问题,当我按下下一个/上周按钮时,我看到,对于萤火虫,JS 没有发送一个 ajax 请求,但很多(有时像 5 个或更多)。为什么?
    • 而firebug仍然没有在源代码中显示javascript...为什么?
    • 也许您应该尝试为 nextWeek 和 lastWeek 按钮使用 id 而不是类。我还看到您正在使用日历课程。你有不止一个日历在玩吗?
    • 不,所以我全部改成ID。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在您的第二个控制器中调用 $this-&gt;renderView() 而不是 $this-&gt;render()

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

      【讨论】:

      • 当我使用 renderView 而不是 render 时,symfony 给我回电一个错误“控制器必须返回响应” 为了避免 HTTP 消息,我的历史操作不再调用日历。我在历史视图上放了一些 ajax init,他们询问日历操作并显示日历视图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多