Поле DateType

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

Поле DateType

Поле, яке дозволяє користувачу змінювати інформацію про дату через багато різних HTML-елементів.

Це поле може бути відображено багатьма різними способами через опцію widget, і може розуміти декілька різних форматів введення через опцію input.

???????? ??? ????? ???? ???? DateTime, ??????, ?????? ???? ??? ??????? (???. ????? input
?????????????? ?? ???? ???????? ???? ??? ??? ???? ??????
???????????? ???????????? ?? ????????????? ???? ?????, ??????? ??????? ????.
???????????? ??? FormType
???? DateType

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

Tip

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

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

Базове застосування

Цей тип поля має високу конфігурованість, але легкий у використанні. Найважливішими опціями є input та widget.

Уявіть, що у вас є поле publishedAt, основні дані якого - об'єкт DateTime. Наступне конфігурує тип date для цього поля, як три різних поля вибору:

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

$builder->add('publishedAt', DateType::class, [
    'widget' => 'choice',
]);

Якщо ваші основні дані - не об'єкт DateTime (а, наприклад, мітка часу unix або об'єкт DateTimeImmutable), сконфігуруйте опцію input:

1
2
3
4
$builder->add('publishedAt', DateType::class, [
    'widget' => 'choice',
    'input'  => 'datetime_immutable'
]);

Відображення одного текстового поля HTML5

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

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

$builder->add('publishedAt', DateType::class, [
    // відображає його як одне текстове поле
    'widget' => 'single_text',
]);

Це відобразиться у вигляді поля HTML5 input type="date", що означає, що деякі, але не всі, браузери додаватимуть до поля зручну функціональність визначника дати. Якщо ви хочете бути абсолютно впевнені, що кожний користувач має працюючий визначник дати, використовуйте зовнішню бібліотеку JavaScript.

Наприклад, уявіть, що ви хочете використати бібліотеку Bootstrap Datepicker. Для початку, зробіть наступні зміни:

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

$builder->add('publishedAt', DateType::class, [
    'widget' => 'single_text',

    // запобігає його відображенню як type="date", щоб уникнути визначників дати HTML5
    'html5' => false,

    // додає клас, який може бути обрано в JavaScript
    'attr' => ['class' => 'js-datepicker'],
]);

Далі додайте наступний код JavaScript у ваш шаблон, щоб ініціалізувати виборця дати:

1
2
3
4
5
6
7
8
<script>
    $(document).ready(function() {
        // вам може знадобитися змінити цей код, якщо ви не використовуєте Bootstrap Datepicker
        $('.js-datepicker').datepicker({
            format: 'yyyy-mm-dd'
        });
    });
</script>

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

Warning

Рядок, який використовується визначником дати JavaScript для опису його формату (наприклад, yyyy-mm-dd) може не співпадати з рядком, який використовує Symfony (наприклад, yyyy-MM-dd). Це тому, що різні бібліотеки використовують різні правила форматування, щоб описати формат дати. Майте це на увазі - зробити так, щоб формати дійсно співпадали, може бути дуже непросто!

Опції поля

Дата оновлення перекладу 2025-02-24

days

тип: array за замовчуванням: від 1 до 31

Список днів, доступних в типі поля день. Ця опція застосовується лише тоді, коли опція widget встановлена як choice:

1
'days' => range(1,31)

placeholder

тип: string | array

Якщо ваша опція віджета встановлена як choice, то це поле буде представлено, як серію полів вибору select. Коли значення заповнювача - рядок, він буде використаний як пусте значення всіх полів вибору:

1
2
3
$builder->add('dueDate', DateType::class, [
    'placeholder' => 'Select a value',
]);

Як варіант, ви можете використати масив, який конфігурує різні значення заповнювача для полів року, місяця та дня:

1
2
3
4
5
$builder->add('dueDate', DateType::class, [
    'placeholder' => [
        'year' => 'Year', 'month' => 'Month', 'day' => 'Day',
    ]
]);

Дата оновлення перекладу 2025-02-24

format

тип: integer або string за замовчуванням: IntlDateFormatter::MEDIUM (або yyyy-MM-dd, якщо widget - single_text)

