Informatix le gaulois

Tutoriels et outils pour l'informatique.

Informatix > Tutoriels > PHP > Appliquer un layout sur un mail avec le Zend Framework

Appliquer un layout sur un mail avec le Zend Framework

Comment personnaliser un Zend_Mail ?

dimanche 03 juillet 2011 à 19:27

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
	
Nicolas GAUTRON

Auteur

Nicolas GAUTRON
Créateur et administrateur.
http://www.informatix.fr



^ Haut de page ^



Dans la même catégorie

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
Un client HTTP / proxy en PHP
Activer PHP5 sur un hébergement 1&1
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)



^ Haut de page | Commentaires ^