Поле EnumType

Дата оновлення перекладу 2024-05-29

Поле EnumType

Багатоцільове поле, використовуване для того, щоб дозволити користувачу "обрати" одну або більше опцій, визначених у зчисленнях PHP. Воно розширю поле ChoiceType та визначає такі ж опції.

?????????????? ?? ???? ???? ??????? ?????? (???. ?????)
???????????? ???????????? ?? ????????????? ????? ?? ? ????????.
??????????? ???????????? ???????????? ???????? {{ value }} ?? ? ????????.
???????????? ??? ChoiceType
???? EnumType

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

Tip

Повний список опцій, визначених та успадкованих цим типом форми, доступний шляхом виконання цієї команди у вашому додатку:

1
2
# замініть 'FooType' імʼям класу вашого типу форми
$ php bin/console debug:form FooType

Приклад використання

Перед використанням цього поля вам знадобиться мати якесь перелічуване PHP (або, скорочено - "enum"), визначене у вашому додатку. Це перелічуване має бути типом "підтримуваного перелічуваного", де кожне ключове слово визначає скларне значення, таке як рядок:

1
2
3
4
5
6
7
8
9
// src/Config/TextAlign.php
namespace App\Config;

enum TextAlign: string
{
    case Left = 'Left/Start aligned';
    case Center = 'Center/Middle aligned';
    case Right = 'Right/End aligned';
}

Замість того, щоб викорисстовувати значення перелічуваних в опції choices, EnumType вимагає лише визначення опції class, що вказує на перелічуване:

1
2
3
4
5
use App\Config\TextAlign;
use Symfony\Component\Form\Extension\Core\Type\EnumType;
// ...

$builder->add('alignment', EnumType::class, ['class' => TextAlign::class]);

Це відобразить тег <select> з трьома можливими значеннями, визначеними у перелічуваному TextAlign. Використайте опції expanded та multiple, щоб відобразити ці значення в якості <input type="checkbox"> або <input type="radio">.

Ярлик, який відображається в елементах <option> <select> - це імʼя зчислення. PHP визначає деякі жорсткі правила для цих імен (наприклад, вони не можуть містити крапок або пробілів). Якщо вам потрібно більше гнучкості для цих ярликів, ваше зчислення може реалізувати TranslatableInterface, щоб перекласти або відобразити користувацькі ярлики:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// src/Config/TextAlign.php
namespace App\Config;

use Symfony\Contracts\Translation\TranslatableInterface;
use Symfony\Contracts\Translation\TranslatorInterface;

enum TextAlign: string implements TranslatableInterface
{
    case Left = 'Left aligned';
    case Center = 'Center aligned';
    case Right = 'Right aligned';

    public function trans(TranslatorInterface $translator, string $locale = null): string
    {
        // Перекласти зчислення з імені (Left, Center або Right)
        return $translator->trans($this->name, locale: $locale);

        // Перекласти зчислення, використовуючи користувацькі ярлики
        return match ($this) {
            self::Left  => $translator->trans('text_align.left.label', locale: $locale),
            self::Center => $translator->trans('text_align.center.label', locale: $locale),
            self::Right  => $translator->trans('text_align.right.label', locale: $locale),
        };
    }
}

Опції поля

class

тип: string за замовчуванням: (не має значення за замовчуванням)

Повністю кваліфіковане імʼя класу (FQCN) перелічуваного PHP, використане для отримання значень, відображених цим полем форми.

Успадковані опції

Ці опції наслідуються з ChoiceType:

error_bubbling

тип: boolean по умолчанию: false, кроме случаев, когда форма compound

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

Якщо true, будь-які помилки цього поля будуть передані батьківському полю або формі. Наприклад, якщо встановлено true у нормальному полі, будь-які помилки цього поля будуть прикріплені до головної форми, а не до конкретного поля.

Дата оновлення перекладу 2024-05-30

error_mapping

тип: array за замовчуванням: []

Ця опція дозволяє вам змінювати ціль помилки валідації.

Уявіть, що у вас є користувацький метод з назвою matchingCityAndZipCode(), який валідує чи співпадають місто та поштовий індекс. На жаль, у вашій формі немає поля matchingCityAndZipCode, тому все, що може зробити Symfony, це відобразити помилку у верхній частині форми.

За допомогою кастомізованого мапування помилок ви можете зробити краще: співставити помилку з полем міста так, щоб воно відображалося над ним:

1
2
3
4
5
6
7
8
public function configureOptions(OptionsResolver $resolver): void
{
    $resolver->setDefaults([
        'error_mapping' => [
            'matchingCityAndZipCode' => 'city',
        ],
    ]);
}