Опція, передана класу IntlDateFormatter, використовується для перетворення введення користувача на правильний формат. Це критично, коли опція widget встановлена як single_text і визначатиме, як користувач вводитиме дані. За замовчуванням, формат визначається, ґрунтуючись на локалі поточного користувача: це означає, що очікуваний формат буде відрізнятися для різних користувачів. Ви можете перевизначити це, передавши формат в якості рядка.

Щоб дізнатися більше про валідні формати, див. Синтаксис формату Date/Time:

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

$builder->add('dateCreated', DateType::class, [
    'widget' => 'single_text',
    // Це насправді формат за замовчуванням для single_text
    'format' => 'yyyy-MM-dd',
));

Note

Якщо ви хочете, щоб ваше поле відображалося, як поле "даних" HTML5, то вам потрібно використовувати віджет single_text з форматом yyyy-MM-dd (формат RFC 3339), який є значенням за замовчуванням, якщо ви використовуєте віджет single_text.

Дата оновлення перекладу 2025-02-24

html5

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

Якщо встановлено як true (за замовчуванням), то вона буде використовувати тип HTML5 (дату, час або datetime), щоб відобразити поле. Якщо встановлена як false, то буде використано текстовий тип.

Це корисно, коли ви хочете використовувати користувацький вибірник даних JavaScript, який часто вимагає текстовий тип замість типу HTML5.

Дата оновлення перекладу 2025-02-24

input

тип: string за замовчуванням: datetime

Формат даних введення - тобто, формат, в якому зберігаються дані вашого вихідного обʼєкта. Валідні значення:

  • string (наприклад, 2011-06-05)
  • datetime (обʼєкт DateTime)
  • datetime_immutable (обʼєкт DateTimeImmutable object)
  • array (наприклад, array('year' => 2011, 'month' => 06, 'day' => 05))
  • timestamp (наприклад, 1307232000)

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

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

Warning

Якщо використано timestamp, DateType обмежуєтья датами між пʼятницею, 13 грудня 1901 року 20:45:54 UTC та вівторком, 19 січня 2038 року 03:14:07 UTC у 32-бітних системах. Це через баг переповнення цілими числами у 32-бітних системах, відомий як Проблема 2038 року.

Дата оновлення перекладу 2025-02-24

input_format

тип: string за замовчуванням: Y-m-d

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

Якщо опція input встановлена як string, ця опція вказує формат дати. Це має бути валідним PHP-форматом дат.

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

model_timezone

тип: string за замовчуванням: часовий пояс системи за замовчуванням

Часовий пояс, в якому зберігаються вхідні дані. Це має бути один з часових поясів підтримуваних PHP.

Дата оновлення перекладу 2025-02-24

months

тип: array за замовчуванням: від 1 до 12

Список місяців, доступних типу поля місяць. Ця опція застосовується лише тоді, коли опція widget встановлена як choice.

Дата оновлення перекладу 2025-02-22

view_timezone

тип: string за замовчуванням: часовий пояс системи за замовчуванням

Часовий пояс для відображення даних користувачу (а, відповідно, і даних, які користувач відправляє). Це має бути один з часових поясів, що підтримуються PHP.

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

widget

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

тип: string за замовчуванням: single_text

Основний спосіб відображення цього поля. Це може бути один з наступних способів:

  • choice: відображає три вводи вибору. Порядок виборів визначається в опції format.
  • text: відображає три поля вводу типу text (місяць, день, рік).
  • single_text: відображає одне поле вводу типу date. Введення користувача валідується на основі опції format.

Дата оновлення перекладу 2025-02-22

years

тип: array за замовчуванням: пʼять років до чи після поточного року

Список років, доступних типу поля рік. Ця опція може бути застосована лише тоді, коли опція widget встановлена як choice.

calendar

тип: integer або \IntlCalendar за замовчуванням: null

Календар, який використовуватиметься для форматування та аналізу дати. Значення має бути
integer з календарних констант IntlDateFormatter або екземпляром

класу IntlCalendar для використання. За замовчуванням використовується григоріанський календар з локаллю додатку за замовчуванням.

7.2

Опція calendar була представлена в Symfony 7.2.

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

widget

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

тип: string за замовчуванням: single_text

