2

フォームが検証されない場合、URL から最初の引数以外をすべて削除する必要があるという状況があります。これは、フォームの結果がコンテンツ領域のフォームの下に表示されるためです。フォームが検証されない場合は、以前の結果を削除する必要があります。

form_validate 関数で次のことを試しました。

// Check if there were any errors.
$errors = form_set_error();
if (!empty($errors)) {
  drupal_goto(arg(0));
}

最初の引数を除くすべての引数が取り除かれていることを除いて、宛先ページは明らかに同じです。問題は、Drupal が以前のフォームの状態と form_validate 関数によって発生したエラーを忘れていることです。

また、form_validate 関数の #redirect 値を変更しようとしましたが、役に立ちませんでした。

助言がありますか?

4

2 に答える 2

1

あなたは自分自身を悪い状況に置きました。私の知る限り、$form_state を失うことなくリダイレ​​クトすることはできません。フォームが送信されない限りリダイレクトは機能しないため、フォームが検証されない限り、先に進むことはできません。

コードをどのようにセットアップするかはわかりませんが、変数を設定し、$form_stateそれを使用して結果を非表示/表示する必要があるかどうかを判断する方がうまくいくようです。

別のオプションは$form_state、グローバルに保存し$_SESSION['batch_form_state']て、フォームの開始時に使用することです。私はこれまで試したことがなく、少しハックですが、うまくいくはずです。

于 2010-06-23T19:12:11.423 に答える
0

大きくない場合は、フォーム データを に保存できます$_SESSION。次に、リダイレクト後に存在するかどうかを確認します。

Drupal には詳しくありませんが、フィルタリングされたフォームの値にアクセスできる必要があります。したがって、$_POSTフィールドで検証する代わりに、保存された$_SESSION値で検証します。

簡単な例

session_start();

// ... Previous Validation

// Check if there were any errors.
$errors = form_set_error();
if (!empty($errors)) {
    $_SESSION['form_state'] = $form_state;
    drupal_goto(arg(0));
}

リダイレクト後

session_start();

$form_state = $_SESSION['form_state']);
unset($_SESSION['form_state']);

// The rest of the script....
于 2010-06-23T18:28:48.760 に答える