0

私は Symfony2 の下でプロジェクトを行っています。同じコントローラー (履歴、カレンダー) で 2 つのアクションと 2 つのビューを取得しました。

私の履歴アクションは、今週のデフォルト値でカレンダー アクションを呼び出します。次に、それ自体がカレンダー ビューをレンダリングする履歴ビューをレンダリングします。

最初の質問、それは機能していますが、カレンダー HTML ビューの前に、symfony は文を追加しました:HTTP/1.0 200 OK Cache-Control: no-cache Date: Wed, 30 Jan 2013 10:17:13 GMTどうすればこの文を削除できますか?

これを行っているのは、calendar Controller (前週または翌週とは異なる) を呼び出してカレンダーを先週または来週にする 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 行がキャッチされ、しばらくの間キャッシュされているようなものです。つまり、来週初めて押すと、来週は問題ありません。2 回目は、firebug が 2 つの ajax リクエストを表示します。1 つは同じ週用で、もう 1 つは次の週用です。最初の JavaScript 行が保持されてキャッシュされていた場合、次の週の 2 回目のプレスで、古いものを呼び出し、次に新しいものを呼び出すようなものです...

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 用に編集: 小枝を使用して ajax 経由で JavaScript を変更することはできません。JavaScript でグローバル変数を定義し、必要なパラメーターを実行する必要があります。これらのグローバル変数は、ajax 応答を処理するときに JavaScript でアクセスできます。たとえば、小枝で次のことができます。

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

そして、ajax が応答を送信すると、globalMonth を更新し、次の ajax 呼び出しに使用します。

アルバン

于 2013-01-30T13:39:36.793 に答える
1

あなたのJSで何が起こっているのか知っていると思います。ajax 応答がある場合、おそらく nextWeek リンクのクリック イベントに新しいアクションをバインドします。しかし、そのアクションを追加する前に、あなたはしなければなりません

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

以前のバインドされたイベントを取り除くために。

于 2013-01-30T14:10:59.163 に答える
0

の代わりに、 2 番目のコントローラー$this->render()を呼び出します。$this->renderView()

Symfony をより有効に使用するには、コントローラーでパスまたは URL 関数を使用して URL を生成します。

于 2013-01-30T13:19:24.943 に答える