【问题标题】:Using View Templates in Emails. How to more easily apply templates?在电子邮件中使用视图模板。如何更轻松地应用模板?
【发布时间】:2013-04-08 11:11:03
【问题描述】:

我已经能够加载视图模板并使用它来创建电子邮件正文。代码类似于这里的答案: How to render a mail template with layout in ZF2?

但现在我希望获取此代码并将其移动到一个模块中,以帮助我的应用程序的其余部分发送电子邮件。我想我想让所有电子邮件的视图尽可能简单/透明。

所以基本问题是,如何设置代码以接受渲染模板和发送电子邮件所需的信息?

我已经在服务定位器中保存了我的运输信息,并且可以正常发送电子邮件。我主要关心的是模板解析器所需的凌乱代码:

$view = new PhpRenderer();
$resolver = new TemplateMapResolver();
$resolver->setMap(array(
                'mail' => __DIR__ . '/../../../view/communication/email/new-project.phtml'
        ));
$view->setResolver($resolver);

我可以将所有 *.phtml 用于保存在新模块中的电子邮件。无需在应用程序之外发送临时电子邮件(我们使用应用程序内部的通信)。

有没有办法使用module.config.php 'view_manager' => 'template_map' 并绕过创建new resolver() 的需要?在这种情况下,我可以设置电子邮件代码以接受应该在其中的命名模板地图。

'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout'             => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index'   => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'                 => __DIR__ . '/../view/error/404.phtml',
            'error/index'               => __DIR__ . '/../view/error/index.phtml',
        ),

【问题讨论】:

    标签: php zend-framework2


    【解决方案1】:

    您只需通过ServiceManager 访问默认的viewrenderer

     $viewRenderer = $this->getServiceLocator()->get('viewrenderer');
    
     $mailView = new ViewModel();
     $mailView->setTemplate('my-namespace/controller/mailtemplate.phtml');
    
     $mailView->setVariables(array(
        //k=>v paired data
     ));
    
     $renderedOutput = $viewRenderer->render($mailView);
    
     $mail->setBody($renderedOutput);
    

    差不多就是这样。显然,尽管从这个示例中删除了具体的邮件处理,但鉴于您的描述,您主要关注的是另一个问题。

    【讨论】:

    • 这对渲染器肯定有帮助。如果此代码在模型而不是控制器中,并且正在从另一个模块中调用,我需要做什么才能在 setTemplate() 中引用正确的模板?
    • 好吧,无论如何,模板通常都可以在每个模块的基础上使用,所以我认为只要模块设置正确,您就不必担心添加视图-模型中的路径。要从您的模型访问视图渲染器,请将ViewRenderer 注入您的模型或注入ServiceManager
    • 模型使用ServiceLocatorAwareInterface,但问题是我的 Communication 模块应该保存电子邮件的模板,但如果我尝试使用 Application 模块,我可以访问正确的模板吗?附:我在测试和询问的同时。
    • 看起来我的最后一条评论不是问题,从不同的模块运行模型代码仍然让我使用通信模块中的模板。谢谢。
    猜你喜欢
    • 2011-03-26
    • 2023-03-31
    • 1970-01-01
    • 2011-05-21
    • 2012-05-17
    • 2010-12-18
    • 1970-01-01
    • 2012-11-22
    • 2017-11-15
    相关资源
    最近更新 更多