Основний спосіб відображення цього поля. Це може бути один з наступних способів:

  • choice: відображає три вводи вибору. Порядок виборів визначається в опції format.
  • text: відображає три поля вводу типу text (місяць, день, рік).
  • single_text: відображає одне поле вводу типу date. Введення користувача валідується на основі опції format.

Дата оновлення перекладу 2025-02-22

years

тип: array за замовчуванням: пʼять років до чи після поточного року

Список років, доступних типу поля рік. Ця опція може бути застосована лише тоді, коли опція widget встановлена як choice.

Перевизначені опції

by_reference

за замовчуванням: false

До класів DateTime відносяться як до незмінних об'єктів.

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

choice_translation_domain

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

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

Ця опція визначає, чи мають значення виборів бути перекладені та у якому домені перекладів.

Значення опції choice_translation_domain можуть бути true (повторно використати поточний домен перекладів), false (відключити переклад), null (використовує батьківський домен перекладів або домен за замовчуванням) або рядок, який представляє точний домен перекладів для використання.

Дата оновлення перекладу 2025-02-22

compound

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

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

Дата оновлення перекладу 2025-02-22

data_class

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

Внутрішнє нормалізоване представлення цього типу - масив, а не обʼєкт \DateTime. Отже, опція data_class ініціалізується як null, щоб уникнути ініціалізації обʼєктом FormType як \DateTime.

error_bubbling

за замовчуванням: false

Дата оновлення перекладу 2025-02-24

invalid_message

тип: string за замовчуванням: Це значення не є валідним значение не валидно

Це повідомлення помилки валідації, яке використовується, якщо дані, введені у це поле, не мають сенсу (тобто валідація проходить невдало).

Це може трапитися, наприклад, якщо користувач вводить у поле TimeType асбурдний рядок, який не може бути конвертований в даний час, або якщо користувач вводить рядок (наприклад, apple) у числове поле.

Нормальна (програмний код) валідація (наприклад, встановлення мінімальної довжини для поля), має бути встановлена з використанням повідомлень валідації з вашими правилами валідації (довідник ).

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

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

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

attr

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

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

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

See also

Використовуйте опцію row_attr, якщо ви хочете додати ці атрибути до елементу рядку типу форми .

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

data

тип: mixed за замовчуванням: За замовчуванням - поле вихідної структури.

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

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

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

Warning

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

Дата обновления перевода 2025-02-24

disabled

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

Если вы не хотите, чтобы пользователь изменял значение поля, то вы можете установить опцию отключения, как "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',
    ],
]);

Дата оновлення перекладу 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'),
    ])
;

Дата оновлення перекладу 2025-02-24

help_attr

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

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

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

Дата оновлення перекладу 2025-02-24

help_html

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

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

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

inherit_data

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

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

Warning

Коли для поля встановлено опцію inherit_data, воно використовує дані батьківської форми як є. Це означає, що Перетворювачі даних не
будуть застосовуватися до цього поля.

Дата оновлення перекладу 2025-02-24

invalid_message_parameters

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

При встановленні опції invalid_message вам може знадобитися включити в рядок деякі змінні. Це можна зробити, додавши заповнювачі в цю опцію, та включивши змінні в цій опції:

1
2
3
4
$builder->add('someField', SomeFormType::class, [
    // ...
    'invalid_message' => 'Ви ввели невалідне значення, воно має містити %num% літер',
    'invalid_message_parameters' => ['%num%' => 6],

Дата оновлення перекладу 2025-02-24

mapped

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

Якщо ви хочете, щоб поле було проігноровано при читанні або записі в нього обʼєкта, ви можете встановити опцію mapped як false.

Дата оновлення перекладу 2025-02-24

row_attr

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

Асоціативний масив атрибутів HTML, що додаються до елементу, який використовується для відображення рядка типу форми :

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

See also

Використовуйте опцію attr, якщо ви хочете додати ці атрибути до елементу віджета типу форми .

Змінні поля

?????? ??? ????????????
widget mixed ???????? ????? widget.
type string ???????? ???? ????, ???? ?????? - single_text ? ?????????? HTML5, ??????? ??? ???????? ??? ???????????? (datetime, date ??? time).
date_pattern string ????? ? ???????? ???? ??? ????????????.