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


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

У меня есть стандартный материал 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.

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

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

Author: Rick, 2011-07-17

3 answers

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

  • HTML или

  • Отображаемый массив или

  • Массив команд 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 с текстом=$text;".дата('r') . ""

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

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

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

 13
Author: Rick, 2011-07-22 04:33:37

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

Удачи!

 0
Author: silkAdmin, 2011-07-18 13:15:41

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

Вы можете легко заменить всю форму целиком, если это проще всего. Просто добавьте #префикс и #суффикс ко всему массиву форм, а затем установите его как #ajax['оболочка']. (Это позволит вам изменять несколько элементов формы с помощью одного вызова 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;
 }
 0
Author: cdmo, 2013-09-04 13:46:51