Вызов 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 в одной и той же форме?

3
0
1
Общее количество ответов: 1

Ответ #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 что-то подобное.

11
0