【问题标题】:zend framework 2, return the rendered contents of a view inside a JSON Modelzend 框架 2,返回 JSON 模型内视图的渲染内容
【发布时间】:2013-06-07 12:44:04
【问题描述】:

我正在尝试创建一个 JsonModel,其中包含当前渲染视图的变量“html”中的一个项目。我想将此代码添加到事件中: 而不是这种方法: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,但是不会用 json 覆盖普通的 HTML 视图,但是控制器方法中的相同代码(没有事件)会完美覆盖。

p.s 有没有更好的方法来完成整个概念?

p.p.s 如何在不使用 8 行代码的情况下从控制器中获取当前的视图模板?

提前致谢!

阿伯格罗夫

【问题讨论】:

  • 要获取当前模板,您应该能够运行$this->viewModel->getTemplate(); 我无法测试这个,但该方法确实存在于 ViewModel 类中,因此希望它将返回该方法的默认视图。同样,您可以通过 $this->viewModel->setTemplate("template/path/name.phtml");
  • 感谢 micb,$this->viewModel 在控制器中为 NULL,因此无法以这种方式检索模板。我认为只有在渲染 ViewModel 时才会查​​找/加载模板,所以在此之前我不确定模板属性是否存在。

标签: json view return zend-framework2


【解决方案1】:

您正在从事件中返回视图模型,我认为这对当前视图管理器视图模型没有任何影响,从视图管理器获取当前视图模型并调用 setTerminal(true)。或使用视图管理器替换创建的 jsonmodel

【讨论】:

  • 完美,感谢 Raj,现在功能是正确的,我可以大大减少这种方法。
猜你喜欢
  • 2012-06-09
  • 2012-09-02
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2018-04-05
  • 2016-02-08
相关资源
最近更新 更多