Могу ли я использовать 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" и одно обрезанное "заголовок", которое будет полезно для сортировки и отображения записей.
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.
Я довольно новичок в Drupal, но до сих пор я находил фреймворк Ajax довольно негибким. Он отлично работает, пока вы используете его так, как было задумано. Так что в вашем случае, если вы знаете некоторые JS, лучшим, безусловно, было бы сделать этот сценарий своим, он должен быть очень легким.
Удачи!
Другой вариант, из 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;
}