回答:
これを処理する通常の方法は、マルチステップワークフローを実装することです。詳細についてはdrupal_rebuild_form()
を参照してください。ただし、基本的には$form_state['rebuild'] = TRUE;
送信ハンドラで設定し、元のフォーム関数でフォームが送信されたかどうかを確認するチェックを追加します。許可されている場合は、送信された値にアクセスでき、必要に応じてフォームを操作できます。
非常に基本的な例:
function MYMODULE_some_form($form, &$form_state) {
// If the form has been submitted, output something related to the submission
if (!empty($form_state['values']['some_field'])) {
$form['submission'] = array(
'#markup' => function_to_get_markup_from_value($form_state['values']['some_field'])
);
}
else {
// Otherwise build the normal form
$form['some_field'] = array(
'#type' => 'textfield',
// ...
);
}
return $form;
}
function MYMODULE_some_form_submit($form, &$form_state) {
$form_state['rebuild'] = TRUE;
}
フォーム送信ハンドラは、を使用drupal_set_message()
するか、を使用してログにメッセージを書き込むことのみができますwatchdog()
。
代わりに、セッションに必要なデータを保存し、セッション$form_state['redirect'] = 'page path';
のコンテンツが表示されるページにユーザーをリダイレクトします(を使用)。
function firstmodule_menu() {
$items['the path for your page'] = array(
'page callback' => 'firstmodule_show_submitted_data';
// ...
);
return $items;
}
function firstmodule_form1_submit($form, &$form_state) {
$_SESSION['firstmodule_username'] = $username;
// ...
$form_state['redirect'] = 'the path for your page';
}
function firstmodule_show_submitted_data() {
// Populate $result with the string to show.
return $result;
}
ちなみに、の最初の引数はt()
リテラル文字列でなければならず、2つの文字列を連結して取得した文字列ではありません。次のコードのように、プレースホルダーを使用する必要があります。
drupal_set_message(t("The user is %username", array('%username' => $username)));
送信されたすべてのデータがに保存され$form_state
ます。何が起こるかを確認したい場合は、develモジュールをインストールします。その後、常に次のように実行できます。
firstmodule_form1_submit
すべての配列$form_state
タイプdpm($form_state)
を出力する関数の内部 --そして、テキストボックスのユーザー名やその他を見つけることができる出力が表示されますが、これは次のようなものです$form_state['values']['username']
そして、あなたはそれを印刷することができます drupal_set_message(t($form_state['values']['username']);