【问题标题】:How to Render a custom view with plugins in Zend Framework 2如何在 Zend Framework 2 中使用插件呈现自定义视图
【发布时间】:2013-02-25 18:31:08
【问题描述】:

我正在开发一个需要在流程完成后发送电子邮件的应用。由于电子邮件需要是 HTML,我有一个聪明的想法,就是将视图呈现为电子邮件正文,这样我就可以实现“单击此处在浏览器上查看”功能。这一切都在实现 AbstractRestfulController 的控制器内部进行,因此视图本身驻留在我的前端模块中,以便可以通过浏览器从 URL 访问它。但是我得到了一个

未提供 RouteStackInterface 实例

尝试渲染视图时出错。

这是我的代码:

use Zend\View\HelperPluginManager;
use Zend\View\Resolver;
use Zend\View\Renderer\PhpRenderer;

//Instantiate the renderer
$renderer = new PhpRenderer();
$resolver = new Resolver\TemplateMapResolver(array(
            'layout' => realpath(__DIR__ . '/../../../../Application/view/layout/email.layout.phtml'),
            'email/view' => realpath(__DIR__ . '/../../../../Application/view/application/email/view.phtml')
        )
    );
$renderer->setResolver($resolver);
$renderer->url()->setRouter($this->getEvent()->getRouter());

我在 API 文档中看到,您可以通过给它一个 RouteStackInterface 来将路由器设置为 URL 插件,因此是最后一行。但是,这似乎也不起作用。

我想使用相同的视图发送一封 HTML 电子邮件,其中包含邮件正文中的链接并通过 URL 显示在浏览器上。

关于如何做到这一点的任何想法/建议?

编辑/解决方案:

根据下面 dotwired 的回答,从服务管理器获取渲染器实例会导致插件被正确实例化。所以这是有效的代码:

module.config.php:

array('view_manager' => array(
            'template_map' => array(
                    'layout/email'            => __DIR__ . '/../../Application/view/layout/email.layout.phtml',
                    'email/share'             => __DIR__ . '/../../Application/view/application/email/share.phtml',
                    'email/view'              => __DIR__ . '/../../Application/view/application/email/view.phtml',
            ),
    ),
);

REST 控制器:

use Zend\View\Model\ViewModel;

//get the renderer
    $renderer = $this->getServiceLocator()->get('Zend\View\Renderer\RendererInterface');

    //Create the views
    $shareView = new ViewModel(array('data' => $data));
    $shareView->setTemplate('email/view');
    $emailLayout = new ViewModel(array('subject' => $this->_subject, 'content' => $renderer->render($shareView)));
    $emailLayout->setTemplate('layout/email');

    //Render the message
    $markup = $renderer->render($emailLayout);

使用服务管理器中的渲染器,$this->url() 视图助手可以正常工作。

【问题讨论】:

    标签: php model-view-controller zend-framework2


    【解决方案1】:

    只需使用模块的 module.config.php 来指定您的电子邮件模板,例如:

    'view_manager' => array(
        'template_path_stack' => array(
            'user' => __DIR__ . '/../view'
        ),
        'template_map' => array(
            'email/view' => __DIR__ . '/../view/application/email/view.phtml'
        )
    ),
    

    之后您可以继续使用文档中的this part。然后,您可以将视图模板从渲染器传递到 MimePart,MimeMessage 将使用该模板,例如

    $viewModel = new \Zend\View\Model\ViewModel();
    $viewModel->setTemplate('email/view');
    
    $renderer = $this->serviceLocator->get('Zend\View\Renderer\RendererInterface');
    $htmlPart = new \Zend\Mime\Part($renderer->render($viewModel));
    

    【讨论】:

    • 谢谢你。我会在接下来的几天里尝试一下,如果它有效,请告诉你。不幸的是,该应用程序将于明天到期,我们将不得不发布第 1 版并解决问题。
    猜你喜欢
    • 2014-10-23
    • 2012-07-08
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2012-06-19
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多