2010-01-20 7 views
2

Avec Zend_Framework, je me suis demandé ce qui est considéré comme la meilleure pratique pour la construction de la teneur d'envoyer un e-mail HTML. Dans mon cas, le contenu de l'e-mail envoyé est déterminé par un certain nombre de facteurs, par exemple le nombre de lignes renvoyées pour une valeur spécifique dans la base de données. Pour cette raison, il est logique pour moi que le contenu soit construit dans le contrôleur qui envoie l'email qui parle aux modèles de base de données pertinents et détermine ce que le contenu devrait être. Là où je ne suis pas sûr que cela fonctionne, c'est que nos concepteurs et copyrights voudront souvent ajuster la copie dans les emails et cela leur demanderait alors d'apporter des modifications à un modèle ou de me le demander. Devrais-je gérer cela différemment? Est-ce que je devrais peut-être stocker quelque part des extraits de code HTML contenant le texte différent et les appelant d'une manière ou d'une autre?Zend Framework email de génération de contenu

EDIT suite à la réponse de fireeyedboy, serait-il acceptable de faire quelque chose comme ça. Créer un dossier à l'intérieur des vues appelé "partials" et l'utiliser pour stocker des extraits de texte/html que je peux ensuite appeler là où j'ai besoin et remplacer les chaînes spéciales par des valeurs dynamiques en utilisant regexp (ou similaire).

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

par exemple. dans ce contexte où deux modèles différents peuvent être utilisés en fonction des variables renvoyées à partir d'un modèle:

// 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 
} 

Y at-il une façon plus élégante que je peux/dois faire cela?

+0

Pouvez-vous préciser « que je peux alors appeler où j'ai besoin et remplacer des chaînes spéciales avec des valeurs dynamiques à l'aide regexp (ou similaire) »? Voulez-vous dire appel à partir de la vue que vous êtes en train de rendre? –

+0

ajouté plus de détails au dessus de – robjmills

+0

@snaken: Je ne prétends pas être un expert sur ces questions, mais je pense que vous devriez vous demander à quel point ces points de vue sont différents. Si elles sont significativement différentes, cela pourrait être la meilleure solution. Mais si les vues sont similaires, je ferais probablement une vue avec quelques instructions conditionnelles (qui chargent peut-être des partiels, si nécessaire). Ce qui m'inquiète un peu plus, c'est la manière plutôt verbeuse de déterminer «$ response». Cela semble un peu redondant d'appeler 'fetchImages()' trois fois. Je ne sais pas à quel point cette méthode est intensive. Peut-être que vous utilisez déjà le mécanisme de chargement/mise en cache paresseux? –

Répondre

2

Je ne sais pas si cela est la meilleure pratique, mais ce que je faisais est Zend_Mail étendre avec des méthodes comme celles-ci:

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

... puis à un moment donné dans mon send() écrasé que je fais:

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

donc d'utiliser ce que vous feriez quelque chose comme:

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

En d'autres termes, avec e est que vous pouvez laisser vos concepteurs et rédacteurs éditer simplement des vues (modèles) comme ils sont déjà habitués. J'espère que cela vous aide et vous a inspiré pour trouver quelque chose de génial qui convient à vos besoins.

PS:
Puisque vous mentionnez les lignes de données arbitraires, vous pouvez, par exemple, utiliser l'aide partialLoop vue qui vient avec ZF pour cela. Mais vous étiez probablement déjà au courant de cela?

PPS:
Je suis d'accord avec un commentaire « chelmertz de ne pas étendre Zend_Mail mais l'enveloppant dans mon propre composant.

+0

merci, j'ai ajouté plus au-dessus maintenant – robjmills

+1

Je ne pense pas que vous devriez étendre 'Zend_Mail', mais plutôt l'envelopper dans votre classe personnalisée avec des méthodes comme' setTemplatePath() '. Je base cette sur la conjecture que toutes ces méthodes d'aide sont toujours ** en utilisant ** (ne s'étendant pas) les méthodes 'Zend_Mail :: setBodyHtml()' - et 'Zend_Mail :: setBodyText()'. Belle solution sinon. – chelmertz

+0

@chelmertz: +1, je suis d'accord, en fait. Bon point. J'ai pensé à faire cela à un moment donné dans le futur, mais je ne l'avais pas encore fait. J'aurais dû en prendre note dans ma réponse. –