Вызов form_widget несколько раз с разными атрибутами - Symfony и Twig
Я несколько раз пытался вызвать виджет формы 9X_twig в своей форме с разными атрибутами. Я получаю 9X_twig сообщение об ошибке - Field "x" has already been rendered, save the result of previous render call to a variable and output that instead.
Я исправил все возможные 9X_symfony2 места, но для некоторых полей требуются 9X_symfony2 разные атрибуты. Например: -
form_widget(foo.bar, {'value' : 'image'}) }}
и
form_widget(foo.bar, { 'attr': { 'class': 'hidden' }} )
Есть ли возможность 9X_symfony3 вызвать виджет формы с разными параметрами 9X_symfony3 в одной и той же форме?
Ответ #1
Ответ на вопрос: Вызов form_widget несколько раз с разными атрибутами - Symfony и Twig
Повторное использование одного и того же 9X_twig виджета несколько раз, как и вы, может иметь 9X_twig странные побочные эффекты, потому что Symfony 9X_twig также установит идентификатор html, и в 9X_symfony зависимости от того, где вы разместите поле, вы 9X_symfony3 можете получить недопустимый html, который 9X_symfony может, например, привести к тому, что ваш 9X_symfony2 JavaScript будет ломать / делать странные 9X_symfony3 вещи или мешать отправке форм.
Самый безопасный 9X_symfony2 способ убедиться, что у вас есть действительный 9X_twig HTML (например, без дублированного идентификатора), - это 9X_symfony вручную отрисовывать каждый элемент, а затем 9X_symfony2 использовать только элементы формы для получения 9X_symfony текущего содержимого / ошибок. Для этого 9X_twig вы можете игнорировать помощники form_widget
и form_row
и просто 9X_twig написать HTML для полей самостоятельно, а 9X_symfony2 затем вставлять только те части, которые 9X_symfony2 вам нужны, например
Этот точный пример требует 9X_symfony2 Symfony 5.2, потому что field_name()
новый. См. https://symfony.com/blog/new-in-symfony-5-2-form-field-helpers
Обратной 9X_symfony2 стороной является то, что такие вещи, как 9X_symfony3 {{ form_rest(form) }}
, вероятно, больше не будут работать, но, по 9X_symfony крайней мере, вы все равно можете использовать 9X_symfony3 любой помощник, который выводит только часть 9X_symfony формы, которая не является элементом формы, например 9X_twig form_error
, form_label
по-прежнему должны работать, но form_widget
и form_row
следует 9X_twig избегать. form_end
снова отображает все оставшиеся 9X_twig поля, поэтому вам, вероятно, также следует 9X_symfony3 избегать этого. Более конкретные помощники, представленные 9X_twig в Symfony 5.2, также очень удобны для этого 9X_symfony2 подхода. Таким образом, вы полностью контролируете 9X_twig отображение полей и можете изменять классы 9X_symfony2 для каждого поля, которое вы используете 9X_symfony в нескольких местах.
Если вы используете 9X_symfony2 старую версию Symfony, вы можете реализовать 9X_symfony вспомогательные методы самостоятельно, взглянув 9X_symfony3 на TwigExtension that provides them и настроив его для своего приложения, например 9X_symfony3 предоставьте собственное приложение AppTwigExtension 9X_twig с аналогичными функциями.
Если вы хотите 9X_symfony3 и дальше использовать form_widget
/ form_row
, вам следует избегать 9X_twig отрисовки одной и той же формы (элементов) несколько 9X_twig раз в одном запросе. Вы можете попробовать 9X_symfony использовать что-то вроде sub-requres / ESI, но 9X_symfony это, вероятно, будет взломано.
Существует 9X_symfony способ отрисовывать форму несколько раз, что 9X_symfony3 позволяет отрисовывать ее каждый раз по-разному. Например, вы 9X_symfony2 можете создать FormCollection с одним и 9X_symfony тем же типом, добавленным дважды. Тогда 9X_symfony2 у вас есть одна форма, содержащая 2 формы 9X_twig (ваша форма дважды). Вы также можете создать 9X_twig несколько экземпляров для одной и той же 9X_symfony2 формы, а затем по-разному отображать их 9X_symfony3 в своем шаблоне в зависимости от того, какой 9X_symfony3 из них вы используете (foo или bar), например 9X_twig что-то вроде этого (только набросок, не 9X_twig уверен, что это точно сработает):
public function contact(Request $request): Response { $form1 = $this->createForm(FooFormType::class, null, ['attr' => ['id' => 'form1']]); $form1->handleRequest($request); if ($form1->isSubmitted() && $form1->isValid() { // ... } $form2 = $this->createForm(FooFormType::class, null, ['attr' => ['id' => 'form1']]); $form2->handleRequest($request); if ($form2->isSubmitted() && $form2->isValid() { // ... } // Do something return $this->render('....html.twig', [ 'foo' => $form1->createView(), 'bar' => $form2->createView(), ]); }
Как видите, это 9X_symfony2 немного избыточно, поэтому в целом вам следует 9X_twig избегать этого подхода, но вы должны найти 9X_symfony3 в Интернете несколько примеров людей, делающих 9X_twig что-то подобное.
-
5
-
7
-
2
-
1
-
3
-
2
-
5
-
3
-
3
-
3
-
5
-
10
-
4
-
5
-
3
-
2
-
1
-
2
-
1
-
7
-
2
-
1
-
2
-
7
-
6
-
1
-
2
-
2
-
3
-
5
-
3
-
5
-
3
-
3
-
2
-
4
-
1
-
4
-
3
-
2
-
4
-
2
-
3
-
3
-
4
-
1
-
13
-
11
-
4
-
2