2013-01-17 6 views
9

W ZF1 Użyłem poniższy kod, aby uczynić ciało mail:Jak renderować szablon wiadomości z układem w ZF2?

// 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(); 

Próbowałem wiele, ale nie mogę zrozumieć tę funkcję w ZF2. Mój aktualny kod jest taki. Ale używa standardowego układu i nie mogę go uzyskać w ciągu znaków.

public function mailAction() 
{ 
    $viewModel = new ViewModel(); 
    $viewModel->setTemplate("zhorty/test"); 
    $viewModel->setVariable('test', 'some value'); 
    return $viewModel; 
} 
+0

Z jakiego powodu potrzebujesz ** układu **? Zwykle renderowanie treści wiadomości e-mail z ** widokiem ** jest wystarczająco dobre. Układ (więc widok obejmujący inny widok) jest zbyt dobry dla wiadomości e-mail. –

+1

@Jurian Myślę, że ten układ jest dobrym miejscem do przechowywania nagłówka i stopki, takich jak logo i zastrzeżenie, które są takie same dla każdego e-maila. – Lauris

Odpowiedz

10

Dziękuję! Twoja odpowiedź mi pomogła!

Rozszerzyłem kod. Więc mogę również użyć szablonu układu.

$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); 
+0

ta odpowiedź nie jest kompletna, proszę przejrzyj moją odpowiedź, aby uzyskać pełny kod –

7

Moja odpowiedź opiera się na odpowiedzi user1986560 i How to Render a custom view with plugins in Zend Framework 2. Dodaję to, ponieważ myślę, że to trochę łatwiejsze do wdrożenia.

Mam układ wiadomości e-mail i różne pliki treści. Układ można ponownie wykorzystać i dodać różne pliki zawartości.

view/e-mail/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> 

view/e-mail/contact.phtml

<h1>Contact us email</h1> 
</ br> 
Name: <?= $this->name;?></ br> 
Email: <?= $this->email;?></ br> 
Message:<?= $this->message;?></ br> 

W modułach conf, dodać układ i zawartość różnych plików . Robiąc to w ten sposób, możesz użyć pomocników widoku.

module.config.php

'view_manager' => array(
    'template_map' => array(
     'email/layout' => __DIR__ . '/../view/email/layout.phtml', 
     'email/contact' => __DIR__ . '/../view/email/contact.phtml', 
    ), 

W swojej kontrolera/akcji:

// 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); 
-1

@ user1986560 odpowiedź nie jest pełna, bo trzeba potrzebują podstawowego pomocnika jak „URL "z routerem i czasami" basePath "również wymagane.

Oto pełna code -

$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); 

Mam nadzieję, że moja pomoc kogoś.

0

Dla Sendig e-maile polecam następujące module: https://github.com/WasabiLib/Mail

Moduł oparty jest na komunikacie ZF2 i jest skonfigurowany jako usługa. Musisz więc tylko zadzwonić do servicemanagera.

Metoda body jest w stanie obsłużyć viewModels ZF2.Zobacz przykład poniżej:

$mail = $this->getServiceLocator()->get("Mail"); 
$viewModel = new ViewModel(array('$yourVariable1' => 'yourContent1', $yourVariable2=>'yourContent2',...)); 
$viewModel->setTemplate("responsive"); 
$mail->setTo('[email protected]'); 
$mail->setBody($viewModel); 
$mail->send(); 

Jest dołączony do elastycznego szablonu wiadomości e-mail, który można dostosować. Musisz tylko dodać moduł do pliku application.config.php i jesteś gotowy do pracy.

Powiązane problemy