Comment changez-vous l'emplacement de la sortie de `form_set_error`?

9

Existe-t-il un moyen dans Drupal 7 de changer l'emplacement de la sortie de form_set_error?

À l'heure actuelle, il appelle drupal_set_messagequi met en file d'attente toutes les erreurs du formulaire en haut de l'écran.

Ce que j'aimerais à la place, c'est que chaque message apparaisse sous le champ approprié.

Si cela n'est pas possible, puis-je marquer manuellement le formulaire comme "non valide" dans la MODULE_form_name_validate()fonction sans utiliser form_set_error?

Chris
la source

Réponses:

7

Le module Erreurs de formulaire en ligne a cette fonctionnalité:

IFE ou Inline Form Errors vous permet de placer l'erreur de soumission de formulaire en ligne avec les éléments du formulaire. Trois options sont fournies pour définir votre comportement d'erreur en ligne. Vous pouvez configurer le comportement par défaut ou remplacer le comportement par formulaire. Vous pouvez ajouter autant de formulaires que vous le souhaitez.

La version Drupal 7 n'est qu'en alpha mais je dirais que ça vaut le coup d'essayer. Même s'il y a des problèmes, cela devrait vous donner un bon endroit pour commencer à implémenter votre propre version. Voici la capture d'écran du module:

entrez la description de l'image ici

Clive
la source
Ce module est vraiment ancien. Je l'ai testé mais c'est tellement mauvais en termes de personnalisations. Malheureusement inutile pour les formulaires que vous avez déjà créés sans ces créations de formulaires cliquables.
kwoxer
8

En étendant la réponse (correcte) de Clive, j'ai travaillé sur le code IFE. Je n'avais pas vraiment besoin d'un module entier dédié à cela, j'ai donc adopté quelques extraits ici et là pour obtenir le résultat dont j'avais besoin. J'ai marqué sa réponse comme correcte parce que c'est finalement la bonne réponse.

Le code est ci-dessous, tout le mérite revient à Clive et à l'équipe IFE - je voulais juste présenter la version simplifiée pour tous ceux qui recherchent une réponse similaire.

// Standard gear - do some custom validation and set the errors
// as you go..
// 
// Once all the validation has been done, call MODULE_errors_reset
// which will return an array of all errors against their ID. 
// Expose this array however you like to your template, or loop
// over your form adding a #suffix to each element with an error
//
function MODULE_form_name_validate($form, &$form_state) {
    drupal_set_message("validating...");

    form_set_error("description", "There is an error here!!!!");
    form_set_error("tags", "Yep, and here too!!!");

    $reset_errors = MODULE_errors_reset( $form );

    drupal_set_message( "<pre>" . print_r( $reset_errors, true ) . "</pre>" );
}

// This part is adopted from IFE. It's changed in two ways, it returns
// an array (which also merges with its recursive self). 
// And it also skips all the 'display' stuff present in the original
// Essentially it extracts out the error messages from the session and unsets 
// them. I am assuming that Drupal 7 marks the success of a validation based not
// whether the SESSION variable contains anything, the SESSION seems to be only
// for the message at the top of the screen.
//
function MODULE_errors_reset( $element ) {
    if( ! isset( $_SESSION[ 'messages' ] ) ) {
        return;
    }

    $reset_errors = array();

    // Recurse through all children.
    foreach( element_children( $element ) as $key ) {
        if( isset( $element[ $key ] ) && $element[ $key ] ) {
            $reset_errors += MODULE_errors_reset( $element[ $key ] );
        }
    }

    // Check for errors and settings
    $errors = form_get_errors();
    $element_id = implode( '][', $element[ '#parents' ] );

    if ( !empty( $errors[ $element_id ] )) {
        $error_message = $errors[ $element_id ];

        // Get error id
        $error_id = array_search( $error_message, $_SESSION[ 'messages' ][ 'error' ] );

        if( $error_id !== FALSE ) {
            unset( $_SESSION[ 'messages' ][ 'error' ][ $error_id ] );
            $_SESSION[ 'messages' ][ 'error' ] = array_values( $_SESSION[ 'messages' ][ 'error' ]  );

            if( count( $_SESSION[ 'messages' ][ 'error' ] ) <= 0 ) {
                unset( $_SESSION[ 'messages' ][ 'error' ] );
            }

            $reset_errors[ $element[ '#id' ] ] = $error_message;
        }
    }

    return $reset_errors;
}

// If there are no form errors, we still hit here, even after the 'reset', this is
// a good thing. 
function MODULE_form_name_submit( $form, &$form_submit ) {
    drupal_set_message("submited!");
}
Chris
la source
Salut Chris, lorsque vous dites "exposez ce tableau comme vous le souhaitez à votre modèle, ou parcourez votre formulaire en ajoutant un #suffix à chaque élément avec une erreur", comment puis-je accéder à la variable $ reset_errors renvoyée dans la fonction de validation de mon formulaire une fonction? Serait-il correct de fournir un exemple d'affichage pour cela? Merci!
Leolando Tan
@LeolandoTan Désolé mon pote - Je n'ai pas utilisé Drupal depuis 2013 - Je ne me souviens même pas d'avoir répondu à cette question!
Chris