Я пытаюсь использовать 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» и одно обрезанное «заголовок», которые будут полезны для сортировки и отображения записей.
Ответы:
Похоже, что вы можете нацеливаться на разные части формы с помощью команд ajax, однако вы должны выбрать возвращать только одно из:
HTML или
Renderable массив или
Массив команд AJAX
В ситуации, о которой я изначально писал, я пытался вернуть и массив команд AJAX, и рендеринг-массив, что не представляется возможным.
Код в модуле примеров демонстрирует нацеливание на разные части формы с использованием массива команд AJAX:
В этом примере кода #html_div получает $ text, а отдельно #html_status получает «Обновленный html_command_example with text = $ text;». дата ('r'). «»
Два разных местоположения в форме с двумя разными частями информации от одного обратного вызова ajax!
Посмотрев еще раз на то, над чем я работал, я понял, что мне вообще не нужно возвращать поле заголовка узла. Это будет только служебное поле, используемое для сортировки данных в списках.
Я скрыл поле в форме узла, и оно заполняется во второй раз, когда создается моя форма, когда запускается мой исходный обратный вызов ajax.
источник
Я довольно новичок в Drupal, но пока я обнаружил, что Ajax-инфраструктура довольно негибкая. Он прекрасно работает, пока вы используете его, как и было задумано. Так что в вашем случае, если вы знаете какой-то JS, лучше всего было бы сделать этот скрипт самим собой, он должен быть очень легким.
Удачи!
источник
Другой вариант от drupal.org :
Ваша функция обратного вызова может быть такой простой, как:
Это следует вызывать из
#ajax
массива элемента формы (field_whatever
для примера ниже), определенного вhook_form_FORM_ID_alter()
(или в некотором виде хуке изменения формы), где вы также проверяете$form_state
и вносите изменения в$form
массив, например:источник