1

Drupal 6.x を使用しています。私自身のモジュールでは、各ノードフォームを変更し、独自の検証ハンドラーを使用してそれに追加します

$form['#validate'][] = 'my_own_validation_function';

それから私は機能を持っています

function my_own_validation_function($form, &$form_state)
{
  //if validation fails, i would like to rebuild the form to add additional form elements in hook_form_alter
  $form_state['rebuild'] = True;
}

私の問題は、検証後にフォームが hook_form_alter によって処理されないため、検証関数が私の 'rebuild' = True を尊重しないことです。しかし、追加のフォーム要素を追加するには hook_form_alter が必要です。

私の問題の解決策はありますか? または、 &$form_state を「ポインター」として設定しても、独自の検証ハンドラーでの form_state の変更は尊重されませんか?

ありがとうございます。

4

3 に答える 3

1

わかりました!すべて問題ありませんでしたが、1 つの間違いがありました。自分の検証ハンドラーで form_set_error を設定しました。エラーが発生し、$form_state['rebuild'] = true の場合、関数 drupal_get_form はフォーム エラーがなくなるまでフォームを再構築しません。form.incの141行目で見つけました

if ((!empty($form_state['storage']) || !empty($form_state['rebuild'])) && !empty($form_state['submitted']) && !form_get_errors()) {
于 2010-05-26T16:04:16.933 に答える
0

それは私も働くべきだと思った方法です。再構築フラグがhook_form_alterに設定されないことを知っています。しかし、私の問題は、検証エラーで検証した後、そのhook_form_alterが再度呼び出されないことです。これがCCKフォームで真に機能するのか、それともdrupal_get_formによって作成された独自のフォームでのみ機能するのかを確認しますか?

于 2010-05-24T15:46:44.637 に答える
0

あなたhook_form_alterが再び呼び出されていないことを確信していますか、それともrebuildプロパティの true をチェックしているだけですか?

IIRC、あなたのアプローチは正しいです-$form_state['rebuild'] = True検証中に設定すると、フォームが再構築されます。しかし、通常、追加の「ポインタ」を設定します (たとえば$form_state['myModule_rebuild_indicator'] = TRUE、それをチェックしますhook_form_alter(「再構築」プロパティはその時点で再び false になります)。

于 2010-05-23T11:29:31.263 に答える