2010-01-20 105 views
2

通過Zend_Framework,我想知道什麼被認爲是構建HTML電子郵件中發送內容的最佳實踐。在我的情況下,發送的電子郵件的內容由許多因素決定,例如數據庫中特定值的返回行數。因此,對我而言,內容是建立在發送與相關數據庫模型交談的電子郵件並確定內容應該是什麼的控制器中的。我不知道這個作品是否是我們的設計師和版權人經常想調整電子郵件中的副本,然後這需要他們對模型進行更改或要求我。我應該如何處理這個不同?我是否應該將HTML片段存儲在包含不同文本的地方,然後以某種方式調用這些片段?Zend Framework電子郵件內容生成

編輯從fireeyedboy回答下面,這樣做是可以接受的。在視圖內創建一個名爲「partials」的文件夾,並使用它存儲text/html片段,然後我可以在需要的位置調用,並使用regexp(或類似的)替換帶有動態值的特殊字符串。

$nview = new Zend_View(); 
$nview->setScriptPath(APPLICATION_PATH.'/views/partials/'); 
$bodytext = $nview->render('response.phtml'); 
$mail = new Zend_Mail(); 
$mail->setBodyText($bodytext); 
// etc ... 

例如,在這種情況下,其中兩個不同的模板可以根據從模型返回變量可以使用:

// within a controller 
public function emailAction() 
{ 
    $images = new Model_ApplicationImages(); 
    $totimages = count($images->fetchImages($wsid)); 
    $acceptedImages = $images->fetchImages($wsid,'approved'); 
    $accepted = count($acceptedImages); 
    $rejectedImages = $images->fetchImages($wsid,'rejected'); 
    $rejected = count($rejectedImages); 
    $response = ($rejected == $totimages)?'rejected':'approved'; 
    $nview = new Zend_View(); 
    $nview->setScriptPath(APPLICATION_PATH.'/views/partials/'); 
    $content = $nview->render($response.'.phtml'); 
    $mail = new Zend_Mail(); 
    $mail->setBodyText($content); 
    // etc 
} 

有沒有更優雅的方式,我可以/應該這樣做呢?

+0

你能否澄清一點:「我可以在需要的地方調用,並使用正則表達式(或類似的)來替換帶有動態值的特殊字符串」?你的意思是來自你正在渲染的視圖內嗎? – 2010-01-20 15:11:13

+0

在 – robjmills 2010-01-20 15:20:05

+0

上面增加了更多細節@snaken:我不認爲他是這些事情的專家,但我認爲你應該問自己這些觀點有多不同。如果他們顯着不同,那麼這可能是最好的解決方案。但是如果視圖相似,我可能會用一些條件語句(如果需要,可能會加載部分)創建一個視圖。更令我擔心的是確定'$反應'的相當冗長的方式。似乎有點多餘來調用'fetchImages()'三次。我不知道這種方法當然有多密集。也許你已經使用了延遲加載/緩存機制? – 2010-01-20 19:54:33

回答

2

不知道這是最好的做法,但我做的事是這樣的方法擴展的Zend_Mail:

setTemplatePath($templatePath); 
setTemplateHtml($templateHtml); 
setTemplateText($templateText); 
setTemplateArguments(array $templateArguments); 

在我重寫send() ...那麼在某些時候我做的:

$view = new Zend_View(); 
$view->setScriptPath($this->_templatePath); 

foreach($this->_templateArguments as $key => $value) 
{ 
    $view->assign($key, $value); 
} 

if(null !== $this->_templateText) 
{ 
    $bodyText = $view->render($this->_templateText); 
    $this->setBodyText($bodyText); 
} 

if(null !== $this->_templateHtml) 
{ 
    $bodyHtml = $view->render($this->_templateHtml); 
    $this->setBodyHtml($bodyHtml); 
} 

因此,要利用這一點,你會做這樣的事情:

$mail = new My_Extended_Zend_Mail(); 
$mail->setTemplatePath('path/to/your/mail/templates'); 
$mail->setTemplateHtml('mail.html.phtml'); 
$mail->setTemplateText('mail.text.phtml'); 
$mail->setTemplateArguments(
    'someModel' => $someFunkyModel, 
    /* etc, you get the point */ 
) 
$mail->send(); 

換句話說,與日你可以讓你的設計師和撰稿人簡單地編輯視圖(模板),就像他們已經習慣的那樣。希望這會有所幫助,並激勵你提出一些適合你需求的時髦。

PS:
既然你提到的任意數據行,你可以,例如,利用自帶的ZF這樣做的partialLoop視圖助手。但你可能已經意識到這一點了?

PPS:
我居然同意chelmertz」關於不延長的Zend_Mail但在我自己的組件包裹它的評論。

+0

謝謝,我已經在上面添加更多 – robjmills 2010-01-20 14:45:15

+1

我不認爲你應該擴展'Zend_Mail',而是用'setTemplatePath()'方法將它包裝在你的自定義類中。我基於猜測,所有這些輔助方法仍然**使用**(而不是擴展)'Zend_Mail :: setBodyHtml()'和'Zend_Mail :: setBodyText()' - 方法。 不錯的解決方案,否則。 – chelmertz 2010-01-20 16:07:37

+0

@chelmertz:+1,我同意,實際上。好點子。我在未來的某個時候想過這樣做,但還沒有完成。我應該在我的回答中記下這一點。 – 2010-01-20 19:40:27