42


18

Zendのドキュメンテーションはこれに関してはっきりしていません。

問題は、デフォルトではZendが各コントローラアクションの最後に自動的にビューをレンダリングすることです。 あなたがレイアウトを使用しているなら - そしてなぜあなたはそうしないのですか? それもレンダリングします。 これは通常のWebページには問題ありませんが、AJAXレスポンスを送信しているときは、それだけではありません。 Zendがアクションごとに自動レンダリングするのを防ぐにはどうしますか?

3 Answer


92


AJAX応答を送信しようとしているアクションから、このコードを呼び出します。

$ this  - > _ helper-> layout-> disableLayout(); $ this  - > _ helper-> viewRenderer-> setNoRender(TRUE);

これにより、そのアクションのレイアウトエンジンが無効になり、そのアクションの自動ビューレンダリングが無効になります。 通常のビューやレイアウトのことを気にせずに、AJAXの出力を「エコー」するだけで、乗ることができます。


18


あなたのAJAXがJSONを返している場合は、JSONアクションヘルパーを使用できます。

$ this  - > _ helper-> json($ data);

このヘルパーはあなたの$データを `json_encode`し、それをJSONヘッダで出力してやっと死ぬので、レイアウトやビューをレンダリングせずにアクションからきれいなJSONが返されます。

f.e. 私はajaxのためだけに異なるアクションのための複数のACLチェックを避けるためにアクションの始めにこの構造を使っています

パブリック関数photosAction(){

if($ this-> getRequest() - > getQuery( 'ajax')== 1 || $ this-> getRequest() - > isXmlHttpRequest()){$ params = $ this-> getRequest()→getParams( ; $ result = false;

switch($ params ['act']){case 'deleteImage'://何かを削除しています... $ result = true; //ブレイク

デフォルト:$ result = array( 'error' => '無効なアクション:'。 $ params ['act']);ブレーク; }

$ this  - > _ helper-> json($ result); }

// regular action code here
...
}


-2


あるいは、単にアクションの最後にdie()関数を追加することもできます。

パブリック関数someAction(){echo json_encode($ data);} die(); }