web-dev-qa-db-ja.com

検証ハンドラー内での永続的な値のフォームへの格納

送信ハンドラの_$form_state_に永続的な値を格納できます。これはフォームエラーに対して保持されますが、検証ハンドラでform_set_error()

要するに、「確認のために送信をもう一度押してください」というメッセージで検証のエラーを表示したいと思います。このように、同じフォームが再度送信された場合、検証ハンドラーはスキップされます。

フォームの値をクリアするので、送信ハンドラーではできません。

form_set_value()は値を保持できません。

編集(12月28日)

$ form_state ['storage']は、form_state ['rebuild]がtrueに設定されている場合にのみ、バリデーターでも機能することがわかりました。実際、これは送信ハンドラでの使用方法です。また、バリデーターでform_set_errorを呼び出した場合、form_state ['rebuild]は設定されていても無視され、ストレージ値は保持されません。

4
AgA

$form_state['storage']はおそらくあなたが探しているものです。フォーム処理のさまざまな段階で必要なデータを保持するために、自分でマルチステップフォームで使用しました。例として、次のようにストレージ変数を定義できます。

$form_state['storage']['mykey'] = 'myval';

編集:あなたが提供した追加情報を考慮すると、実際には特定のケースではそれほど単純ではありません。設定$form_state['rebuild'] = TRUE;は、フォーム検証ハンドラで、ユーザーが設定したフォーム値が失われることも意味します。だからあなたができると思うのは次のことです:

フォーム検証ハンドラ関数で:

if (!isset($form_state['storage']['mykey'])) {
  $form_state['storage']['mykey'] = 'myval';
  // Save all the user set form values.
  foreach ($form_state['values'] as $key => $val) {
    // If you want to skip some values do it here.
    $form_state['storage']['values'][$key] = $val;
  }
  $form_state['rebuild'] = TRUE;
  drupal_set_message('Press submit again to confirm');
}

フォームビルダー関数では、保存された値をデフォルトとして使用します。例:

$form['key_1'] = array(
    '#type' => 'radios',
    '#title' => t('Title'),
    '#options' => array(0,1,2),
    '#default_value' => $form_state['storage']['values']['key_1'],
);

サンプルコードがどの程度ニーズに合っているかはわかりませんが、それを始めるか、少なくとも試すためのアイデアやオプションを提供する必要があります。

4
Madis

一意のフィールド モジュールは、フォーム検証のオーバーライドに関して同様のことを行います。そのコードを入手して、ニーズに合わせて変更できるかどうかを確認してください。

1
Jimajamma