Wie ändere ich den Speicherort der Ausgabe von `form_set_error`?

9

Gibt es in Drupal 7 eine Möglichkeit, die Position der Ausgabe von zu ändern form_set_error?

Im Moment wird aufgerufen, drupal_set_messagewelche Fehler des Formulars am oberen Bildschirmrand in die Warteschlange gestellt werden.

Ich möchte stattdessen, dass jede Nachricht unter dem entsprechenden Feld angezeigt wird.

Wenn dies nicht möglich ist, kann ich das Formular innerhalb der MODULE_form_name_validate()Funktion manuell als "ungültig" kennzeichnen, ohne es zu verwenden form_set_error?

Chris
quelle

Antworten:

7

Das Inline-Formularfehler-Modul verfügt über folgende Funktionen:

Mit IFE- oder Inline-Formularfehlern können Sie Fehler beim Senden von Formularen in die Formularelemente einfügen. Zum Einstellen Ihres Inline-Fehlerverhaltens stehen drei Optionen zur Verfügung. Sie können das Standardverhalten konfigurieren oder das Verhalten pro Formular überschreiben. Sie können beliebig viele Formulare hinzufügen.

Die Drupal 7-Version ist nur in Alpha, aber ich würde sagen, es ist einen Versuch wert. Selbst wenn es Probleme gibt, sollte es Ihnen einen guten Ort geben, um mit der Implementierung Ihrer eigenen Version zu beginnen. Dies ist der Modul-Screenshot:

Geben Sie hier die Bildbeschreibung ein

Clive
quelle
Dieses Modul ist wirklich alt. Ich habe es ausprobiert, aber es ist so schlecht in Bezug auf Anpassungen. Leider unbrauchbar für Formulare, die Sie bereits ohne diese klickenden Formularerstellungen erstellt haben.
Kwoxer
8

Ich habe die (richtige) Antwort von Clive erweitert und den IFE-Code durchgearbeitet. Ich brauchte nicht wirklich ein ganzes Modul dafür, also habe ich hier und da ein paar Schnipsel übernommen, um das gewünschte Ergebnis zu erzielen. Ich habe seine Antwort als richtig markiert, weil es letztendlich die richtige Antwort ist.

Der Code ist unten, alle Kredite gehen an Clive und das IFE-Team - ich wollte nur die vereinfachte Version für alle präsentieren, die nach einer ähnlichen Antwort suchen.

// 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
quelle
Hallo Chris, wie kann ich auf die Variable $ reset_errors zugreifen, die in der Validierungsfunktion in meinem Formular zurückgegeben wird, wenn Sie sagen "Dieses Array nach Belieben für Ihre Vorlage verfügbar machen oder Ihr Formular durchlaufen und jedem Element ein #suffix hinzufügen" Funktion? Wäre es in Ordnung, dafür eine Beispielanzeige bereitzustellen? Vielen Dank!
Leolando Tan
@LeolandoTan sorry Kumpel - Ich habe Drupal seit 2013 nicht mehr benutzt - Ich kann mich nicht einmal daran erinnern, diese Frage beantwortet zu haben!
Chris