CMS Automne
http://www.automne-cms.org/forum/

Envoyer cette page à un ami
http://www.automne-cms.org/forum/viewtopic.php?f=5&t=387
Page 1 sur 1

Auteur:  Chrys [ Mar Oct 07, 2008 9:26 am ]
Sujet du message:  Envoyer cette page à un ami

Je vais donc vous présenter une fonctionnalité intéressante qui va vous permettre d'ajouter un lien "Envoyer cette page à un ami" dans n'importe quelle page.
Le clic sur le lien affichera une nouvelle page avec un formulaire de saisie des informations (notamment les adresses mails des destinataires)
Lors de la validation du formulaire, si aucune erreur de saisie n'est détectée, un mail sera envoyé aux destinataires. Ce mail contiendra un lien vers la page initiale...

Ce tuto va nous permettre de manipuler deux classes du CMS Automne. La classe CMS_Page qui permet d'obtenir des informations sur une page existante et la classe CMS_mail, responsable de la gestion d'envoi de mail.
Comme tous les tutos, il n'est qu'une trame, vous pourrez le personnaliser, il ne présentera que l'essentiel pour la compréhension.
Bien sur, il est perfectible, n'hésitez pas à m'envoyer vos remarques...

Chrys.

Auteur:  Chrys [ Mar Oct 07, 2008 9:30 am ]
Sujet du message: 

