回答:
$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']
含まれている、あなたはに付加価値を見てする必要がある$form
でcomment_form() 。例えば、$form_state
含まれ$form_state['values']['name']
ているため$form
含まれてい$form['author']['name']
。通常、$form['field']
がフォームフィールドの場合、$form_state
が含まれます$form_state['values']['field']
。
$form
配列の一部を返します。のコンテンツをチェックするのはフォームビルダーです$form_state
。これは、正しいことをするモジュールによって実装されるすべてのAJAXコールバックで見たものです。