В ZF1 я использовал следующий код для отображения тела почты:
// View erstellen $view = new Zend_View(); // Layout erstellen $layout = new Zend_Layout(); // HelperPath muss hier nochmals übergeben werden da es ein neues View Objekt ist. $view->addHelperPath('Own/View/Helper', "Own_View_Helper_"); // ViewScript $view->setScriptPath(APPLICATION_PATH . '/views/scripts/emails/'); // LayoutPath $layout->setLayoutPath(APPLICATION_PATH . '/layouts/scripts/'); $layout->setLayout('layoutMail'); $layout->setView($view); foreach ($assigns as $key => $value) { $view->assign($key,$value); } $layout->content = $view->render($templateName); return $layout->render();
Я много пробовал, но я не могу реализовать эту функцию в ZF2. Мой фактический код – это. Но он использует стандартный макет, и я не могу получить его в строке.
public function mailAction() { $viewModel = new ViewModel(); $viewModel->setTemplate("zhorty/test"); $viewModel->setVariable('test', 'some value'); return $viewModel; }
Спасибо! Ваш ответ помог мне!
Я продлил код. Поэтому я могу использовать шаблон макета.
$view = new \Zend\View\Renderer\PhpRenderer(); $resolver = new \Zend\View\Resolver\TemplateMapResolver(); $resolver->setMap(array( 'mailLayout' => __DIR__ . '/../../../../Application/view/layout/layout-mail.phtml', 'mailTemplate' => __DIR__ . '/../../../view/zhorty/test.phtml' )); $view->setResolver($resolver); $viewModel = new \Zend\View\Model\ViewModel(); $viewModel->setTemplate('mailTemplate') ->setVariables(array( 'test' => 'AlloVince' )); $content = $view->render($viewModel); $viewLayout = new \Zend\View\Model\ViewModel(); $viewLayout->setTemplate('mailLayout') ->setVariables(array( 'content' => $content )); echo $view->render($viewLayout);
Мой ответ основан на ответе user1986560 и « Как визуализировать пользовательский вид с плагинами в Zend Framework 2» . Я добавляю это, поскольку я думаю, что это делает вещи немного легче реализовать.
У меня есть макет электронной почты и разные файлы содержимого. Макет может быть повторно использован, и добавлены разные файлы содержимого.
просмотр / электронная почта / layout.phtml
<table> <tr><td><img src="header.png" /></td></tr> <tr><td><?= $this->content; ?></td></tr> <tr><td><img src="footer.png" /></td></tr> </table>
просмотр / электронная почта / contact.phtml
<h1>Contact us email</h1> </ br> Name: <?= $this->name;?></ br> Email: <?= $this->email;?></ br> Message:<?= $this->message;?></ br>
В ваших модулях conf добавьте макет и разные файлы содержимого. Таким образом, вы можете использовать помощники вида.
module.config.php
'view_manager' => array( 'template_map' => array( 'email/layout' => __DIR__ . '/../view/email/layout.phtml', 'email/contact' => __DIR__ . '/../view/email/contact.phtml', ),
В вашем контроллере / действии :
// View renderer $renderer = $this->getServiceLocator()->get('Zend\View\Renderer\RendererInterface'); // Email content $viewContent = new \Zend\View\Model\ViewModel( array( 'name' => $name, 'email' => $email, 'message' => $message, )); $viewContent->setTemplate('email/contact'); // set in module.config.php $content = $renderer->render($viewContent); // Email layout $viewLayout = new \Zend\View\Model\ViewModel(array('content' => $content)); $viewLayout->setTemplate('email/layout'); // set in module.config.php // Email $html = new MimePart($renderer->render($viewLayout)); $html->type = 'text/html'; $body = new MimeMessage(); $body->setParts(array($html)); $message = new \Zend\Mail\Message(); $message->setBody($body);
Надеюсь, одно из моих сообщений в блоге поможет вам, это о том, как использовать Zend \ View как шаблон в Zend \ Mail и добавлять вложения в ZF2
Это написано китайцами, но я думаю, что просто прочитать код достаточно ясно. Также вы можете прочитать его с помощью перевода Google
Для писем sendig я рекомендую следующий модуль: https://github.com/WasabiLib/Mail
Модуль основан на сообщении ZF2 и настроен как служба. Поэтому вам нужно только позвонить сержанту.
Метод body способен обрабатывать модели представления ZF2. См. Пример ниже:
$mail = $this->getServiceLocator()->get("Mail"); $viewModel = new ViewModel(array('$yourVariable1' => 'yourContent1', $yourVariable2=>'yourContent2',...)); $viewModel->setTemplate("responsive"); $mail->setTo('recipient@domain.com'); $mail->setBody($viewModel); $mail->send();
Он поставляется с гибким шаблоном электронной почты, который вы можете настроить. Вам нужно только добавить модуль в application.config.php, и вы готовы к работе.
@ user1986560 ответ не является полным, потому что вам необходим базовый помощник, такой как «url» с маршрутизатором, а иногда также требуется «basePath».
Вот полный код –
$myApp=Zend\Mvc\Application::init(require 'config/application.config.php'); $sm=$myApp->getServiceManager(); $view=new \Zend\View\Renderer\PhpRenderer(); $view->getHelperPluginManager()->setServiceLocator($sm); $basePathX='/your-folder-from-where-you-want-to-run'; $request=$myApp->getRequest(); if($request instanceof \Zend\Http\PhpEnvironment\Request){ #die($request->getBasePath()); $basePathX=$request->getBasePath(); } $basePath1=explode('/', $basePathX); /* please fix this path as your requirement */ array_pop($basePath1); $bsPath=implode('/', $basePath1).'/'; /* following line will fix your router path, it is important */ $myApp->getMvcEvent()->getRouter()->setBaseUrl($bsPath); $basePath=new \Zend\View\Helper\BasePath(); $basePath->setBasePath($bsPath); $view->getHelperPluginManager()->setService('basePath', $basePath); $urlHlpr=new \Zend\View\Helper\Url(); $urlHlpr->setRouter($myApp->getMvcEvent()->getRouter()); $view->getHelperPluginManager()->setService('url', $urlHlpr); $resolver=new \Zend\View\Resolver\TemplateMapResolver(); $resolver->setMap(array( 'wmsLayout' => APP_ROOT_PATH . 'module'.DS.'YourModule'.DS.'view'.DS.'layout'.DS.'layout1.phtml', 'layout/left-menu' => APP_ROOT_PATH . 'module'.DS.'YourModule'.DS.'view'.DS.'layout'.DS.'left-menu.phtml', )); $view->setResolver($resolver); $viewModel = new \Zend\View\Model\ViewModel(); $tmpltFileToLoad=__DIR__ . DS.'your-file-to-render.phtml'; $tmpltIdx='_'.md5($tmpltFileToLoad); $resolver->add($tmpltIdx, $tmpltFileToLoad); $viewModel->setTemplate($tmpltIdx)->setVariables(array( 'test' => 'shahadat hossain khan' )); $content=$view->render($viewModel); $viewLayout = new \Zend\View\Model\ViewModel(); $viewLayout->setTemplate('wmsLayout')->setVariables(array( 'content' => $content, 'anyOtherVariableForLayout'=>'layout variable value', )); echo $view->render($viewLayout);
Надеюсь, что это моя помощь.