Могу ли я использовать ajax для нацеливания нескольких элементов формы с одного входа?

8

Я пытаюсь использовать ajax для обновления двух разных частей друпальной формы только из одного размытия ввода формы.

У меня есть стандартный AJAX материал на моем входе:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

Это работает хорошо, меняя мой div при обновлении ввода ... однако я также хочу обновить другой ввод формы в другом месте формы с другим кодом в результате размытия на моем исходном вводе.

Возможно ли это, какие-нибудь идеи?

Изменить: для ясности, вот мой пример из реального мира:

  • Тип контента 'фильм'
  • Добавлено поле 'primary_title'
  • Когда «primary_title» обновляется, мой обратный вызов ajax проверяет наличие похожих строк и возвращает html.
  • HTML-код из обратного вызова вставляется в пустой div.

    Эта часть работает отлично!

Я пытаюсь также изменить стандартный ввод 'title' для узла, присвоив ему значение 'primary_title' после того, как я выполнил некоторое регулярное выражение, чтобы привести строку в порядок (удалив "The" или "A" из начала и т. Д.). Результат будет два поля заголовка, одно с полным заголовком «primary_title» и одно обрезанное «заголовок», которые будут полезны для сортировки и отображения записей.

стог
источник

Ответы:

13

Похоже, что вы можете нацеливаться на разные части формы с помощью команд ajax, однако вы должны выбрать возвращать только одно из:

  • HTML или

  • Renderable массив или

  • Массив команд AJAX

В ситуации, о которой я изначально писал, я пытался вернуть и массив команд AJAX, и рендеринг-массив, что не представляется возможным.

Код в модуле примеров демонстрирует нацеливание на разные части формы с использованием массива команд AJAX:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

В этом примере кода #html_div получает $ text, а отдельно #html_status получает «Обновленный html_command_example with text = $ text;». дата ('r'). «»

Два разных местоположения в форме с двумя разными частями информации от одного обратного вызова ajax!

Посмотрев еще раз на то, над чем я работал, я понял, что мне вообще не нужно возвращать поле заголовка узла. Это будет только служебное поле, используемое для сортировки данных в списках.

Я скрыл поле в форме узла, и оно заполняется во второй раз, когда создается моя форма, когда запускается мой исходный обратный вызов ajax.

стог
источник
0

Я довольно новичок в Drupal, но пока я обнаружил, что Ajax-инфраструктура довольно негибкая. Он прекрасно работает, пока вы используете его, как и было задумано. Так что в вашем случае, если вы знаете какой-то JS, лучше всего было бы сделать этот скрипт самим собой, он должен быть очень легким.

Удачи!

silkAdmin
источник
Спасибо за предложение :) Я понял, что мне вообще не нужно возвращать поле заголовка узла, потому что оно просто используется как служебное поле для организации списков. Он заполняется, когда моя форма перестраивается в результате моего существующего обратного вызова ajax.
Рик
0

Другой вариант от drupal.org :

Вы можете легко заменить всю форму, если это проще всего. Просто добавьте #prefix и #suffix ко всему массиву формы, а затем установите его как #ajax ['wrapper']. (Это позволит вам изменить несколько элементов формы с помощью одного вызова ajax.) Единственная причина, по которой этого не сделать, заключается в том, что процесс происходит быстрее, если передается меньше информации.

Ваша функция обратного вызова может быть такой простой, как:

function _callback($form, $form_state) {
  return $form;
}

Это следует вызывать из #ajaxмассива элемента формы ( field_whateverдля примера ниже), определенного в hook_form_FORM_ID_alter()(или в некотором виде хуке изменения формы), где вы также проверяете $form_stateи вносите изменения в $formмассив, например:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
CDMO
источник