Comment rendre obligatoire un champ de formulaire

mardi 1er juin 2010

astuce / pipeline / formulaires

Il y a quelques temps lors d’un Apéro SPIP, Jean-Marie me demandait :

Comment obliger les visiteurs à remplir le champ nom du formulaire de forum ?

On pourrait surcharger le fichier squelettes-dist/formulaires/forum.php mais ce n’est pas une solution pérenne, car il faudrait le mettre à jour à chaque modification du fichier orignal fourni par SPIP.

Pour faire les choses proprement, on va utiliser le pipeline formulaire_verifier pour insérer notre vérification supplémentaire dans le formulaire de forum.

Ci-dessous, le code à coller dans config/mes_options.php :

// on ajoute notre fonction dans le pipeline de verification des formulaires
// http://programmer.spip.org/Qu-est-ce-qu-un-pipeline
$GLOBALS['spip_pipeline']['formulaire_verifier'] .= '|nom_obligatoire';

// la fonction qui verifie que le nom n'est pas vide
function nom_obligatoire($flux){
        $form = $flux['args']['form'];
        if ($form=='forum'){
                if (!sinon($GLOBALS['visiteur_session']['nom'],$GLOBALS['visiteur_session']['session_nom'])){
                        $flux['data']['message_erreur'] .= _T('nom_obligatoire');
                        $flux['data']['session_nom'] = _T('nom_obligatoire');
                        unset($flux['data']['previsu']);
                }
        }
        return $flux;
}

Il nous reste à définir la chaîne de langue nom_obligatoire dans un fichier
squelettes/local_fr.php et hop "ça poutre" ;)

Vos commentaires

  • hamid

    merci de l’astuce, j’ai testé mais ça ne marche pas ?? (spip 2.1)
    sinon pour rendre l’email obligatoire mais pas le nom on fait comment ?

    @+

    1er juin 2010, 20:05

  • bb

    Oups, il y avait une petite coquille, j’ai corrigé le code et cette fois ça fonctionne bien avec SPIP 2.1.

    Pour tester la présence de l’email il suffit de remplacer :

    sinon($GLOBALS['visiteur_session']['nom'],$GLOBALS['visiteur_session']['session_nom'])

    par :

    sinon($GLOBALS['visiteur_session']['email'],$GLOBALS['visiteur_session']['session_email'])

    ++

    1er juin 2010, 21:52

  • jeanmarie

    Ouais, ça poutre ! Merci pour le tuyaux...

    2 juin 2010, 12:26

  • hamid

    merci ça marche très bien, par contre comment indiquer que le CSS doit mettre le champs nom ou email en cause soit rouge ??

    @+

    2 juin 2010, 16:19

  • N’y aurait-il pas une faille dans les forums spip ?
    Dans le cas ci-présent un simple petit paragraphe.

    Bonjour,

    l’astuce est sympathique mais il semblerait quand même qu’une faille embêtante existe au sein du formulaire de base.

    L’explication par l’exemple, on peut injecter du code via le fomulaire.

    3 novembre 2010, 14:54

  • bb

    Salut, oui on peut entrer du html dans les champs des formulaires de SPIP (et pas seulement celui des forums). Ce n’est pas une faille mais une fonctionnalité :p

    On peut bien sûr se poser la question de la validité ou de l’intérêt d’une telle fonctionnalité (on a déjà discuté de l’éventualité d’interdire tout code html dans les formulaires de forum à l’aide du plugin nospam). N’hésite pas à venir en discuter sur la liste spip-dev ou spip-zone.

    ++

    4 novembre 2010, 13:07

  • Khay

    Bonjour,

    merci pour la réponse :), j’avoue ne pas avoir trouvé de doc spécifique sur la théorie qui se cache derrière le formulaire de forum, de même j’ai été plutôt déconcerté par la construction du formulaire puisque la partie html prévoit une gestion assez poussée des forums, toutes les span de récupération des erreurs etc. étant présentes. Pourtant la partie php "s’arrête en chemin" lorsqu’elle s’attaque à la partie vérifier, par exemple la syntaxe de l’email optionnelle n’est pas filtrée et de base aucun message d’erreur n’est renvoyé.

    Si tu as un lien sur le sujet je suis plus que preneur ;)

    @+

    8 novembre 2010, 10:03

  • bb

    Salut, l’email optionnel n’est pas vérifié car il est justement...optionnel ;) Tu peux t’inspirer du code que je donne dans cet article pour ajouter une vérification sur l’email à l’aide de la fonction email_valide() de SPIP.

    ++

    8 novembre 2010, 14:39

  • Khay

    Bonjour,
    je comprends bien que ces champs ne sont pas traités car ils sont optionnels, cependant je vois plutôt des champs optionniels comme des champs que l’utilisateur peut remplir ou laisser vide, mais cela n’implique pas que les données saisies si ce dernier choisit de les saisir ne soient pas traitées.

    Evidemment c’est une question de point de vue :]

    22 novembre 2010, 09:34

  • Suske

    haaa ! Bien bien...

    Merci b_b !

    ¨Placé ici : http://forum.spip.org/fr_231904.html

    (moi j’aime bien qu’on puisse utiliser le html :-p)

    27 janvier 2011, 16:51

  • Fil

    Ca répond au besoin, mais c’est trop de code. A la réflexion ce serait peut-être pas mal d’avoir la possibilité de déclarer "obligatoire" n’importe quel champ de n’importe quel CVT avec une technique déclarative toute simple, dans le charger() ou dans le squelette du formulaire ?

    2 février 2011, 15:28

  • Fredalex

    Bonjour,
    J’utilise votre astuce mais j’ai quelques utilisateurs qui me remontent que cela ne fonctionnent pas. Car malgré la présence d’un pseudo, le formulaire le demande toujours.
    Le problème est uniquement pour certain utilisateur d’internet-explorer...
    Mais je n’arrive pas à reproduire ce type de problème sur mon PC...

    7 février 2011, 23:17

  • tetue

    Ouais super ! Ca fait justement partie des évolutions à apporter au Plugin Comments !

    26 avril 2011, 17:54

  • emilieb

    les plus dure pb sont se qu’on ne peut pas reproduire !

    21 février 2012, 14:27

  • Pat

    Pour information, le Couteau Suisse gère désormais le pipeline formulaire_verifier pour sa lame "Pas de forums anonymes" et utilise jQuery pour la cosmétique et les mentions "(obligatoire)" :

    http://zone.spip.org/trac/spip-zone/changeset/71880

    10 avril 2013, 05:00

  • Laure

    Merci !!!!!!

    28 octobre 2013, 19:27

Répondre à cet article

Qui êtes-vous ?
Ajoutez votre commentaire ici
  • Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.