...du verbe Drupaler (1er groupe)

Comment débuguer un formulaire sous Drupal

16. Avril 2012 - 9:44 -- Thomas
form_3.pngIl arrive souvent qu'un formulaire n'adopte pas le comportement que l'on désire ou que l'on attend. Par exemple il n'affiche pas tous les éléments, les validations ne fonctionnent pas, les données ne s'enregistrent pas etc...


Dans cet article nous nous consacrerons au débuguage simple de l'affichage, la validation et l'enregistrement des données d'un formulaire.

Comme vous le savez, Drupal est un CMS disposants d'un système de hook qui permettent de modifier à peut près tous. Il en est de même pour les formulaires. Ainsi on utilisera différent hook pour arriver à comprendre d'où peut provenir notre bug. Par ailleurs on utilisera bien sûr le module Devel afin d'afficher nos variables.
La méthode que l'on va présentée ici à deux avantages :
-permet de voir du code d'autress développeurs.
-permet de ne pas hacker des modules contrib ou le core de Drupal

On peut découper le formulaire en quatre phases:
-la création du formulaire
-la modification ou altération du formulaire
-la validation du formulaire
-le traitement du formulaire

L'affichage

Si vous avez des problèmes d'affichage au niveau de formulaire, il faudra vérifier en premier les droits & permissions d'utilisateurs. Malgré tout, certain module peuvent forcer la "non visibilité" d'un champs pour tous et ceci grâce à l'attribut #access qui existe pour pratiquement l'ensemble des type de champs disponible pour un formulaire (cf doc API de Drupal :  doc 6 / doc 7) .
Il peut aussi arriver que certain module change le type d'un élément du formulaire pour le cacher. Ainsi, il faut chercher l'attribut #type qui est devenus "hidden".


Validation & traitement

Il arrive fréquemment qu'un formulaire ne fonctionne pas comme vous le désirez; la validation qui ne passe pas ou encore l'enregistrement qui ne fonctionne pas. Et comme par hasard ça arrive sur LE formulaire avec un traitement effectué dans le core. Pas de panique pas besoin d'aller modifier tout le core de Drupal.
La méthode est la suivante :
Pour l'exemple le formulaire d'inscription de l'utilisateur sera utilisé.
Dans un premier temps il faut rechercher qui traite et valide votre formulaire.

1. Afficher votre formulaire et chercher le callback de submit.

Nota : afin que votre formulaire est bien tous les éléments de tous les modules, il est primordiale de mettre un poids assez lourd à son module.

Créer votre form alter :
function mon_module_form_alter(&$form, &$form_state, $form_id){
  dsm('Le form id :');
  dsm($form_id);
  if($form_id=='user_register') //id du formulaire qui bug
    {
    dsm('Le formulaire');
    dsm($form);
    if(isset($form['#submit']) && !empty($form['#submit']))
      {
      dsm('Le(s) callback(s) du submit');
      dsm($form['#submit']);
      }
    if(isset($form['#validate']) && !empty($form['#validate']))
      {
      dsm('Le(s) callback(s) du validate');
      dsm($form['#validate']);
      }
    }
}

Comme vous pouvez le voir, la variable form est un énorme tableau contenant pas mal d'information. Nous ce qui nous intéresse ce sont les noms de fonctions rangé dans "#submit" ou "#validate"; ce tableau n'est pas forcément construit toujours de la même manière, il peut être intéressant d'installer search krumo pour rechercher dans le formulaire.
submitCallback_0.png

Vous pouvez tomber sur plusieurs callback. Généralement le nommage des fonctions de callback sont assez explicites, afin que vous puissiez savoir de quel module elles proviennent. Vous pouvez très rapidement savoir laquelle de ces fonctions est en cause en la retirant du formulaire avec un unset.

2. reproduire le traitement ou la validation.

Cherchez sur internet ou dans vos fichiers la fonction qui est suspectée.
Coller le tout dans votre validate ou submit.
Par exemple on trouve la fonction :
content_profile_registration_user_register_submit
Qui correspond au module content_profile et est appellée dans
content_profile/modules/content_profile_registration.module

Nota :
Le code en lui même n'est pas important, nous vous avons mis le début de la fonction pour comparer avec notre fonction de débugage
<?php
function content_profile_registration_user_register_submit($form, &$form_state) {
  foreach ($form['#content_profile_registration_use_types'] as $type => $typename) {
    if ($node = & $form_state['content_profile_registration'][$type]['node']) {
      // Set user's information for the node.
      if (empty($node->title) && (!module_exists('auto_nodetitle') || auto_nodetitle_get_setting($type) != AUTO_NODETITLE_OPTIONAL)) {
[...]

Il suffit donc de copier coller le même algorithme dans notre hook submit, et de réaliser un affichage de débuguage en affichant notament les variables qui sont testées dans les structures conditionnelles.

function mon_module_foo_submit($form, &$form_state) {
  dsm('Le formulaire :');
  dsm($form);   
  dsm('Le formState :');
   dsm($form_state);
  foreach ($form['#content_profile_registration_use_types'] as $type => $typename) {
  
      dsm('exemple savoir si on passe dans la boucle et affichage du prochain test'.$form_state['content_profile_registration'][$type]['node']);
    if ($node = & $form_state['content_profile_registration'][$type]['node']) {
      dsm('exemple savoir si on passe dans le premier if et affichage du prochain test'.$node->title);
[...]
Il est bien sûr très vivement conseiller de lire le code que l'on va executer pour ne pas faire n'importe quoi.
4.6
Average: 4.6 (5 votes)
Votre vote: Aucun(e)

Commentaires

Soumis par Henri Coste (non vérifié) le

Bonjour,
J'ai un petit souci et je voulais vous demander si vous aviez une idée. Dans un formulaire qui permet à tout visiteur INSCRIT de mon site de correspondre avec un autre visiteur INSCRIT dont il a consulté une annonce, je vois apparaître, à coté du pseudo du destinataire du formulaire choisi, le libellé [user]
Sauriez vous quelle est mon erreur et/ou comment faire disparaître cette mention ?
Merci infiniment.
Henri

Soumis par Thomas le
Ce formulaire correpond à quoi? une entité? un node?
Si c'est un type de node tu as une option dans le type de contenus pour ne pas afficher les informations sur l'auteur.

Ajouter un commentaire

Texte simple

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de courriels sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Image CAPTCHA