CMS Automne

Forum de la communauté du CMS Automne
Nous sommes actuellement le Jeu Mars 28, 2024 5:45 pm

Le fuseau horaire est UTC [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 7 messages ] 
Auteur Message
 Sujet du message: Envoyer cette page à un ami
MessagePublié: Mar Oct 07, 2008 9:26 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Lun Mars 17, 2008 8:51 pm
Message(s) : 81
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.


Dernière édition par Chrys le Mar Oct 07, 2008 10:34 am, édité 2 fois.

Haut
 Profil  
 
 Sujet du message:
MessagePublié: Mar Oct 07, 2008 9:30 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Lun Mars 17, 2008 8:51 pm
Message(s) : 81
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.


Haut
 Profil  
 
 Sujet du message:
MessagePublié: Mar Oct 07, 2008 9:31 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Lun Mars 17, 2008 8:51 pm
Message(s) : 81
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.


Haut
 Profil  
 
 Sujet du message:
MessagePublié: Mar Oct 07, 2008 9:37 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Lun Mars 17, 2008 8:51 pm
Message(s) : 81
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.


Dernière édition par Chrys le Mar Oct 07, 2008 10:39 am, édité 1 fois.

Haut
 Profil  
 
 Sujet du message:
MessagePublié: Mar Oct 07, 2008 9:38 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Lun Mars 17, 2008 8:51 pm
Message(s) : 81
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.


Haut
 Profil  
 
 Sujet du message:
MessagePublié: Mar Oct 07, 2008 9:45 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Lun Mars 17, 2008 8:51 pm
Message(s) : 81
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

_________________
Chrys.
"Il y a 10 sortes de gens, ceux qui savent compter en binaire et les autres..."


Haut
 Profil  
 
 Sujet du message:
MessagePublié: Mar Oct 07, 2008 12:29 pm 
Hors-ligne
Administrateur
Avatar de l’utilisateur

Inscrit(e) le : Mer Juin 15, 2005 8:28 am
Message(s) : 759
Localisation : Sophia Antipolis
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.


Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 7 messages ] 

Le fuseau horaire est UTC [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Recherche de:
Aller vers :  
cron
Powered by phpBB® Forum Software © phpBB Group
Traduit par Maël Soucaze et Elglobo © phpBB.fr