form_set_error()を正しく使用するにはどうすればよいですか?


8

私のDrupal 7モジュールには、フォームとその検証ハンドラーがあります。フォームをfield.tpl.phpからprint render(drupal_get_form('my_form')); 期待どおりに動作します。

問題は、入力値が間違っている場合です。

エラーメッセージを表示する前に、2つの誤った送信が必要です。1回目は、間違った入力の周りに赤い枠があり、2回目は、エラーメッセージが表示されます(赤い枠が付いています)。

それで、正しい使い方はform_set_error()何ですか?


drupal_set_error()機能はありません。あなたが意味していないと確信していますform_set_error()か?
kiamlaluno

あなたが正しいです!つまりform_set_error()です!最初の投稿を更新しようとしています。
druvik

回答:


6

フォームビルダーは、遅すぎるため、テンプレートファイル内で呼び出されることは想定されていません。を呼び出すとrender(drupal_get_form('my_form'))、エラーメッセージをレンダリングするコードが実行され、検証ハンドラーから報告される最終的なエラーメッセージは、から呼び出されるdrupal_set_message()から現在のセッションに保存されform_set_error()ます。

エラーメッセージを印刷するコードは、page.tpl.phpファイルにあります。

<?php if ($breadcrumb): ?>
  <div id="breadcrumb"><?php print $breadcrumb; ?></div>
<?php endif; ?>

<?php print $messages; ?>

drupal_set_message()表示するメッセージを保存するコードは次のとおりです。

  if ($message) {
    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }

    if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type][] = $message;
    }

    // Mark this page as being uncacheable.
    drupal_page_is_cacheable(FALSE);
  }

OK。form_set_error()テンプレートファイルでの使用は間違った方法であることを理解しています。それで、正しい方法は何ですか?
druvik 2012年

1
drupal_get_form()テンプレートファイル内ではなく、モジュール内で呼び出す必要があります。
kiamlaluno

OK、それをモジュールに入れ、Display Suiteを使用して自分のページに表示しました。ありがとう。
druvik 2012年

それがあなたを助けたならば、あなたはこれを正しい答えとしてマークするべきです。
Malks、2012年

8

代わりにform_set_errorを確認する必要があります

次のような要素がある場合:

function my_custom_module_form() {
  $form = array();
  $form['my_element'] = array(
    '#type' => 'textfield',
    '#title' => 'My Text field',
    '#default_value' => 'Some default text.',
  );
  return $form;
}

検証コールバック関数で、の値$form_state['values']が無効であることが判明した場合にこれを実行します

function my_custom_module_form_validate($form, &$form_state) {
  // Do some checking on $form_state['values'], if you don't like it.
  form_set_error('my_element', 'This is the error message that will be displayed.');
}

実際、それが私が使用する関数です。(私は私の最初の投稿からのエラーを修正します)。
druvik

1

form_set_error()hook_validate()LSU_JBobが応答するように、関数内で呼び出す必要があります。


検証ハンドラはの実装ではありませんhook_validate()
kiamlaluno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.