1つの#ajaxトリガー要素のみによってトリガーされる複数のフォーム要素(ラッパー)を置き換えることは可能ですか?


52
function ajax_example_simplest($form, &$form_state) {

  //This is my ajax trigger element
  $form['element_trigger'] = array(
    '#type' => 'select',
    '#options' => array(
      'one' => 'one',
      'two' => 'two',
      'three' => 'three',
    ),
    '#ajax' => array(
      'callback' => 'ajax_example_simplest_callback',

      /** Q: Can I somehow declare more than one wrapper? **/
      //Say for instance, something like:
      'wrapper' => array('replace_div_1', 'replace_div_2'),

     ),
  );

  //replace_div_1
  $form['element_to_be_replaced_1'] = array(
    '#type' => 'textfield',
    '#title' => t("My conditional field one"),
    '#prefix' => '<div id="replace_div_1">',
    '#suffix' => '</div>',
  );


 //... more form elements here

  //replace_div_2
  $form['element_to_be_replaced_2'] = array(
    '#type' => 'textfield',
    '#title' => t("My conditional field two"),
    '#prefix' => '<div id="replace_div_2">',
    '#suffix' => '</div>',
  );
  return $form;
}

function ajax_example_simplest_callback($form, $form_state) {

  //... do my stuff here


  //normally I would return only the form bit for replacing a single wrapper
  //declared in the trigger element, like this:
  return $form['element_to_be_replaced_blahblah'];

}

それは、AJAXフレームワーク伝えるコールバック関数の中で複数のフォームのビットを戻すことができる$form['element_to_be_replaced_1']置き換える必要がある<div id="replace_div_1">$form['element_to_be_replaced_2']交換する必要がありますが<div id="replace_div_2">

回答:


73

更新する単一要素のHTMLを返す代わりに、ajaxコールバックはajaxコマンドの配列を返すことができます。したがって、2つのajax_command_replaceを返して各要素を置き換えることができます。

function ajax_example_simplest_callback(&$form, $form_state) {
  return array(
    '#type' => 'ajax',
    '#commands' => array(
      ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1'])),
      ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']))
    )
  );
}

2
これは素晴らしいものです!! 多くの時間を節約しました。ありがとうございました:)
サンデシュヤダブ

24時間以内に報奨金が届きます。
-AyeshK

コールバック関数の名前を変更する必要がありました。関数ajax_example_simplest_callback(&$ form、$ form_state){}を使用すると、死の白い画面が表示されました。
Ghoti

5

Drupal 8の代替構文

use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;

class name extends FormBase{
   function ajax_example_simplest(array $form, FormStateInterface &$form_state) {
       $response = new AjaxResponse();
       $response->addCommand(new ReplaceCommand("#replace_div_1", ($form['element_to_be_replaced_1'])));
       $response->addCommand(new ReplaceCommand("#replace_div_2", ($form['element_to_be_replaced_2'])));
       return $response;
   }
}

1つの違いは、AjaxResponseがDrupal \ Core \ Render \ AttachmentsInterfaceを実装しているため、renderコマンドが削除されることです。

レンダリング($ form ['element_to_be_replaced_1'])

レンダーの追加は引き続き機能しますが、TableSelect Tableをそのように更新すると問題が発生しました。


うまくいきます。Drupalのドキュメントでは、Drupal 9
Ngatia Frankline

4

Pierre Buyleの答えは私にはうまくいきませんでした。ただし、次のようなものが機能しました。

function ajax_example_simplest_callback(&$form, $form_state) {
    $commands = array();
    $commands[] = ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1']));
    $commands[] = ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']));
    $page = array('#type' => 'ajax', '#commands' => $commands);
    ajax_deliver($page);
}

AJAXコマンドの配列を返すのではなく、ajax_deliver()の呼び出しに注意してください。


2
フォームで#ajax ['path']を使用していると思います。その場合、hook_menuの実装では、「deliver callback」プロパティを使用する必要があります。これにより、Drupalはページコールバックの結果をマークアップではなくAJAXコマンドとしてレンダリングします。ただし、ページコールバックで直接使用すると、通常のDrupalページ配信がバイパスされます。
ピエールバイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.