Première Etape : Rangée du formulaire
Nous allons créer la rangée qui se chargera de la gestion du formulaire.
En voici un code simplifié :
Code :
<row>
   <link rel="stylesheet" type="text/css" href="/css/modules/cms_forms.css" />
   <?php
   // Récupération des arguments http
   $targetPageID = $_REQUEST['p'] ? $_REQUEST['p'] : -1;
   $action = $_REQUEST['action'] ? $_REQUEST['action'] : 'displayForm';
   
   $senderName = $_REQUEST['senderName'] ? $_REQUEST['senderName'] : '';
   $senderEMail = $_REQUEST['senderMail'] ? $_REQUEST['senderMail'] : '';
   $recipientList = $_REQUEST['recipientMails'] ? $_REQUEST['recipientMails'] : '';
   $message = $_REQUEST['message'] ? $_REQUEST['message'] : '';
   $recipientMails;
   $html = '';
   if (!SensitiveIO::isPositiveInteger($targetPageID)) {
      $html .= '<div class="cms_forms_error_msg">Numéro de page invalide : '.$targetPageID.'</div>';
   } else {
      $targetPage = new CMS_page($targetPageID);
      switch($action) {
         case 'sendMail':
            // Variables de gestion des erreurs
            $errorRequirement = '';
            $errorFormat = '';
            $errorProcess = '';
            
            // Controle du nom
            if (!($senderName)) {
               $errorRequirement .= '<li>Votre nom</li>';
            }
            
            // Controle du mail de l'expéditeur
            if (!($senderEMail)) {
               $errorRequirement .= '<li>Votre e-mail</li>';
            } else if (!(SensitiveIO::isValidEmail($senderEMail))) {
               $errorFormat .= '<li>Votre e-mail</li>';
            }

            // Controle des mails des destinataires
            if (!($recipientList)) {
               $errorRequirement .= '<li>Adresses e-mails des destinataires</li>';
            } else {
               $recipientMails = split(';', $recipientList);
               foreach ($recipientMails as $recipientMail) {
                  if (!(SensitiveIO::isValidEmail($recipientMail))) {
                     $errorFormat .= '<li>Adresses e-mails des destinataires</li>';
                     break;
                  }
               }
            }
            
            // Si pas d'erreur de saisie, envoi du mail au format HTML
            if ((!$errorRequirement) && (!$errorFormat)) {
               $mailBody = '';
               $mailBody .= '<html>';
               $mailBody .= '<body>';
               $mailBody .= '<p>';
               $mailBody .= 'Bonjour ci-joint un article vu sur le site de TEAN! l'agence de com (<a href="http://www.tean-agence.com/">http://www.tean-agence.com/</a>)<br /><br />';
               $mailBody .= 'Cet article vous est envoyée par '.$senderName.' ';
               if ($message) {
                  $mailBody .= 'avec le message suivant : <br /><br />';
                  $mailBody .= '<em>'.$message.'</em>';
               }
               $mailBody .= '</p>';
               $mailBody .= '<p>';
               $mailBody .= 'Titre de l’article : "<strong>'.$targetPage->getTitle(true).'</strong>"';
               $mailBody .= '</p>';
               $mailBody .= '<p>';
               $mailBody .= 'Accédez à l\'intégralité de cet article sur le site de TEAN! : <a href="'.$targetPage->getURL().'">'.$targetPage->getURL().'</a>';
               $mailBody .= '</p>';
               $mailBody .= '</body>';
               $mailBody .= '</html>';
               $cms_mail = new CMS_email();
               $cms_mail->setSubject($targetPage->getTitle(true));
               $cms_mail->setEmailHTML($mailBody);
               $cms_mail->setEmailFrom($senderEMail);
               $cms_mail->setFromName($senderName);
               foreach ($recipientMails as $recipientMail) {
                  $cms_mail->setEmailTo($recipientMail);
                  if (!($cms_mail->sendEmail())) {
                     $errorProcess .= '<li>'.$recipientMail.'</li>';
                  }
               }
            }

            // S'il y a des erreurs, on les affiche et on réaffiche le formulaire en modifiant la valeur de la variable $action
            if (($errorRequirement) || ($errorFormat) || ($errorProcess)) {
               $html .= '<div class="cms_forms_error_msg">';
               if ($errorRequirement) {
                  $html .= 'Merci de compléter tous les champs requis :';
                  $html .= '<ul>';
                  $html .= $errorRequirement;
                  $html .= '</ul>';
               }
               if ($errorFormat) {
                  $html .= 'Le contenu de ces champs est incorrect :';
                  $html .= '<ul>';
                  $html .= $errorFormat;
                  $html .= '</ul>';
               }
               if ($errorProcess) {
                  $html .= 'Une erreur s\'est produite pendant l\'envoi du message. Veuillez renouveler l\'opération pour les destinataires suivants :';
                  $html .= '<ul>';
                  $html .= $errorProcess;
                  $html .= '</ul>';
               }
               $html .= '</div>';
               $action = 'displayForm';
            }
         break;
      }
      switch($action) {
         case 'displayForm':
            // Affichage du formulaire
            $html .= '<form name="formSendToFriend" class="cms_form" method="post" action="'.$_SERVER["PHP_SELF"].'">';
               $html .= '<input type="hidden" name="p" id="action" value="'.$targetPageID.'" />';
               $html .= '<input type="hidden" name="action" id="p" value="sendMail" />';
               $html .= '<fieldset><legend>Envoyer à un ami</legend>';
                  $html .= '<label>Titre : </label>';
                  $html .= '<h3>'.$targetPage->getTitle(true).'</h3>';
                  $html .= '<span class="required">* </span><label for="senderName">Votre nom :</label>';
                  $html .= '<input type="text" name="senderName" id="senderName" value="'.$senderName.'" />';
                  $html .= '<span class="required">* </span><label for="senderMail">Votre e-mail :</label>';
                  $html .= '<input type="text" name="senderMail" id="senderMail" value="'.$senderEMail.'" />';
                  $html .= '<span class="required">* </span><label for="recipientMails">Adresses e-mails des destinataires :</label><br /><span class="comment">Séparez les adresses par un point-virgule</span>';
                  $html .= '<textarea name="recipientMails" id="recipientMails">'.$recipientList.'</textarea>';
                  $html .= '<label for="message">Votre commentaire :</label>';
                  $html .= '<textarea name="message" id="message">'.$message.'</textarea>';
                  $html .= '<input type="submit" value="Envoyer" class="button" />';
                  $html .= '<span class="required">* : Informations obligatoires </span>';
               $html .= '</fieldset>';
            $html .= '</form>';
         break;
         case 'sendMail':
            // Affichage du compte rendu de l'envoi de mail
            $html .= 'Votre envoi à un ami a réussi.<br /><br />';
            $html .= 'Retourner à l\'article : <a href="'.$targetPage->getURL().'">'.$targetPage->getTitle(true).'</a><br />';
            $html .= 'Retourner à la <a href="/">page d\'accueil</a><br />';
         break;
      }
   }
   echo $html;
   ?>
</row>


Bien que le code ne soit pas d'une complexité effarante, quelques commentaires sont nécessaires.
Il n'y a pas de balises block, inutile dans mon cas, tout est géré par le code PHP et il n'existe pas de mode "édition" de cette rangée.
Vous noterez l'invocation de méthodes statiques sur la classe SensitiveIO afin de contrôler les arguments http. Si tous ces arguements sont corrects, un mail est envoyé. Par défaut cette rangée affiche le formulaire de saisie si un numéro de page est envoyé dans l'argument p. Cet argument est repris dans un champ caché du formulaire.

Chrys.

Auteur:  Chrys [ Mar Oct 07, 2008 9:31 am ]
Sujet du message: 

Deuxième étape : Page du formulaire
Créer ensuite une page dans votre site préféré.
Passer en mode de modification de page avec la fonction "Modifier les rangées"
Insérer la rangée précédemment créée
Enregistrer votre travail avec la fonction "Soumettre à Validation"
Enfin, Valider la page.

Notez précisément le numéro de la page que vous venez de créer, c'est la petite faiblesse de ce tuto mais qui à mon sens reste mineure.

Chrys.

Auteur:  Chrys [ Mar Oct 07, 2008 9:37 am ]
Sujet du message: 

Troisième étape : Rangée du lien
Nous allons maintenant créer une rangée contenant un lien qui pointera vers la page que vous avez créé à l'étape précédente.
En voici les quelques lignes

Code :
<row>
   <?php
      $currentPageID = ereg_replace(".*/([[:digit:]]{1,})-.*","\\1",$_SERVER["PHP_SELF"]);
      $cms_page_form = new CMS_page(1000);
      echo '<a href="'.$cms_page_form->getURL().'?p='.$currentPageID.'">Envoyer cette page à un ami</a>';
   ?>
</row>


$currentPageID reçoit le numéro de la page courante grâce à l'utilisation d'une expression règulière, code que j'ai trouvé dans du code fourni pas WS-Interactive.
Noter que le constructeur CMS_Page de la variable $cms_page_form DOIT utiliser en arguement la valeur du numéro de la page que vous avez créée à l'étape précédente. Remplacer donc la valeur 1000 par votre numéro de page.

Chrys.

Auteur:  Chrys [ Mar Oct 07, 2008 9:38 am ]
Sujet du message: 

Quatrième étape : Page contenant le lien
Il ne vous reste plus qu'à insérer cette rangée de lien dans n'importe quelle page

Chrys.

Auteur:  Chrys [ Mar Oct 07, 2008 9:45 am ]
Sujet du message: 

Cinquième étape : A vous de jouer...

Dernière remarque, la visualisation du brouillon de la page contenant la rangée du formulaire affiche un message d'erreur à la place du formulaire, pas d'inquiétude...

A vos clavier, vos remarques sont les bienvenues

Auteur:  Sébastien [ Mar Oct 07, 2008 12:29 pm ]
Sujet du message: 

Merci Chrys pour ce tuto :)