Ось правила для лівої та правої частини мапування:

  • Ліва частина містить шляхи властивостей;
  • Якщо порушення генерується у властивості або методі класу, то його шлях - це propertyName;
  • Якщо порушення згенеровано в елементі об'єкту array або ArrayAccess, то шлях до нього - [indexName];
  • Ви можете створювати вкладені шляхи властивостей шляхом їх конкатенації, розділяючи властивості крапками. Наприклад: addresses[work].matchingCityAndZipCode;
  • Права частина містить назви полів форми.

За замовчуванням, помилки для будь-якої властивості, яка не мапована, будуть спливати в батьківську форму. Ви можете використовувати крапку (.) зліва, щоб співставити помилки всіх неспівставлених властивостей до певного поля. Наприклад, щоб мапувати всі ці помилки до поля city, використовуйте:

1
2
3
4
5
$resolver->setDefaults([
    'error_mapping' => [
        '.' => 'city',
    ],
]);

expanded

type: boolean default: false

If set to true, radio buttons or checkboxes will be rendered (depending on the multiple value). If false, a select element will be rendered.

group_by

тип: string або callable або PropertyPath за замовчуванням: null

Ви можете згрупувати елементи <option> <select> у <optgroup>, передавши багатовимірний масив в choices. Див. розділ Опції групування , щоб дізнатися про це.

Опція group_by - це альтернативний спосіб групування варіантів, який надає вам трохи більше гнучкості.

Давайте додамо декілька випадків у наше зчислення TextAlign:

1
2
3
4
5
6
7
8
9
10
11
12
13
// src/Config/TextAlign.php
namespace App\Config;

enum TextAlign: string
{
    case UpperLeft = 'Upper Left aligned';
    case LowerLeft = 'Lower Left aligned';

    case Center = 'Center aligned';

    case UpperRight = 'Upper Right aligned';
    case LowerRight = 'Lower Right aligned';
}

Тепер ви можемо групувати варіанти за значенням випадку зчислення:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use App\Config\TextAlign;
use Symfony\Component\Form\Extension\Core\Type\EnumType;
// ...

$builder->add('alignment', EnumType::class, [
    'class' => TextAlign::class,
    'group_by' => function(TextAlign $choice, int $key, string $value): ?string {
        if (str_starts_with($value, 'Upper')) {
            return 'Upper';
        }

        if (str_starts_with($value, 'Lower')) {
            return 'Lower';
        }

        return 'Other';
    }
]);

Цей зворотний виклик згрупує варіанти у 3 категорії: Upper, Lower та Other.

Якщо ви повернете null, опція не буде згрупована.

Дата оновлення перекладу 2024-05-29

duplicate_preferred_choices

тип: boolean за замовчуванням: true

При використанні опції preferred_choices бажані варіанти відображаються двічі за замовчуванням: у верхній частині списку та у повному списку нижче. Встановіть цю опцію як false, щоб відображати бажані варіанти лише на початку списку:

1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('language', ChoiceType::class, [
    'choices' => [
        'English' => 'en',
        'Spanish' => 'es',
        'Bork' => 'muppets',
        'Pirate' => 'arr',
    ],
    'preferred_choices' => ['muppets', 'arr'],
    'duplicate_preferred_choices' => false,
]);

multiple

тип: boolean по умолчанию: false

Если "true", то пользователь сможет выбирать несколько опций (а не только одну). В зависимости от значения опции expanded, это будет отображаться либо как тег выбора, либо как чекбоксы если "true" и тег выбора, либо селективные кнопки, если "false". Возвращённое значение будет массивом.

Дата оновлення перекладу 2024-05-30

placeholder

тип: string або TranslatableMessage або boolean

Ця опція визначає, чи буде з'являтися спеціальна "порожня" опція (наприклад, "Виберіть опцію") у верхній частині віджету. Ця опція застосовується застосовується тільки якщо для опції multiple встановлено значення false.

  • Додайте порожнє значення з текстом "Виберіть опцію":

    1
    2
    3
    4
    5
    6
    7
    8
    9
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    // ...
    
    $builder->add('states', ChoiceType::class, [
        'placeholder' => 'Choose an option',
    
        // або, якщо ви хочете перекласти текст
        'placeholder' => new TranslatableMessage('form.placeholder.select_option', [], 'form'),
    ]);
  • Гарантуйте, що не відображено жодної "порожньої" опції значення:

    1
    2
    3
    4
    5
    6
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    // ...
    
    $builder->add('states', ChoiceType::class, [
        'placeholder' => false,
    ]);

Якщо ви залишите опцію placeholder без значення, то порожня (без тексту) опція буде автоматично додана, якщо і тільки якщо опція required має значення false:

1
2
3
4
5
6
7
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

// буде додано порожню (без тексту) опцію
$builder->add('states', ChoiceType::class, [
    'required' => false,
]);

Дата оновлення перекладу 2024-05-29

placeholder_attr

тип: array за замовчуванням: []

Використовуйте це, щоб додати додаткові HTML-атрибути до вибору заповнювача:

