Drupal 7でAjaxをフォームで変更する方法


8

「メインメニュー」という名前のコンテンツタイプを作成しました。互いに依存している選択リストはほとんどありません。別のチェックボックスが選択されているときに別のリストを表示したいと思いました。私はそれを実現するためにフォームを編集するためにAjaxを使用する必要があることを理解しましたが、hook_form_alterでAjaxを使用する方法を誰かに教えてもらえますか?

編集するフォームのフォームIDは「main_menu_node_form」です。を使用してこのフォームにアクセスし、フォームフィールドのプロパティをhook_form_alter()追加しようとすると#ajax、ハンドルがに渡される前にフィールドが既にレンダリングされているため、そうすることができないようですhook_form_alter()。誰かがこれを解決するのを手伝ってくれませんか?

注:を使用してコンテンツタイプを作成しましたhook_install()

function main_menu_content_type_form_main_menu_node_form_alter(&$form, &$form_state, $form_id) {
  dpm($form);
  dpm($form_state);

  $form['field_mlnk'] = array(
    '#ajax' => array(
      'callback' => 'main_menu_content_type_form_main_menu_node_form_alter_callback',
      'wrapper' => 'link-div',
      'method' => 'replace',
      'effect' => 'fade',
    ),
  );
}

1
変更しようとしているフォームのコードと、それを変更するために使用しているコードを確認すると役に立ちます。
kiamlaluno

@kiamlaluno hook_install関数を使用してコンテンツタイプmain_menuを作成しました。リストでの選択に従ってコンテンツを追加しながらフィールドを表示したいと思いました。ajaxプロパティをhook_installまたはHook_form_alterに追加する必要があります。
Drupal開発者

それでも、使用しているコードを確認しておくと便利ですhook_form_alter()(あなたが書いたように、「form alter […[…]を使用してこのフォームにアクセスしようとしたとき」)。
kiamlaluno

@kiamlalunoコードスニペットを質問に追加しました。親切にそれを見て、コードが機能するかどうか教えてください。
Drupal開発者

のコードも表示すると完璧ですmain_menu_content_type_form_main_menu_node_form_alter_callback()。その関数に誤ったコードが含まれている場合、ユーザーはコードを機能させるためにコードに対して行う必要がある変更を報告できません。
kiamlaluno

回答:


7

カスタムモジュールの実際のコードを含めると、hook_form_alterで何が問題になっているのかについての詳細な情報を提供できます。ただし、具体的なことは何も伝えていないので、ビデオを見ることができます。Drupal7で美しいフォームを作成する方法(ajaxが記述された瞬間から始まるようにURLを入力したことに注意してください)。これを見て約5分で、おそらくajaxをhook_form_alterで使用する方法が正確に説明されているため、質問に対する回答が得られますが、本当に焦っている場合は、実際のコードがこのあたりに表示されます

あなたは、AJAXを使用して変更されている形式のライブ、十分にテストされ、文書化の例を見たい場合は、1つあります例のモジュール。ここで実際のフックとコールバック関数をここで見つけることができます。

これがお役に立てば幸いです。そうでない場合は、コードの背景をもう少し教えていただければ、私たちはあなたが間違っていることを正確に伝えることができます。


@ F123Kフォームに新しいフィールドを追加するのではなく、フォームの既存のフィールドを変更したいと思いました。それで、どうしたらそれができるのか教えてください。
Drupal開発者

サンプルフックとコールバック関数で編集された投稿。
F1234k 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.