Je rajoute un point pour simplifier, Etape 3, vous pouvez employer ce code à la place :
Code :
<row>
   <atm-linx type="direct">
      <selection>
         <start><nodespec type="node" value="1000" /></start>
      </selection>
      <display>
         <htmltemplate><a href="{{href}}?p={{pageID}}">Envoyer à un ami</a></htmltemplate>
      </display>
   </atm-linx>
</row>


Il doit aussi être possible d'arriver à un résultat similaire sans trop de code PHP, en employant le module formulaire d'Automne (sur la toute dernière version d'Automne).
La rangée lien serait de cette forme :
Code :
<row>
   <atm-linx type="direct">
      <selection>
         <start><nodespec type="relative" value="self" /></start>
      </selection>
      <display>
         <htmltemplate>
            <?php
               $pageURL = urlencode('{{href}}');
               $pageTitle = urlencode('{{title}}');
            ?>
         </htmltemplate>
      </display>
   </atm-linx>
   <atm-linx type="direct">
      <selection>
         <start><nodespec type="node" value="1000" /></start>
      </selection>
      <display>
         <htmltemplate><?php echo '<a href="{{href}}?title='.$pageTitle.'&amp;url='.$pageURL.'">Envoyer à un ami</a>';</htmltemplate>
      </display>
   </atm-linx>
</row>


Il faudrait ensuite créer un formulaire via le module de formulaire comportant un champs email pour l'email du destinataire. Saisissez ensuite dans l'action "envoyer un email" du formulaire, dans le champs d'en tête du message un texte ressemblant à :
Code :
<strong>Titre de l'article : {request:string:title}</strong>
Accédez à l'intégralité de cet article : <a href="{request:string:url}">{request:string:url}</a>


Ceci étant, je n'ai pas testé il se peut que ça coince quelque part ... à vérifier. Chrys ton code à deux avantages : il ne permet pas l'émission par email d'une URL qui transite dans l'adresse (ce qui pourrait être détourné par des robots), et il permet de gérer le formatage de l'email émis. Il a par contre un inconvénient, dans le cas d'un intranet sécurisé, il permet (en changeant le n° de la page à envoyer dans l'url) d'identifier des pages masquées à l'utilisateur connecté ainsi que leur adresse (aucun contrôle de droit) mais je ne pense pas que mon code soit meilleur à ce niveau, là aussi il faudrait que je le teste plus en avant.

Page 1 sur 1 Le fuseau horaire est UTC [Heure d’été]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/