Рейтинг:1

Использование обратного вызова #submit в текстовом поле

флаг cn

Нам нужно добавить «повторяющиеся поля» в форму на основе ввода, предоставленного в текстовом поле. Обычно мы используем кнопку «добавить еще», чтобы отслеживать количество полей, отображаемых в построитьформу()и обновите этот номер в обратном вызове отправки на кнопке.

Однако функциональность, которую мы хотим, не такова. Нам нужно, чтобы когда кто-то вводит текст в текстовое поле (кроме пустого), под ним добавлялась дополнительная группа полей. Мы позволяем людям сканировать штрих-коды, и каждый раз, когда они сканируют штрих-код в текстовое поле, мы хотим, чтобы он создавал еще одну группу полей, чтобы они могли сканировать другой элемент, если захотят.

Мы попытались использовать #представить в текстовом поле, но #submit не срабатывает в текстовом поле, так как мы добавили оператор печати, а также $ форма-состояние-> установить () туда и попытайтесь распечатать $form_state->получить() на форме безрезультатно.

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

Есть ли другой способ сделать это?

(Мы разрешаем добавлять только 10 групп на каждую отправку, поэтому в качестве «обходного пути» мы динамически добавляем 10 групп в buildForm, а затем используем #состояния чтобы скрыть каждое из них, если предыдущее текстовое поле не содержит данных, но это не позволяет нам добавлять кнопку «удалить» для каждого текстового поля, чтобы пользователь мог удалить текстовые поля, которые он не хочет использовать.)

4uk4 avatar
флаг cn
Основной рабочий процесс Ajax-запроса заключается в проверке перестроения формы `$form_state->getTriggeringElement()` и построении формы с любым количеством новых элементов формы.
Gold avatar
флаг kz
Угол «повторяемых полей» в этом случае похож на то, к чему будут обращаться [Inline Entity Forms] (https://www.drupal.org/project/inline_entity_form). Они отлично работают с API состояний, а также позволяют устанавливать минимальное/максимальное/неограниченное количество элементов.
Ex0r avatar
флаг cn
Это полностью модульная форма, сгенерированная и функционирующая внутри метода buuldForm(). К форме нет присоединенных объектов.
Ex0r avatar
флаг cn
И что касается $form_state, я уже получаю элемент триггера, но я не могу обновить состояние формы внутри обратного вызова ajax, поэтому я не могу перестроить форму с необходимым количеством полей.
Jaypan avatar
флаг de
Вы можете добавить кнопку отправки с поддержкой ajax с помощью CSS, а затем использовать JS, чтобы «щелкнуть» ее при нажатии клавиши (или при размытии или что-то еще), вызывая #ajax. Вы можете поместить свой обработчик отправки на кнопку отправки.
4uk4 avatar
флаг cn
Нет необходимости в обработчике отправки при перестроении формы через Ajax. Что бы вы ни пытались сделать в обработчике отправки, переместите его в buildForm(), проверяя триггерный элемент в $form_state.

Ответить или комментировать

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