1

これがZF2のバグなのか、それともよくわからないだけなのかはわかりませんが、なぜこれが起こっているのか非常に興奮しています.

Dispatch イベントを添付して、各モジュールのレイアウトをグローバルに変更するソリューションを使用しています。(たとえばhttp://framework.zend.com/manual/2.1/en/modules/zend.view.quick-start.html#dealing-with-layouts、最後の例から)

それはうまくいっていますが、問題は、あるアクションでsetTerminate(true);したいときです。(Ajax 呼び出しの場合)コントローラー/アクションテンプレートのコンテンツのみを表示するのではなく、コンテンツのないレイアウト テンプレートのみを表示します。そして、それは私が期待していないことです。

これは、これをシミュレートする方法であり、ディスパッチ関数でレイアウトを設定し(イベントを添付する代わりに、よりクリーンにする)、コントローラーのアクションで setTerminate します。

public function dispatch(Request $request, Response $response = null)
{
    parent::dispatch($request, $response);
    $this->layout('layout/new');
}   

public function indexAction()
{
    $model = new ViewModel();
    $model->setTerminal(true);
    return $model;
}

繰り返しますが、これはコントローラー/インデックステンプレートのコンテンツのみを表示することを期待していますが、その代わりに、コンテンツのないレイアウト/新規のコンテンツのみを表示します。

レイアウトを実際に設定しようとしましたが、期待どおりに機能しました。

public function indexAction()
{
    $this->layout('layout/new');

    $model = new ViewModel();
    $model->setTerminal(true);

    return $model;
}

これは機能しています。コントローラ/インデックステンプレートのコンテンツのみが表示され、レイアウトは表示されません。

したがって、各コントローラーのレイアウトをグローバルに (dispatch イベントをアタッチすることにより) 変更する場合、これらのコントローラーの 1 つを Ajax 呼び出しに使用して setTerminate を使用するまで機能します。

助けてくれてありがとう。

4

2 に答える 2

2

ビューモデルを端末としてマークすると、ディスパッチイベントのリスナーは、レイアウトビューモデルを返されたビューモデルに置き換えます。

$this->layout('layout/new');ビューモデルのテンプレートを変更しています。

あなたがすべきことは、リスナーをアタッチすることです。たとえば、コントローラー自体から:

protected function attachDefaultListeners()
{
    //do not forget to call parent
    parent::attachDefaultListeners();

    $events = $this->getEventManager();
    //attach before action
    $events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'changeLayout'), 10);
}

public function changeLayout(MvcEvent $event)
{
    $this->layout('layout/new');
}

これでコントローラーのレイアウトが設定されますが、アクションから変更することができsetTerminal()、期待どおりに動作します

于 2014-01-29T20:11:50.973 に答える
0

アクション ビュー ファイルのコンテンツのみを表示する場合は、このアプローチを問題なく使用できます。

1) ajax 呼び出し用に新しいレイアウトを作成します。これは、layout.phtml を置き換えます

アプリケーション/レイアウト/ajax-layout.phtml

<?php echo $this->content ?>

2) アクションを変更して、Ajax 呼び出し中にデフォルトのレイアウトをオーバーライドする

コントローラー/アクション内:

// Don't render base layout if Ajax call
if($this->getRequest()->isXmlHttpRequest()) {
    $this->layout('application/layout/ajax-layout');
}

$model = new ViewModel();
return $model;

これはあなたのアクションコンテンツをレンダリングし、ベースレイアウトをオーバーライドします:)

于 2013-03-15T11:38:39.753 に答える