Довідник функцій та змінних форм шаблонів Twig

Дата оновлення перекладу 2022-06-01

Довідник функцій та змінних форм шаблонів Twig

При роботі з формами у шаблоні, у вашому розпорядженні існують дві потужні речі:

  • Функції для відображення кожної частини форми;
  • Змінні для отримання будь-якої информації про будь-яке поле.

Ви будете часто використовувати функції для відображення ваших полів. Змінні, з іншої сторони, використовуються рідше, але мають нескінченну потужність, так як ви можете отримати доступ до ярлику поля, атрибуту id, помилкам та будь-якій інформації про поле.

Функції відображення форми

Цей довідник охоплює всі доступні функції Twig для відображення форм. Існують декілька різних доступний функцій і кожна відповідає за відображення різних частин форми (наприклад, ярлики, помилки, віджети і т.д.).

form(view, variables)

Відображає HTML повної форми.

1
2
{# відобразити форму та змінити метод відправки #}
{{ form(form, {'method': 'GET'}) }}

Ви в основному використовуватимете цього помічника для прототипування або якщо ви використовуєте користувацькі теми форм. Якщо вам потрібна більша гнучкість при відображенні форми, ви маєте використовувати інших помічників, щоб відобразити окремі частини форми:

1
2
3
4
5
6
7
8
{{ form_start(form) }}
    {{ form_errors(form) }}

    {{ form_row(form.name) }}
    {{ form_row(form.dueDate) }}

    {{ form_row(form.submit, { 'label': 'Submit me' }) }}
{{ form_end(form) }}

form_start(view, variables)

Відображає стартовий тег форми. Цей помічник піклується про відображення сконфігурованого методу та цільової дії форми. Він також увімкне правильну властивість enctype, якщо форма містить поля завантаження.

1
2
{# відобразити стартовий тег та змінити метод відправки #}
{{ form_start(form, {'method': 'GET'}) }}

form_end(view, variables)

Відображає кінцевий тег форми.

1
{{ form_end(form) }}

Цей помічник також виводить form_rest(), хіба що ви не встановите render_rest як "false":

1
2
{# не відображати невідображені поля #}
{{ form_end(form, {'render_rest': false}) }}

form_label(view, label, variables)

Відображає ярлик заданого поля. Ви можете за бажанням передати конкретний ярлик, який ви хочете відобразити, у якості другого аргументу.

1
2
3
4
5
6
7
8
9
{{ form_label(form.name) }}

{# Два наступних синтаксиса еквівалентні #}
{{ form_label(form.name, 'Your Name', {'label_attr': {'class': 'foo'}}) }}

{{ form_label(form.name, null, {
    'label': 'Your name',
    'label_attr': {'class': 'foo'}
}) }}

Див. "Довідник функцій та змінних форм шаблонів Twig", щоб дізнатися про аргумент variables.

form_errors(view)

Відображає будь-які помилки для заданого поля.

1
2
3
4
{{ form_errors(form.name) }}

{# відобразити будь-які "глобальні" помилки #}
{{ form_errors(form) }}

form_widget(view, variables)

Відображає HTML-віджет заданого поля. Якщо ви застосуєте це до всієї форми або колекції полів, то буде відображено кожний ряд форми, який лежить в основі.

1
2
{# відобразити віджет, але додати до нього клас "foo" #}
{{ form_widget(form.name, {'attr': {'class': 'foo'}}) }}

Другий аргумент form_widget() - це масив змінних. Найрозповсюдженішою змінною є attr, яка є масивом HTML-атрибутів, застосовуваних до HTML-віджету. В деяких випадках, певні типи також мають інші опції, пов'язані з шаблонами, які можна передати. Вони обговорюються від типу до типу. attributes не застосовується до дочірніх полів рекурсивно, якщо ви одночасно відображаєте багато полів (наприклад, form_widget(form)).

Див. "Довідник функцій та змінних форм шаблонів Twig", щоб дізнатися більше про аргумент variables.

form_row(view, variables)

Відображає "ряд" заданого поля, який є комбінацією ярлика, помилок та віджета поля.

1
2
{# відобразити ряд поля, але відобразити ярлик з текстом "foo" #}
{{ form_row(form.name, {'label': 'foo'}) }}

Другий аргумент form_row() - це масив змінних. Шаблони, надані Symfony, дозволяють лише перевизначити ярлик так, як продемонстровано у прикладі вище.

Див. "Довідник функцій та змінних форм шаблонів Twig", щоб дізнатися більше про аргумент variables.

form_rest(view, variables)

Відображає всі поля, які ще не були відображені для даної форми. Гарною ідеєю буде завжди мати це десь всередині вашої форми, так як воно відображатиме всі приховані поля і змушуватиме будь-які поля, про які ви забули, відображати більш очевидні (так як воно буде відображати поле за вас).

1
{{ form_rest(form) }}

Довідник тестів форм

Тести можуть бути виконані з використанням оператора is в Twig, щоб створити умову. Прочитайте документацію Twig, щоб дізнатися більше.

selectedchoice(selected_value)

Цей тест перевірить чи дорівнює поточний вибір selected_value, або чи є поточний вибір масивом (коли selected_value - масив).

1
<option {% if choice is selectedchoice(value) %} selected="selected"{% endif %} ...>

Більше про змінні форм

Tip

Щоб побачити повний список змінних, див.: Довідник функцій та змінних форм шаблонів Twig.

Майже в кожній функції Twig вище, фінальний аргумент - це масив "змінних", які використовуються при відображенні однієї частини форми. Наприклад, наступне буде відображати "віджет" для поля та змінювати його атрибути, щоб включати спеціальний клас:

1
2
{# відобразити віджет, але додати до нього клас "foo" #}
{{ form_widget(form.name, { 'attr': {'class': 'foo'} }) }}

Ціль цих змінних - що вони роблять і звідки беруться - може бути зрозуміла не одразу, але вони дуже потужні. Кожний раз, коли ви відображаєте частину вашої форми, блок, який її відображає, використовує декілька змінних. За замовчуванням, ці блоки живуть всередині form_div_layout.html.twig.

Розгляньте form_label в якості приклада:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{% block form_label %}
    {% if not compound %}
        {% set label_attr = label_attr|merge({'for': id}) %}
    {% endif %}

    {% if required %}
        {% set label_attr = label_attr|merge({
            'class': (label_attr.class|default('') ~ ' required')|trim
        }) %}
    {% endif %}

    {% if label is empty %}
        {% set label = name|humanize %}
    {% endif %}

    <label
        {% for attrname, attrvalue in label_attr -%}
            {{ attrname }}="{{ attrvalue }}"
        {%- endfor %}
    >
        {{ label|trans({}, translation_domain) }}
    </label>
{% endblock form_label %}

Цей блок використовує декілька змінних: compound, label_attr, required, label, name і translation_domain. Ці змінні були зроблені доступними системою відображення форм. Але що важливіше, це змінні, які ви можете перевизначити, викликавши form_label() (так як у цьому прикладі ви відображаєте ярлик).

Точні змінні, доступні для перевизначення, залежать від того, яку частину форми ви хочете відобразити (наприклад, ярлик або віджет), і яке поле форми ви відображаєте (наприклад, віджет choice має додаткову опцію expanded). Якщо ви ознайомитесь та звикнете до form_div_layout.html.twig, ви завжди зможете побачити, які опції у вас є.

Tip

За лаштунками, ці змінні доступні об'єкту FormView вашої форми, коли компонент викликає buildView() і finishView() в кожному "вузлі" вашого дерева форми. Щоб побачити, які змінні "перегляду" має конкретне поле, знайдіть початковий код поля форми (та його батьківських полів), та подивіться на дві функції, описані вище.

Note

Якщо ви одночасно відображаєте форму цілком (або цілу вбудовану форму), то аргумент variables буде застосований лише до самої форми, але не до її дочок. Іншими словами, наступне не передаватиме атрибут класу "foo" усім дочірнім полям форми:

1
2
{# **не** працює - змінні не рекурсивні #}
{{ form_widget(form, { 'attr': {'class': 'foo'} }) }}

Довідних змінних форми

Наступні змінні спільні для всіх типів полів. Деякі типи полів можут мати нвіть більше змінних, а деякі змінні тут - насправді застосовуються лише до конкретних типів.

Припускаючи, що у вас у шаблоні є змінна form, і ви хочете послатися на змінні в полі name, отримання доступу до змінних проходить з використанням публічної властивості vars об'єкта FormView:

  • Twig
  • PHP
1
2
3
4
<label for="{{ form.name.vars.id }}"
    class="{{ form.name.vars.required ? 'required' : '' }}">
    {{ form.name.vars.label }}
</label>
?????? ????????????
form ???????? ????????? FormView.
id HTML-??????? id ??? ????????????.
name ??'? ???? (?????????, title) - ??? ?? name HTML-????????, ??? ? full_name.
full_name name HTML-???????? ??? ????????????.
errors ????? ????-???? ???????, ?????????? ?? ????? ??????????? ???? (?????????, form.title.errors). ?????????, ?? ?? ?? ?????? ??????????????? form.errors, ??? ????????? ?????????? ?????, ??? ?? ???????????? ???? "?????????" ???????: ????? ????????????? ???? ?????? ???? ???????. ??????? ????? ???????????? ????? valid.
submitted ???????? true ??? false ? ?????????? ??? ????, ?? ??????????? ????? ??????.
valid ???????? true ??? false ? ?????????? ??? ????, ?? ??????? ????? ??????.
value ????????, ??? ???? ??????????? ??? ???????????? (??????? ?? ??? HTML-??????? value).
disabled ???? true, disabled="disabled" ????????? ?? ????.
required ???? true, ??????? required ????????? ?? ????, ??? ?????????? ????????? HTML5. ???? ????, ?? ?????? ????????? ???? required.
label ????? ??????, ???? ???? ????????????.
multipart ???? true, form_enctype ??????????? enctype="multipart/form-data". ?????????????? ???? ?? ?????????? ???????? ?????.
attr ????? ??????-???????, ???? ???? ??????????? ?? HTML-???????? ????.
label_attr ????? ??????-???????, ???? ???? ??????????? ?? HTML-???????? ??????.
compound ?? ? ???? ?????? ????? ???????? ????? (?????????, ???? choice, ??? ????????? ? ?????? ?????????.
block_prefixes ????? ???? ???? ???????????? ?????.
translation_domain ????? ?????????? ??? ???? ?????.
cache_key ?????????? ????, ???? ???????????????? ??? ?????????.
data ????????????? ???? ????.
method ????? ???????? ????? (POST, GET, ? ?.?.).
action ??? ???????? ?????.