We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 17673
    • 194 Posts
    this thread seems interesting to me and dealing with very general modx issues/method, but I don’t really speak french... can someone summarize it for the whole community once the analysis is complete !? wink wink kiss
      ----------------------------------------------------------
      http://www.linkedin.com/in/lucapost/
      http://www.twitter.com/lukwe/
      ----------------------------------------------------------
      • 21101
      • 169 Posts
      i try to realize a valid xhtml / php form as a snippet. but i have some problems grin

      my php code works perfect but when i put it in modx, it doesnt work sad
      i should post in the US section instead of French grin
        Play no games
        • 21101
        • 169 Posts
        bon j’ai trouvé le probleme, j’arrive a récupérer aucune variable $_POST, j’ai fait le test en dur sur une page PHP test.php avec <form method="post" action="test.php" >

        par contre dans modx, pas moyen, il me recharge la page, pourtant quand je fait "afficher la source" firefox me dit que y’a des données POST huh

        je soupconne le action="[~[*id*]~]" d’etre le responsable...
          Play no games
          • 1186
          • 202 Posts
          Hum, hum... j’utilise aussi action="[~[*id*]~]" et de mon côté, ça marche ! huh
            R
            • 21101
            • 169 Posts
            t’es aussi en URL Rewriting ? huh
              Play no games
              • 1186
              • 202 Posts
              Oui, avec url rewriting !

              Bon, des que je trouve 3 minutes, et si cela t’intéresse, j’essaierai de te mettre grosso modo la structure de mon snippet et les paramètres MODx que j’utilise.
                R
                • 21101
                • 169 Posts
                ok ca serait sympa wink
                  Play no games
                  • 1186
                  • 202 Posts
                  Alors, ma façon de faire est peut-etre un peu tordue, je ne sais pas, mais elle marche bien ! Donc :

                  Configuration

                  - URL simples : oui

                  - Page contenant le formulaire :

                  A placer en cache : non
                  Appel du snippet : [[MyForm? &tpl=`MyChunk`]]

                  J’imagine que l’on peut coupler la chose aussi de cette façon :

                  A placer en cache : oui
                  Appel du snippet : [!MyForm? &tpl=`MyChunk`!]


                  Formulaire

                  Le code HTML de mon formulaire est placé dans un chunk {{MyForm}}, ça me permet d’utiliser les placeholders [+variable+] (de manière gentillette note bien, car je me limite simplement à faire un str_replace...) pour :

                  1/ gérer le message d’alarme si erreur
                  2/ pré-remplir les champs du formulaire à corriger en cas d’erreur lors de son ré-affichage
                  3/ gérer les CSS (affichage en rouge du texte associé au champ mal rempli, par exemple)


                  Chunk contenant le formulaire

                  		<form name="monformulaire" action="[~[*id*]~]" method="post">
                  
                  		[+alarme+]
                  		<table>
                  			<tr>
                  				<th class="[+classe_nom+]">Nom :</th>
                  				<td><input type="text" name="nom" value="[+nom+]" size="25" maxlength="32" /> *</td>
                  			</tr>
                  
                  			... etc.
                  
                  		</table>
                  		<br />
                  		<input class="submit" type="submit" name="ok" value="Envoyer" />
                  
                  		</form>
                  



                  Snippet traitant le formulaire

                  // Snippet pour afficher / traiter un formulaire
                  //
                  // Fonctionne avec le chunk {{MyForm}} passé en paramètre :
                  // [[MyForm? &tpl=`MyChunk`]]
                  
                  
                  // Chargement du template formulaire
                  if ($tpl) $tpl = ($chunk = $modx->getChunk($tpl)) ? $chunk:"Chunk '$tpl' introuvable.";
                  
                  // Construction du formulaire
                  $output = doForm($tpl);
                  
                  // Affichage
                  return $output;
                  
                  
                  // **** Définition des fonctions **** //
                  
                  // Traitement des données
                  function erreurForm() {
                  
                  	global $erreur;
                  	$erreur['NOM'] = empty($_POST['nom']);
                  
                  	... etc. : traitement approprié à ses besoins ...
                  
                  	return $erreur['NOM'] || ... ;
                  
                  }
                  
                  
                  // Formulaire
                  function doForm($myForm)
                  {
                  	global $modx, $erreur;
                  
                  	// PREMIER AFFICHAGE DU FORMULAIRE
                  	if (!isset($_POST['ok'])) {
                  
                  		$myForm = str_replace("[+alarme+]", "", $myForm);
                  
                  		... traitement perso, etc.  ...
                  
                  		return $myForm; // Affiche le formulaire dans son état initial
                  
                  // VALIDATION DU FORMULAIRE
                  	} else {
                  
                  		// S'IL EST FAUX
                  		if (erreurForm()) {
                  	
                  			$myForm = str_replace("[+alarme+]", "Veuillez corriger les champs en rouge", $myForm);
                  
                  			... traitement perso pour afficher en rouge les champs qui coincent
                  
                  			return $myForm; // Affiche le formulaire pré-rempli avec les champs à corriger mis en évidence
                  
                  		// S'IL EST BON
                  		} else {
                  
                  			... traitement : envoi par email, injection dans une bdd, etc. 
                  
                  			$modx->sendRedirect($modx->makeUrl(63)); // Redirection sur page "merci bcp"...
                  
                  		}
                  	}
                  }
                  
                  


                  Voilà... J’espère que ça pourra t’aider !
                    R
                    • 21101
                    • 169 Posts
                    hello

                    merci pour ton code, il marche bien smiley

                    juste une question: tu met quoi dans ta fonction erreurForm()? huh
                    function erreurForm() {
                    
                    	global $erreur;
                    	$erreur['NOM'] = empty($_POST['nom']);
                    
                    	... etc. : traitement approprié à ses besoins ...
                    
                    	return $erreur['NOM'] || ... ;
                    
                    }
                      Play no games
                      • 1186
                      • 202 Posts
                      Ravie d’avoir pu aider ! laugh

                      Ma fonction erreurForm() sert à tester les champs mal remplis.
                      Par exemple si les champs "Nom" et "Prénom" sont obligatoires, ça donne :

                      function erreurForm() {
                      	global $erreur;
                      	$erreur['NOM'] = empty($_POST['nom']);
                      	$erreur['PRENOM'] = empty($_POST['prenom']);
                      	return $erreur['NOM'] || $erreur['PRENOM'];
                      }
                      


                      Il suffit que l’un des deux champs soit vide pour que erreurForm() soit TRUE => on passe à la partie "// S’IL EST FAUX" du snippet.
                      Dans cette partie du snippet, tu peux pré-remplir les champs bien renseignés lors du ré-affichage :

                      $myForm= str_replace("[+nom_du_champ_ok+]", $_POST['nom_du_champ_ok'], $myForm);
                      etc.
                      


                      ou appliquer une classe particulière (CSS) pour mettre en évidence un champ mal rempli, grâce à $erreur :

                      $myForm= str_replace("[+classe_nom+]", ($erreur['NOM'] ? 'erreur' : 'normal'), $myForm);


                      Si $erreur[’NOM’] = TRUE, pouf, on applique une class="erreur" côté CSS (qui affiche le champ erroné en rouge, vert, jaune, violet, comme on veut), sinon on reste en class="normal" pour un affichage standard du champ.

                      Dans la fonction erreurForm(), j’ai mis là un exemple basique, i.e. des champs obligatoires laissés vides, mais on peut tout tester sur ce principe, validité d’un email, d’un numéro de téléphone, etc., on rajoute autant de tests que l’on veut dans cette fonction.

                      J’espère que mes explications ne sont pas trop ténébreuses ! wink
                        R