Appliquer un layout sur un mail avec le Zend Framework

Comment personnaliser un Zend_Mail ?

03 juillet 2011

La plupart du temps la majorité des mails provenant d'un site ont le même format (design, signature, balise dans l'objet etc...), il est donc fastidieux de devoir répéter ces éléments dans le code de chacun des envoies de mails.

Pour palier à ce problème nous allons mettre en place un système de layout pour les mails. Toutes les parties communes seront dans un fichier et pour chaque mail nous n'aurons donc plus qu'à coder les parties variables.

Le layout - Les parties communes

/application/layouts/scripts/mail.phtml

<p style="text-align: justify;"> 
	Bonjour,
	<br/> <br/>

	<!-- Corps variable -->
	<pre> 
	<?php echo $this->layout()->content; ?> 
	</pre>

	<br/><br/> 
	Cordialement.
	<br/> <br/>

	<!-- Signature -->
	--<br/> 
	NlC0
</p>
	

L'objet Zend_Mail - Préciser à Zend_Mail d'utiliser le layout

/library/Informatix/Mail.php

class Informatix_Mail extends Zend_Mail 
{
	private $_config;
	private $_view;
	
    public function __construct($config, $charset = 'UTF-8')
    {
    	if (!isset($config))
    	{  
          	throw new Zend_Exception('Pas de configuration fournie.') ;  
        }
        
    	$this->_config = $config;
    	
        parent::__construct($charset);
        
        $this->setFrom(votre_adresse, votre_nom);
        
        $this->_view = new Zend_View();
    }

    /* Ceci servira pour remplir les attributs de la vue variable.
    ** Dans notre cas le contenu et l'émetteur.
    */
	public function __set($key, $val)   
	{  
       if ('_' != substr($key, 0, 1)) 
       {  
           $this->_view->$key = $val;  
           return;  
       }  
	}
	
	public function setSujet($sujet)    
	{  
        if (isset($this->_config->mail->sujet->format))   
        {
            /* Permet de spécifier un format pour le sujet */
            $sujet = sprintf($this->_config->mail->sujet->format, $sujet);  
        }  
          
        return parent: etSubject($sujet);  
	}

    /* Spécifie où trouver le layout mail.phtml
    ** ainsi que la vue variable (contact.phtml pour l'exemple).
    ** La vue est rendue dans le content du layout,
    ** qui est lui même rendu dans le corps du mail.
    */    
    public function rendreVue($script)
    {
        $layout = new Zend_Layout(Array('layoutPath' => $this->_config->resources->layout->layoutPath));
        $layout->setLayout('mail');
        
        $this->_view->setScriptPath($this->_config->includePaths->views.'/scripts/mails');
        
        $layout->content = $this->_view->render($script);
        
        $html = $layout->render();

        $this->setBodyHtml($html);
    }

}
	

La vue de contact - La partie variable

Maintenant que nous avons défini une partie commune, il nous faut implémenter la partie variable. Il nous faut donc un exemple particulier de partie variable, et cet exemple sera un mail envoyé via la rubrique "contact".

/application/views/scripts/mails/contact.phtml

Vous avez reçu un nouveau mail de <?php echo $this->emetteur ?> :

<br/><br/><br/><br/>

<?php echo $this->contenu ?>
	

Le controller de contact - L'envoie du mail

/application/controller/envoie_mail.php

$mail = new Informatix_Mail(Zend_Registry::get('config'));

/* L'objet sera de la forme [INFORMATIX] $objet */
$mail->setSujet($objet);
	  
/* Appel à la méthode magique __set */     
$mail->contenu = $contenu;
$mail->emetteur = $emetteur;

/* On précise au mail d'utiliser la vue contact.phtml car
** nous sommes dans le cas d'une prise de contact.
** Notez qu'en retouchant un peu la méthode rendreVue,
** il est simple de mettre le layout en paramètre si
** vous avez plusieurs modèles de mails.
*/
$mail->rendreVue('contact.phtml');

/* Adresse du destinataire. */
$mail->addTo("informatix@nico.com");
       
if (!$mail->send())
{
  $erreur = "Echec lors de l'envoie du mail, veuillez réessayer plus tard.";
}
	

Le fichier de config - Le format du sujet

/application/configs/application.ini

; Pour que tous les sujets des mails commencent par la balise [INFORMATIX]
mail.sujet.format = [INFORMATIX] %s
	
Par
Créateur et administrateur.

Dans la même catégorie

Formater un tableau pour CURLOPT_POSTFIELDS
Email avec pièce jointe en PHP
PHP : modifier les attributs privés d'un objet
Tester l'existence d'un fichier dans l'include path
Convertir récursivement un objet PHP en tableau
PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Doctrine 2 : générer les classes PHP depuis la base de données
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment construire une URL sans caractères spéciaux en PHP ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment allumer son ordinateur à distance en PHP ?
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Comment lancer une requête multi-bases avec les fonctions MySQL ?
Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Commentaire(s)