我使用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侦听器)组装视图时,基本路径助手正常工作。在我看来,当我手动实例化一个新的渲染器时,它正在获取它自己的视图助手插件管理器实例,而这个实例缺少默认配置。所以,这里有几个问题:
每次实例化渲染器时我都可以手动设置基本路径,但我认为必须有更优雅的方式。例如,我可以共享现有的视图助手插件管理器实例吗?
答案 0 :(得分:2)
假设您的电子邮件是由特定模块发送或由特定模块发送的,您可以在特定module.config的view_manager键中设置默认的basePath,如下所示:
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);
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
);
}
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;