$ form_stateは何に使用されますか?


33

$form_state引数として使用される場合、Form APIのコンテキストで通常使用されるのは何ですか?

具体的には、いつ使用されるかの例を探しています。

回答:


48

$form_stateフォーム送信ハンドラーまたはフォーム検証ハンドラーに渡される引数の1つです。その主な使用法は、フォームのユーザーから入力された値を取得することです$form_state['values'])のコンテンツを参照しますが、他の目的に使用できる他の値が含まれています。drupal_build_form()
のドキュメントには、その配列に含まれる次の値を含む他の値のリストが含まれています。

  • 再構築:通常、フォーム処理全体が完了して送信ハンドラーが実行された後、フォームが完了したと見なされ、drupal_redirect_form()はGETリクエストを使用してユーザーを新しいページにリダイレクトします(したがって、ブラウザーの更新は再送信されませんフォーム)。ただし、 'rebuild'がTRUEに設定されている場合、フォームの新しいコピーがすぐにビルドされ、リダイレクトではなくブラウザーに送信されます。これは、ウィザードや確認フォームなどのマルチステップフォームに使用されます。通常、$form_state['rebuild']フォームは実行されるか、別のステップが必要かを決定する送信ハンドラー内のロジックであるため、送信ハンドラーによって設定されます。ただし、$form_state['rebuild']検証エラーがない場合でも、フォーム処理が送信ハンドラをバイパスして代わりにフォームを再構築するように、検証ハンドラが既に設定されている場合があります。
  • redirect:送信時にフォームをリダイレクトするために使用されます。宛先URLを含む文字列、またはと互換性のある引数の配列のいずれかdrupal_goto()です。詳細についてはdrupal_redirect_form()、を参照してください。
  • cache:TRUE元に設定すると、未処理のフォーム構造がキャッシュされ、フォーム全体をキャッシュから再構築できます。典型的なフォームワークフローには2つのページリクエストが含まれます。まず、フォームが作成され、ユーザーが入力できるようにレンダリングされます。次に、ユーザーがフォームに入力して送信し、フォームを作成して処理する必要がある2番目のページ要求をトリガーします。デフォルトでは、$formおよび$form_stateこれらのページ要求のそれぞれの間にゼロから構築されています。多くの場合、それが必要であるか、存続したい$form$form_state提出を処理1に最初のページ要求から変数を。これを行うには、「キャッシュ」をTRUEに設定できます。顕著な例は、Ajax対応フォームです。ajax_process_form()#ajaxプロパティを持つ要素を含むすべてのフォームのフォームキャッシュを有効にします。持続ことを注意(Ajaxのハンドラはそうキャッシュされたバージョンに依存しなければならない、フォーム自体を構築する方法がない)$form$form_state関係なく、値の、「再構築」フラグのセットを有する(多段階)フォームに自動的に行われ'キャッシュ'。
  • storage:$form_state['storage']は特別なキーではなく、Form APIでの特別なサポートは提供されていません。伝統的には、特にマルチステップスタイルのフォームで、送信、検証、フォームビルダー機能間の通信のためにアプリケーション固有のデータが保存されていた場所でした。フォームの実装では$form_state、この種類のストレージに(ここにリストされているキーおよびForm API内部で使用される他の予約済みキー以外の)任意のキーを使用できます。選択したキーがForm APIまたは他のモジュールで使用されるキーと競合しないことを保証する推奨方法は、モジュール名をキー名またはキー名のプレフィックスとして使用することです。たとえば、Nodeモジュールは次を使用します$form_state['node'] ノード編集フォームでは、編集中のノードに関する情報を保存します。この情報は、「プレビュー」ボタンを連続してクリックしたとき、および「保存」ボタンが最後にクリックされたときに利用可能です。

$form_state引数として取得する他の関数はhook_form_alter()およびhook_form_FORM_ID_alter()です。

その引数を使用するコードの例として、次のコードを含むcomment_form_submit()を見ることができます。

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();
}

何を理解するために$form_state['values']含まれている、あなたはに付加価値を見てする必要がある$formcomment_form() 。例えば、$form_state含まれ$form_state['values']['name']ているため$form含まれてい$form['author']['name']。通常、$form['field']がフォームフィールドの場合、$form_stateが含まれます$form_state['values']['field']


hook_form_alterを使用してフォーム値を変更するか、複数値フィールドボタンを無効にする場合、どの変数を$ formまたは$ from_stateに変更する必要がありますか(AJAXを使用して、またはAJAXなしで実装する場合)。$ form_stateはajax専用に使用されていますか?
15年

1
@kiranking通常、AJAXコールバックは$form配列の一部を返します。のコンテンツをチェックするのはフォームビルダーです$form_state。これは、正しいことをするモジュールによって実装されるすべてのAJAXコールバックで見たものです。
キアマルノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.