[Résolu] [Résolu] Modifications du hook_form_alter plus prisent en compte si erreur dans le webform

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour tout le monde,

Pour un cas particulier sur un formulaire déjà existant sur mon site (réalisé à partir de webform), j'ai préféré créer un module et utiliser le hook_form_alter afin de modifier quelques champs plutôt qu'en faire un nouveau (et dupliquer tout le traitement qui va derrière)

Pour cela, à l'url de mon webform (monsite.com/mon-webform), j'ajoute un paramètre (monsite.com/mon-webform?operation=mon-operation) et je modifie mon webform seulement si ce paramètre est présent et exact.

Parmi les champs, il y a un select qui doit disparaitre pour ne plus donner la possibilité de choisir une opération. Celle-ci doit tout de même exister pour identifier la demande. Je remplace donc le type de mon champ select par hidden, et lui attribut comme value l'opération temporaire.

J'ai réussi a modifier les champs concernés, mais je rencontre deux contraintes qui vont me faire regretter de ne pas avoir fait un nouveau formulaire !

La première : si je submit avec la moindre erreur (champs vide, email erroné...) la page se recharge (monsite.com/mon-webform) sans paramètre, du coup le formulaire retrouve ses champs sans modifications et on voit de nouveau la liste des opérations disponibles.

La deuxième : si je submit sans erreur, la valeur de mon champ opération est la première opération disponible dans mon select habituel.

Existe-t-il une solution pour ces deux problèmes ou il vaut mieux faire un nouveau formulaire ? Merci pour votre aide.

Forum : 
Version de Drupal : 

Bonjour,

Pour le premier problème tu peux peut être gérer ca dans un hook_form_validate ?

Pour la deuxieme as-tu essayé avec un #value ou un #default_value pour mettre la valeur de ton argument opération dans ton champ opération ?

Merci Yohan pour ta proposition j'avais essayé dans hook_form_validate mais j'avais une erreur comme quoi je ne pouvais vérifier 2 fois.

J'ai réussi à résoudre mes 2 problèmes, donc si cela peut aider quelqu'un, voici comment :

// 1er problème
En validant le formulaire, comme c'est la méthode POST qui est utilisée, je ne pouvais plus vérifier la présence d'un paramètre dans l'url. Pour savoir que j'ai soumis le formulaire "modifié" et non le "normal" il fallait donc vérifier l'existence d'une variable qui n'est présente que dans cette version modifiée. Lors de la modification du formulaire, la première fois, j'ai donc ajouté en même temps un champ caché :

<?php
$form
['operation'] = array(
   
'#type' => 'hidden',
   
'#value' => 'mon opération',
);
?>

Et, dans la condition à vérifier pour modifier le formulaire initial, j'ai complété en contrôlant la présence de $_POST['operation'] :

<?php
if ( ($form_id == 'webform_client_form_xxx') && ($_GET['operation'] == 'mon-operation' || isset($_POST['operation'])) ) {      
?>

// 2nd problème
Je ne sais plus ce que j'avais mit pour que cela conserve la première des anciennes opération mais maintenant cela fonctionne en modifiant le champ nom_de_l_operation comme cela :

<?php
$form
['submitted']['nom_de_l_operation'] = array(
   
'#type' => 'hidden',
   
'#value' => 'mon opération',
);
?>

Finalement, cela restait de la logique PHP avec $_GET et $_POST.