web-dev-qa-db-ja.com

AJAX=応答を送信するときにZend Frameworkがビュー/レイアウトをレンダリングしないようにするにはどうすればよいですか?

Zendのドキュメントは、これについては本当に明確ではありません。

問題は、デフォルトでは、Zendが各コントローラーアクションの最後にビューを自動的にレンダリングすることです。レイアウトを使用している場合-なぜそうしないのですか? -それもレンダリングします。これは通常のWebページでは問題ありませんが、AJAX応答を送信するときは、そのすべては必要ありません。Zendがアクションごとに自動レンダリングしないようにする方法基礎?

42
Don Jones

AJAX応答を送信する予定のアクションが何であれ、その内部からこのコードを呼び出します。

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

これにより、そのアクションのレイアウトエンジンが無効になり、そのアクションの自動ビューレンダリングがオフになります。その後、通常のビュー/レイアウトの要素が乗車のために送信されることを心配することなく、AJAX出力を希望するものは何でも「エコー」できます。

92
Don Jones

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

$this->_helper->json($data);

このヘルパーはjson_encodeあなたの$ dataをJSONヘッダーで出力し、ついに死ぬので、レイアウトとビューのレンダリングなしでアクションから返されるクリーンなJSONを取得します。

f.e.私はさまざまなアクションのための複数のACLチェックをajaxのために回避するために、アクションでこの構造を使用しています

public function photosAction() {

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

     switch ($params['act']) {
        case 'deleteImage':
           //deleting something
           ...
           $result = true; //ok
           break;

        default :
           $result = array('error' => 'Invalid action: ' . $params['act']);
           break;
      }

    $this->_helper->json($result);
}

// regular action code here
...
}
18