1
2
3
4
5
6
7
8
9
10
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('fruits', ChoiceType::class, [
    // ...
    'placeholder' => '...',
    'placeholder_attr' => [
        ['title' => 'Choose an option'],
    ],
]);

Дата оновлення перекладу 2024-05-29

preferred_choices

тип: array, callable, string або PropertyPath за замовчуванням: []

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

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('language', ChoiceType::class, [
    'choices' => [
        'English' => 'en',
        'Spanish' => 'es',
        'Bork' => 'muppets',
        'Pirate' => 'arr',
    ],
    'preferred_choices' => ['muppets', 'arr'],
]);

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('publishAt', ChoiceType::class, [
    'choices' => [
        'now' => new \DateTime('now'),
        'tomorrow' => new \DateTime('+1 day'),
        '1 week' => new \DateTime('+1 week'),
        '1 month' => new \DateTime('+1 month'),
    ],
    'preferred_choices' => function ($choice, $key, $value): bool {
        // віддавати перевагу варіантам протягом 3 днів
        return $choice <= new \DateTime('+3 days');
    },
]);

Це "віддасть перевагу" лише вибору "зараз" і "завтра":

Список вибору з варіантами "зараз" і "завтра" зверху, відокремлений рядком від "1 тиждень" і "1 місяць".

Нарешті, якщо ваші значення є об'єктами, ви також можете вказати рядок шляху властивості в об'єкті, який повертатиме true або false.

Вказані варіанти вибору мають значення лише при відображенні елемента select (тобто expanded - false). Бажані та звичайні варіанти вибору розділяються візуально набором пунктирних ліній (наприклад, -------------------). Це можна налаштувати під час відображення поля:

1
{{ form_widget(form.publishAt, { 'separator': '=====' }) }}

Tip

При визначенні користувацького типу слід використовувати помічник класу ChoiceList:

1
2
3
4
5
6
use Symfony\Component\Form\ChoiceList\ChoiceList;

// ...
$builder->add('choices', ChoiceType::class, [
    'preferred_choices' => ChoiceList::preferred($this, 'taggedAsFavorite'),
]);

Дивіться документацію опції "choice_loader" .

trim

type: boolean default: false

Trimming is disabled by default because the selected value or values must match the given choice values exactly (and they could contain whitespaces).

Ці опції наслідуються з FormType:

attr

тип: array по умолчанию: array()

Если вы хотите добавить дополнительные атрибуты к HTML представлению поля, то вы можете использовать опцию attr. Это ассоциативный массив с HTML-атрибутами в качестве ключей. Этоможет быть полезно, когда вам нужно установить для некоторого виджета пользовательский класс:

1
2
3
$builder->add('body', TextareaType::class, array(
    'attr' => array('class' => 'tinymce'),
));

data

тип: mixed по умолчанию : По умолчанию является полем основоположной структуры.

Когда вы создаёте форму, каждое поле изначально отображает значение соотствующего свойства данных домена формы (например, если вы привязываете объект к форме). Если вы хотите переопределить эти изначальные значения для формы или индивидуального поля, вы можете установить это в опции данных:

1
2
3
4
5
6
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
// ...

$builder->add('token', HiddenType::class, array(
    'data' => 'abcdef',
));

Caution

Опция data всегда переопределяет значение, взятое из данных домена (объекта) при отображении. Это означает, что значение объекта также переопределяется, когда форма редактирует уже существующий сохранённый объект, что приводит к потере сохранённого значения при отправке формы.

disabled

тип: boolean по умолчанию: false

Если вы не хотите, чтобы пользователь изменял значение поля, то вы можете установить опцию отключения, как "true". Любые отправленные данные будут проигнорированы.

empty_data

type: mixed

Дата оновлення перекладу 2024-05-30

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

Це означає, що вона допомагає вам обробляти відправлення форм з порожніми полями. Наприклад, якщо ви хочете, щоб для поля name було явно встановлено значення
John Doe, коли не вибрано жодного значення, ви можете зробити це так:

1
2
3
4
$builder->add('name', null, [
    'required'   => false,
    'empty_data' => 'John Doe',
]);

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

Note

Якщо форма є складеною, ви можете встановити empty_data як масив, об'єкт або замикання. Ця опція може бути встановлена для всього класу форми, дивіться статтю Як сконфігурувати порожні дані для класу форми для отримання більш детальної інформації про ці опції.

Caution

Перетворювачі даних форми все одно будуть застосовані до значення empty_data. Це означає, що порожній рядок буде перетворено на null. Використовуйте власний перетворювач даних, якщо ви явно хочете повернути порожній рядок.

Дата оновлення перекладу 2024-05-30

help

тип: string або TranslatableInterface за замовчуванням: null

Дозволяє вам визначити повідомлення допомоги для поля форми, яке за замовчуванням відображається під полем:

