現在レンダリングされているビューを含む変数 '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 行のコードに頼らずに、コントローラー内から現在のビュー テンプレートを取得するにはどうすればよいですか?
前もって感謝します!
アボグローブ