Wofür wird $ form_state verwendet?

33

Wofür wird $form_stateim Kontext der Formular-API normalerweise verwendet, wenn sie als Argument verwendet wird?

Insbesondere suche ich nach einem Beispiel, wann es verwendet wird.

chrisjlee
quelle

Antworten:

48

$form_stateist 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(). Siehe drupal_redirect_form()für vollständige Informationen.
  • Cache: Wenn diese Option auf TRUEdie 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 $formund $form_statewerden bei jeder dieser Seitenanforderungen von Grund auf neu erstellt. Häufig ist es erforderlich oder erwünscht, die Variablen $formund $form_statevon 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 $formund $form_stateautomatisch 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_statefü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_stateals 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 $formin comment_form () hinzugefügten Werte ansehen . Zum Beispiel $form_stateenthält $form_state['values']['name']weil $formenthält $form['author']['name']. Wenn $form['field']es sich um ein Formularfeld handelt, $form_stateenthält es im Allgemeinen $form_state['values']['field'].

kiamlaluno
quelle
Wenn wir mit hook_form_alter Formularwerte ändern oder mehrwertige Feldschaltflächen deaktivieren möchten, sollte die Variable $ form oder $ from_state geändert werden (bei Implementierung mit AJAX oder ohne AJAX). Wird $ form_state speziell für Ajax verwendet?
kiranking
1
@kiranking Normalerweise gibt ein AJAX-Callback einen Teil des $formArrays 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.
kiamlaluno