1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Component\Translation\TranslatableMessage;

$builder
    ->add('zipCode', null, [
        'help' => 'The ZIP/Postal code for your credit card\'s billing address.',
    ])

    // ...

    ->add('status', null, [
        'help' => new TranslatableMessage('order.status', ['%order_id%' => $order->getId()], 'store'),
    ])
;

help_attr

type: array default: []

Sets the HTML attributes for the element used to display the help message of the form field. Its value is an associative array with HTML attribute names as keys. These attributes can also be set in the template:

1
2
3
{{ form_help(form.name, 'Your name', {
    'help_attr': {'class': 'CUSTOM_LABEL_CLASS'}
}) }}

help_html

type: boolean default: false

By default, the contents of the help option are escaped before rendering them in the template. Set this option to true to not escape them, which is useful when the help contains HTML elements.

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

label

тип: string або TranslatableMessage за замовчуванням: Ярлик "вгадується" з імені поля

Встановлює ярлик, який буде використано при відображенні поля. Установка false прридушить ярлик:

1
2
3
4
5
6
7
8
use Symfony\Component\Translation\TranslatableMessage;

$builder
    ->add('zipCode', null, [
        'label' => 'The ZIP/Postal code',
        // опціонально, ви можете використати обʼєкти TranslatableMessage в якості змісту ярлика
        'label' => new TranslatableMessage('address.zipCode', ['%country%' => $country], 'address'),
    ])

Ярлик також може бути встановлений у шаблоні:

1
{{ form_label(form.name, 'Your name') }}

label_attr

тип: array по умолчанию: array()

Устанавливает HTML-атрибуты для элемента <label>, который будет использован при отображении ярлыка для поля. Это ассоциативный массив с HTML-атрибутом в качестве ключа. Этот атрибут может также быть установлен прямо внутри шаблона:

1
2
3
{{ form_label(form.name, 'Your name', {
       'label_attr': {'class': 'CUSTOM_LABEL_CLASS'}
}) }}

Дата оновлення перекладу 2024-05-29

label_html

тип: boolean за замовчуванням: false

За замовчуванням, зміст опції label екранується перед відображенням у шаблоні. Встановіть для цієї опції значення true, щоб не екранувати її, що може бути корисно, коли ярлик містить HTML-елементи.

label_format

тип: string по умолчанию: null

Конфигурирует строку, используемую в качестве ярылка поля, в случае, если опция label не была установлена. Это полезно при использовании сообщений переводов ключевых слов .

Если вы используете сообщения переводов ключевых слов в качестве ярлыков, то у вас часто будет несколько сообщений с ключевым словом для одного и того же ярлыка (например, profile_address_street, invoice_address_street). Это потому, что ярлык строится для каждого "пути" к полю. Чтобы избежать повтора сообщений ключевых слов, вы можете сконфигурировать формат ярлыка в качестве статичного значения, например:

1
2
3
4
5
6
7
8
// ...
$profileFormBuilder->add('address', AddressType::class, array(
    'label_format' => 'form.address.%name%',
));

$invoiceFormBuilder->add('invoice', AddressType::class, array(
    'label_format' => 'form.address.%name%',
));

Эта опция наследуется дочерними типами. С использованием вышенаписанного кода, ярлык поля street обеих форм будет использовать сообщение с ключевым словом form.address.street.

В формате ярлыка доступны две переменные:

%id%
Уникальный идентификатор для поля, состоящий из полного пути к полю и имени поля (например, profile_address_street);
%name%
Имя поля (например, street).

Значение по умолчанию (null) приводит к "человеческой" версии имени поля.

Note

Опция label_format оценивается в теме формы. Убедитесь в том, что вы обновили ваши щаблоны, в случае, если вы настраивали темизацию форм.

mapped

тип: boolean по умолчанию: true

Если вы хотите, чтобы поле было проигнорировано про чтении или записи в него объетка, вы можете установить опцию mapped, как false.

Дата оновлення перекладу 2023-09-25

required

тип: boolean за замовчуванням: true

Якщо значення true, буде відображено обов'язковий атрибут HTML5. Відповідний label також буде відображено з класом required.

Це поверхнево і не залежить від валідації. У кращому випадку, якщо ви дозволите Symfony вгадати тип вашого поля, то значення цієї опції буде вгадано з вашої інформації валідації.

Note

Обов'язкова опція також впливає на те, як будуть оброблятися порожні дані для кожного поля. Для більш детальної інформації дивіться опцію empty_data.

row_attr

type: array default: []

An associative array of the HTML attributes added to the element which is used to render the form type row :

1
2
3
$builder->add('body', TextareaType::class, [
    'row_attr' => ['class' => 'text-editor', 'id' => '...'],
]);

See also

Use the attr option if you want to add these attributes to the form type widget element.