ZF2:如何设置basePath视图助手的基本路径

时间:2014-03-14 04:58:01

标签: php zend-framework2

我使用phpRenderer呈现的phtml模板作为我的电子邮件正文。这个工作正常,直到最近我开始使用basePath()视图帮助程序出错。

我认为在我将框架升级到2.2.6之后问题就开始了,但我无法确定。

以下是我为电子邮件正文配置视图的方法:

$paths = array(__DIR__ . '/../../../view/std-email/');
$resolver = new \Zend\View\Resolver\TemplatePathStack(array('script_paths' => $paths));

$renderer = new \Zend\View\Renderer\PhpRenderer();
$renderer->setResolver($resolver);

$view = new \Zend\View\Model\ViewModel(array(...));
$view->setTemplate($this->template)->setTerminal(true);
$this->mail->setBody($renderer->render($view));

在视图脚本中,我只是回显$this->basePath(),这就是异常发生的地方。它表示未设置基本路径,即使我在模块配置的view_manager部分下硬编码基本路径。

当以正常方式(即通过控制器上的MVC侦听器)组装视图时,基本路径助手正常工作。在我看来,当我手动实例化一个新的渲染器时,它正在获取它自己的视图助手插件管理器实例,而这个实例缺少默认配置。所以,这里有几个问题:

  • 还有其他人遇到过这个问题吗?
  • 它与框架的版本有关吗?
  • 解决问题的最佳方法是什么?

每次实例化渲染器时我都可以手动设置基本路径,但我认为必须有更优雅的方式。例如,我可以共享现有的视图助手插件管理器实例吗?

2 个答案:

答案 0 :(得分:2)

假设您的电子邮件是由特定模块发送或由特定模块发送的,您可以在特定module.config的view_manager键中设置默认的basePath,如下所示:

module.config.php

return  array
        (
            'controllers'       =>  array(...),
            'router'            =>  array(...),
            'view_manager'      =>  array
                                    (
                                        'base_path'           => 'http://local.yourproject.com',
                                        'template_map'        => array(...),
                                        'template_path_stack' => array(...),
                                    ),
       );

但是,鉴于Kim的评论,问题可能是你传递给setBody方法的问题之一。您可以尝试使用MimePart对象的部件传递MimeMessage对象。其内容将来自模块中设置的模板,因此受制于设置的基本路径:

$EmailTemplate      =   new EmailUtility();
$emailContent       =   $EmailTemplate->getEmailTemplate
                        (
                            'identifier-for-your-email-template', 
                            $emailTemplateArrayOptions
                        );

$templateRenderer   =   $this->getServiceLocator()->get('ViewRenderer');
$emailHTMLContent   =   $templateRenderer->render
                        (
                            $emailContent['html'], 
                            $emailContent['templateVariables']
                        );
$emailTextContent   =   $templateRenderer->render
                        (
                            $emailContent['text'], 
                            $emailContent['templateVariables']
                        );

// Create HTML & Text Headers
$emailHTMLHeader        =   new MimePart($emailHTMLContent);
$emailHTMLHeader->type  =   "text/html";

$emailTextHeader        =   new MimePart($emailTextContent);
$emailTextHeader->type  =   "text/plain";

$emailBody              =   new MimeMessage();
$emailBody->setParts(array($emailTextHeader, $emailHTMLHeader,));

// instance mail
$mail   =   new Mail\Message();
$mail->setBody($emailBody);

EmailUtility-> getEmailTemplate(...)

的内容
public function getEmailTemplate($emailIdentifier, $emailVariables)
{
    switch($emailIdentifier)
    {
        case 'identifier-for-your-email-template' : 
            // logic for required template vars goes here
            $emailTextLink = 'module/config/specific/mapping/text';
    $emailHTMLLink = 'module/config/specific/mapping/html';
    $emailSubject       =   'Verify Your Email Address';
    $templateVariables  =   array(...);
    break;
    }

    return  array
            (
                'text'              =>  $emailTextLink,
                'html'              =>  $emailHTMLLink,
                'subject'           =>  $emailSubject,
                'templateVariables' =>  $templateVariables
            );
}

然后再次在你的module.config.php

    return  array
        (
            'controllers'       =>  array(...),
            'router'            =>  array(...),
            'view_manager'      =>  array
                                    (
                                        'base_path'           => 'http://local.yourproject.com',
                                        'template_map'        => array
                                        (
                                            // Email Templates
                                            'module/config/specific/mapping/html'  =>  __DIR__ . '/../view/module/config/specific/template-html.phtml', 
                                            'module/config/specific/mapping/text'  =>  __DIR__ . '/../view/module/config/specific/template-text.phtml',                                                                                               ),
                                        'template_path_stack' => array(...),
                                        ),
       );

答案 1 :(得分:1)

如果您正在使用Zend Framework 2的完整MVC堆栈,则会自动设置basePath。但是,如果您不需要手动设置帮助程序,请执行以下操作:

$helper = new BasePath();
$helper->setBasePath('/my/base/path');

echo $helper;