当前位置: 首页 > 面试题库 >

如何在JSON响应中呈现ZF2视图?

沈俊美
2023-03-14
问题内容

到目前为止,我已经想通了如何返回Zend框架2.首先一个典型的JSON响应,我加入ViewJsonStrategystrategies了部分view_manager配置。然后,ViewModel我返回一个JsonModel设置了所有变量的实例,而不是从控制器操作中返回实例。

现在,我已经弄清楚了这一点,我需要了解如何呈现视图并在该JSON响应中返回它。在ZF1中,我能够使用$this->view->render($scriptName),将HTML作为字符串返回。在ZF2中,该Zend\View\View::render(...)方法返回void

那么…如何呈现HTML视图脚本,并在一个请求中以JSON响应返回它?

这就是我现在所拥有的:

    if ($this->getRequest()->isXmlHttpRequest()) {
        $jsonModel = new JsonModel(...);

        /* @todo Render HTML script into `$html` variable, and add to `JsonModel` */
        return $jsonModel;
    } else {
        return new ViewModel(...);
    }

问题答案:

好吧,我想我终于明白了你在做什么。我找到了符合您条件的解决方案。尽管我确信仍有改进的空间,但仍有一些麻烦的工作要做…

public function indexAction()
{
  if (!$this->getRequest()->isXmlHttpRequest()) {
    return array();
  }

  $htmlViewPart = new ViewModel();
  $htmlViewPart->setTerminal(true)
               ->setTemplate('module/controller/action')
               ->setVariables(array(
                  'key' => 'value'
               ));

  $htmlOutput = $this->getServiceLocator()
                     ->get('viewrenderer')
                     ->render($htmlViewPart);

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

  return $jsonModel;
}

如您所见,我创建的templateMap令人讨厌……令人讨厌,我敢肯定它可以进行很多改进。
这是一个可行的解决方案,但不是一个干净的解决方案。也许可以以某种方式能够从ServiceLocator中获取其可能已经实例化的默认PhpRenderer及其模板和路径映射,然后它应该更干净。

由于@DrBeza的评论,需要做的工作可以减少很多。现在,正如我最初想要的那样,我们将在所有模板映射完好无损的情况下抓取viewrenderer,并直接渲染ViewModel。唯一重要的因素是您需要指定要渲染的完全合格的模板(例如:“
$ module / $ controller / $ action”)

我希望这会让您入门;)

PS:响应如下所示:

Object:
    html: "<h1>Hello World</h1>"
    jsonArray: Array[6]
    jsonVar1: "jsonVal2"


 类似资料:
  • 问题内容: 好的,很简单的问题,我正在使用一种AJAX方法,它的作用是通过查询在数据库中搜索特定信息。我可以在控制台中看到正在查询,甚至可以在Chrome开发者控制台中看到“发布”,当我单击它时,可以看到要显示的HTML,但是我不知道如何在页面中显示红外线。 :3000 /已经有我要显示的html,但是我该如何更新呢? 我展示的方式是这样的… @itemsok是我从查询保存项目的变量。 谢谢,我想

  • 问题内容: 假设您位于用户控制器中,并且想要获取显示请求的json响应,那么可以在您的views / users /目录中创建一个名为show.json的文件,并在用户之后#show操作完成后,它将呈现文件。 当前,您需要执行以下操作: 但是,如果您可以创建一个show.json文件,它会像这样自动呈现,那就太好了: 这将为我节省大量的痛苦,并且会消除我在控制器中渲染json时得到的那种可怕的肮脏

  • 问题内容: 我从文本区域得到了一些用户生成的html标记,我想在屏幕的另一部分上呈现它。标记将以字符串形式保存在组件的属性中。 由于明显的原因,我不想使用危险地设置HTML。是否有诸如标记为HTML 的解析器,以便它剥离脚本标记和其他无效的html。 问题答案: 使用sanitize-html模块对html进行清理,并使用危险地 SetInnerHTML呈现经过清理的字符串。 您可以创建一个简单的

  • 问题内容: 我需要我的控制器返回包含更新的HTML代码的AJAX JSON响应。 通过渲染JSP视图来创建更新的HTML代码。 例如:JSP: JSON响应: 目前,我正在尝试使用“我自己的”输出流创建一个虚拟响应,并将呈现的视图内容放入json响应中,但是没有运气。 除了我无法使用此解决方案的事实之外,感觉不对。有关正确方法的任何提示? 谢谢Ori 问题答案: 如果您要捕获的视图位于中,则调用

  • 问题内容: 如何在控制器的JsonResult中渲染要使用的局部视图? 问题答案: 是一种自定义扩展方法,将视图呈现为。 文章中没有提到它(您最初提到的是什么),但是您可以在文章附带的示例代码中找到它。可以在\ Helpers \ Reders.cs下找到它 这是有问题的方法的代码:

  • 问题内容: 我想使用Express.js将Jade模板的局部视图呈现给变量。 通常,您直接将局部视图呈现给响应对象: 但是,由于我在Socket.io服务器事件中,因此没有“响应”对象。 有没有一种优雅的方法可以在 不 使用响应对象的 情况下 将Jade部分视图呈现给变量? 问题答案: 您可以手动编译Jade模板。