これはどれも私にとってはうまくいきません。フォーム送信の ajax 関数は、コールバック関数を直接呼び出すだけで、検証、送信をバイパスし、ボタンを複数回クリックできないようにします。検証メッセージは表示されません。Joshua Stewardson のコードを文字通りコピーして貼り付けましたが、うまくいきませんでした。
この使用例が非常に難しく、文書化されていないという事実は、非常に動揺しています。私には、これが AJAX フォーム API の最も基本的な要求のように思えます。わかりました、私の欲求不満を解決策にぶつけました。
これを機能させるために私が最終的に行ったことは次のとおりです。ハッキーで遅れているように感じます。1 つのページにフォームのインスタンスが複数ある場合も壊れますが、これが最善の方法でした。誰かがこれに光を当てることができるなら、してください!
基本的に、コールバック内でフォーム全体をそれ自体に置き換え、設定されたメッセージを手動でフォーム オブジェクトに追加する必要があります。これを行うには、ラッパーをフォームの ID として宣言します (ID が更新されるため、1 つのページにフォームのインスタンスが複数ある場合は壊れます)。
function productsearchbar_savesearch_form($form, &$form_state) {
$form["wrapper"] = array("#markup" => "<div class='inline-messages'></div>");
$form["name"] = array(
"#type" => "textfield",
"#required" => true,
"#title" => "Name"
);
$form["submit"] = array(
"#type" => "submit",
"#value" => "Send",
"#ajax" => array(
"callback" => "productsearchbar_savesearch_form_callback",
"wrapper" => "productsearchbar-savesearch-form",
"effect" => "fade"
)
);
return $form;
}
function productsearchbar_savesearch_form_callback($form, &$form_state) {
$messages = theme('status_messages');
if($messages){
$form["wrapper"] = array("#markup" => "<div class='inline-messages'>$messages</div>");
}
return $form;
}
function productsearchbar_savesearch_form_validate($form, &$form_state) {
if ($form_state['values']['name'] == '') {
form_set_error('', t('Name field is empty!'));
}
}
function productsearchbar_savesearch_form_submit($form, &$form_state) {
drupal_set_message(t('Your form has been saved.'));
}