Подтвердить что ты не робот

Symfony2 → Twig → Form → Field → Set rendered = true

У меня есть простая проблема.

У меня есть форма с полем, например:

$builder
    ->add('x')
    ->add('y')
    ->add('z')
;

В моих файлах twig я использовал несколько блоков, и я хочу остановить поля рендеринга... Я просматриваю файл b.html.twig!

a.html.twig

{% block body %}
    {% block form %}
        {{ form_widget(form) }}
    {% endblock form %}
{% endblock body %}

b.html.twig

{% block form %}
    {{ form.x.set('rendered', true) | default() }}
    {{ parent() }}
{% endblock form %}

Если я удалю "default()", я получаю ошибку, что объект can not может быть преобразован в строку. И на самом деле форма отображает все поля... Включая поле x. Но они не должны отображать поле x...

Спасибо заранее!

4b9b3361

Ответ 1

Я пропустил здесь этот вопрос? Если вы хотите настроить поле как отображаемое, даже если это не простой вызов:

{% do form.x.setRendered %}

Если я неправильно понял, мои извинения.

Ответ 2

Вы должны удалить (или только добавить) поле формы в FormType, включив в него какую-то логику решения.

Например, проверка наличия/значения переменной cerain.

Затем эту переменную можно ввести в конструктор.

Удаление его из вашего шаблона - это логика приложения, которая не входит в ваш шаблон.

Если у вас нет другого выбора, посмотрите на метод FormView:: setRendered().

Вы можете получить доступ к объектным методам с помощью функции атрибутов Twigs :

{{ attribute(object, method, arguments) }}

Ответ 3

Вы можете использовать следующую инструкцию закрытия, чтобы предотвратить поля формы рендеринга, которые определены в Форме, но не описаны в шаблоне:

{{ form_end(form, {'render_rest': false}) }}

Например, мы определяем следующую форму:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'id',
            HiddenType::class,
            array(                                     
                'required' => false
            )
        )
        ->add(
            'name',
            TextType::class,
            array(                                     
                'required' => false
            )
        )
        ->add(
            'comment',
            TextType::class,
            array(
                'required' => false
            )
        )
        ->add(
            'amount',
            TextType::class,
            array(
                'required' => false
            )
        );
}

Для этой формы мы описываем следующий шаблон, но мы не хотим отображать поле id, поэтому мы можем использовать опцию render_rest в блоке form_end, чтобы опустить рендеринг поля id:

{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.comment) }}
{{ form_row(form.amount) }}
{{ form_end(form, {'render_rest': false}) }}