Рейтинг:0

Создание формы в пользовательском поле просмотра

флаг cn

Я работаю над небольшой функциональностью, которая позволяет встраивать «форму» в поле настраиваемых представлений в представлении, над которым я работаю.

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

Я использовал `drush generate plugin-views-field' и могу отображать элементы формы в методе render(), но на самом деле они ничего не делают, так как форма на самом деле не создается.

Было бы проще/возможно создать форму внутри модуля/src/Form (которая принимает дополнительные аргументы) и отобразить эту форму с помощью formBuilder->getForm() или есть способ построить и отобразить форму внутри представлений плагин?

Форма должна работать через ajax, чтобы можно было сделать быстрое редактирование без перезагрузки страницы.

Любая помощь будет принята с благодарностью.

Согласно комментариям ниже, похоже, я могу сделать что-то вроде:

$form = \Drupal::formBuilder()->getForm('Drupal\resume\Form\WorkForm');
$form->sub_id = идентификатор;
вернуть $ форму;

Чтобы отобразить форму, а затем внутри конструктора форм используйте переменную sub_id, чтобы прикрепить ее к обратному вызову ajax и элементу-обертке.

Рейтинг:1
флаг cn

Да, для формы Drupal вам нужен класс формы, обрабатываемый FormBuilder. Вы можете разместить полученную сборку формы в любом месте страницы, поля представлений ничем не отличаются от других элементов страницы, таких как, например, блоки. В вашем случае сложно иметь несколько экземпляров одной и той же формы на странице. Затем вам нужны уникальные идентификаторы форм, обертки ajax и элементы отправки. Видеть Использование одной и той же формы более одного раза на странице с обратными вызовами AJAX

Также имейте в виду, что Views Ajax и Form API Ajax имеют разные конечные точки, и их совместное использование увеличивает сложность. Видеть Включение AJAX в представлениях прерывает работу кнопки Form API AJAX (Drupal 8)

Ex0r avatar
флаг cn
Да, мой план состоял в том, чтобы позволить построителю формы принимать дополнительные аргументы, которые будут передаваться в форму на уровне поля представлений, что будет передавать уникальный идентификатор объекта (по одному на строку) в форму, чтобы я мог создать идентификатор формы как #форма- и правильно установите элемент оболочки на основе переданных параметров. Представления ajax и формы ajax - это то, что я еще не рассматривал. Я думал, что форма ajax просто будет работать за кулисами, как обычно, и запускать/перестраивать форму, когда это необходимо.
4uk4 avatar
флаг cn
Это звучит как хороший план. Кстати, в этом случае вы не можете передавать параметры формы через метод сборки. Для идентификатора формы вам необходимо ввести параметр перед вызовом построителя форм, как показано в связанной теме. Пока вы не включите Ajax в представлениях, вы можете игнорировать вторую часть.
Ex0r avatar
флаг cn
Обновлен вопрос, чтобы отразить ваши изменения. Это кажется правильным? Кроме того, на странице есть представления ajax, но он использует модуль views_expandable_table для расширения/свертывания последнего столбца каждой строки таблицы в дополнительную строку. Я не уверен, будет ли это мешать форме ajax или нет, но я попробую. Кроме того, я не знаю, как обновить строку таблицы после фактической отправки формы (форма способна обновлять несколько значений, перечисленных в соответствующей строке таблицы в виде столбца).
4uk4 avatar
флаг cn
В обратном вызове ajax вы можете обновить любую часть страницы, в том числе за пределами формы. - Кстати, в отредактированном вопросе вы не использовали правильный пример кода из связанной темы, вам необходимо ввести параметр перед вызовом FormBuilder.[FormBuilder::getForm()](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormBuilder.php/function/FormBuilder%3A%3AgetForm) принимает оба, форма имя класса или уже созданный экземпляр объекта формы.
Ex0r avatar
флаг cn
Это кажется контрпродуктивным. Разве formBuilder->getForm() не создает экземпляр класса формы? Наверное, я не понимаю, почему вам сначала нужно создать экземпляр класса с помощью другого метода, когда построитель форм уже создает экземпляр объекта. Я попробую.
Ex0r avatar
флаг cn
Я закончил тем, что провел некоторое тестирование, и то, что вы связали, в конечном итоге сработало. Мне все еще нужно выяснить, как повторно запустить запрос представлений для повторного запуска обратного вызова ajax для указанной строки, но я могу работать над этим после того, как форма заработает. Спасибо!

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

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