Wofür wird $form_state
im Kontext der Formular-API normalerweise verwendet, wenn sie als Argument verwendet wird?
Insbesondere suche ich nach einem Beispiel, wann es verwendet wird.
$form_state
ist eines der Argumente, die an einen Formularübergabehandler oder einen Formularüberprüfungshandler übergeben wurden; Die Hauptverwendung besteht darin, die vom Benutzer in das Formular eingegebenen Werte abzurufen (siehe Inhalt von $form_state['values']
). Sie enthält jedoch andere Werte, die für andere Zwecke verwendet werden können.
Die Dokumentation für drupal_build_form () enthält die Liste der anderen in diesem Array enthaltenen Werte, einschließlich der folgenden:
- Neuerstellung: Normalerweise gilt nach Abschluss der gesamten Formularverarbeitung und dem Ausführen der Submit-Handler ein Formular als abgeschlossen, und drupal_redirect_form () leitet den Benutzer mithilfe einer GET-Anforderung auf eine neue Seite um (sodass eine Browseraktualisierung nicht erneut gesendet wird) die Form). Wenn jedoch 'rebuild' auf TRUE gesetzt wurde, wird sofort eine neue Kopie des Formulars erstellt und anstelle einer Umleitung an den Browser gesendet. Dies wird für mehrstufige Formulare wie Assistenten und Bestätigungsformulare verwendet. Wird normalerweise
$form_state['rebuild']
von einem Submit-Handler festgelegt, da normalerweise die Logik in einem Submit-Handler bestimmt, ob ein Formular fertig ist oder einen anderen Schritt erfordert. Möglicherweise hat ein Validierungshandler jedoch bereits festgelegt$form_state['rebuild']
, dass die Formularverarbeitung Übermittlungshandler umgeht und stattdessen das Formular neu erstellt, selbst wenn keine Validierungsfehler vorliegen.- Weiterleiten: Wird verwendet, um das Formular bei der Übermittlung weiterzuleiten. Dies kann entweder eine Zeichenfolge sein, die die Ziel-URL enthält, oder ein Array von Argumenten, die mit kompatibel sind
drupal_goto()
. Siehedrupal_redirect_form()
für vollständige Informationen.- Cache: Wenn diese Option auf
TRUE
die ursprüngliche, nicht verarbeitete Formularstruktur festgelegt ist, wird sie zwischengespeichert, sodass das gesamte Formular aus dem Cache wiederhergestellt werden kann. Ein typischer Formular-Workflow umfasst zwei Seitenanforderungen. Zunächst wird ein Formular erstellt und gerendert, damit der Benutzer es ausfüllen kann. Anschließend füllt der Benutzer das Formular aus und sendet es. Dadurch wird eine zweite Seitenanforderung ausgelöst, in der das Formular erstellt und verarbeitet werden muss. Standardmäßig$form
und$form_state
werden bei jeder dieser Seitenanforderungen von Grund auf neu erstellt. Häufig ist es erforderlich oder erwünscht, die Variablen$form
und$form_state
von der ersten Seitenanforderung bis zu derjenigen, die die Übermittlung verarbeitet, beizubehalten. 'cache' kann dazu auf TRUE gesetzt werden. Ein prominentes Beispiel ist eine Ajax-fähige Form, in derajax_process_form()
Aktiviert die Formularzwischenspeicherung für alle Formulare, die ein Element mit der Eigenschaft #ajax enthalten. (Der Ajax-Handler hat keine Möglichkeit, das Formular selbst zu erstellen. Er muss sich daher auf die zwischengespeicherte Version verlassen.) Beachten Sie, dass die Persistenz von$form
und$form_state
automatisch für (mehrstufige) Formulare erfolgt, für die das Flag "Neuerstellung" unabhängig vom Wert für gesetzt ist 'Zwischenspeicher'.- storage:
$form_state['storage']
ist kein spezieller Schlüssel und wird in der Formular-API nicht speziell unterstützt. In der Tradition war dies der Ort, an dem anwendungsspezifische Daten für die Kommunikation zwischen den Funktionen "Senden", "Validieren" und "Formularerstellung" gespeichert wurden, insbesondere in einem mehrstufigen Format. Formularimplementierungen können$form_state
für diese Art der Speicherung alle Schlüssel verwenden ( außer den hier aufgelisteten und anderen reservierten Schlüsseln, die von Formular-API-Interna verwendet werden). Die empfohlene Methode, um sicherzustellen, dass der ausgewählte Schlüssel nicht mit den von der Formular-API oder anderen Modulen verwendeten Schlüsseln in Konflikt steht, besteht darin, den Modulnamen als Schlüsselnamen oder ein Präfix für den Schlüsselnamen zu verwenden. Beispielsweise verwendet das Knotenmodul$form_state['node']
In Knotenbearbeitungsformularen werden Informationen über den zu bearbeitenden Knoten gespeichert. Diese Informationen bleiben auch dann verfügbar, wenn Sie auf die Schaltfläche "Vorschau" klicken oder wenn Sie abschließend auf die Schaltfläche "Speichern" klicken.
Andere Funktionen, die $form_state
als Argument erhalten werden, sind hook_form_alter () und hook_form_FORM_ID_alter () .
Als Beispiel für Code, der dieses Argument verwendet, können Sie comment_form_submit () betrachten , das den folgenden Code enthält:
function comment_form_submit($form, &$form_state) {
$node = node_load($form_state['values']['nid']);
$comment = comment_form_submit_build_comment($form, $form_state);
if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
// Save the anonymous user information to a cookie for reuse.
if (user_is_anonymous()) {
user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
}
comment_save($comment);
$form_state['values']['cid'] = $comment->cid;
// Add an entry to the watchdog log.
watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));
// Explain the approval queue if necessary.
if ($comment->status == COMMENT_NOT_PUBLISHED) {
if (!user_access('administer comments')) {
drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
}
}
else {
drupal_set_message(t('Your comment has been posted.'));
}
$query = array();
// Find the current display page for this comment.
$page = comment_get_display_page($comment->cid, $node->type);
if ($page > 0) {
$query['page'] = $page;
}
// Redirect to the newly posted comment.
$redirect = array('node/' . $node->nid, array(
'query' => $query,
'fragment' => 'comment-' . $comment->cid,
));
}
else {
watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
// Redirect the user to the node they are commenting on.
$redirect = 'node/' . $node->nid;
}
$form_state['redirect'] = $redirect;
// Clear the block and page caches so that anonymous users see the comment
// they have posted.
cache_clear_all();
}
Um zu verstehen, was $form_state['values']
enthält, müssen Sie sich die $form
in comment_form () hinzugefügten Werte ansehen . Zum Beispiel $form_state
enthält $form_state['values']['name']
weil $form
enthält $form['author']['name']
. Wenn $form['field']
es sich um ein Formularfeld handelt, $form_state
enthält es im Allgemeinen $form_state['values']['field']
.
$form
Arrays zurück. Es ist der Form Builder, der den Inhalt von überprüft$form_state
. Das habe ich in allen AJAX-Rückrufen gesehen, die von Modulen implementiert wurden, die das Richtige tun.