2

現在レンダリングされているビューを含む変数 'html' の項目で JsonModel を作成しようとしています。このメソッドではなく、このコードをイベントに追加したいと思います: How to render ZF2 view within JSON response? コントローラーにあるので、イベントに移動してプロセスを自動化したい

私のmodule.config.phpに戦略があります:

   'strategies' => array(
        'ViewJsonStrategy',
    )

コントローラーに setEventManager を設定しました。

    $events->attach(MvcEvent::EVENT_RENDER, function ($e) use ($controller) {
        $controller->setRenderFormat($e);
    }, -20);

これを添付するのに最適なイベントはありますか? RENDER_EVENTの方が良いでしょうか?

ここで、!$this->getRequest()->isXmlHttpRequest() に基づいてページのレンダリングを変更したいと思います (デバッグ用にコメントアウトされています)。

public function setRenderFormat($e)
{
    //if(!$this->getRequest()->isXmlHttpRequest())
    //{
    $controller = $e->getTarget();
    $controllerClass = get_class($controller);

    //Get routing info
    $controllerArr = explode('\\', $controllerClass);
    $currentRoute = array(
        'module' =>  strtolower($controllerArr[0]),
        'controller' => strtolower(str_replace("Controller", "", $controllerArr[2])),
        'action' => strtolower($controller->getEvent()->getRouteMatch()->getParam('action'))
    );
    $view_template = implode('/',$currentRoute);

    $viewmodel = new \Zend\View\Model\ViewModel();
    $viewmodel->setTemplate($view_template);
    $htmlOutput = $this->getServiceLocator()->get('viewrenderer')->render($viewmodel, $viewmodel);


    $jsonModel = new JsonModel();
    $jsonModel->setVariables(array(
        'html' => $htmlOutput,
        'jsonVar1' => 'jsonVal2',
        'jsonArray' => array(1,2,3,4,5,6)
    ));

    return $jsonModel;
    //}

}

奇妙なことに、(またはそうではない) このコードは機能し、$jsonModel を生成しますが、通常の HTML ビューを json で上書きしませんが、コントローラー メソッド内の同じコード (イベントなし) は完全に上書きします。

ps コンセプト全体を実行するためのより良い方法はありますか?

pps 8 行のコードに頼らずに、コントローラー内から現在のビュー テンプレートを取得するにはどうすればよいですか?

前もって感謝します!

アボグローブ

4

1 に答える 1

1

イベントからビュー モデルを返しています。これは現在のビュー マネージャー ビュー モデルでは何の効果もないと思います。ビュー マネージャーから現在のビュー モデルを取得し、setTerminal(true) を呼び出します。または、viewmanager を使用して作成された jsonmodel を置き換えます

于 2013-06-08T04:17:02.593 に答える