Поле FileType
Поле FileType
FileType
представляет ввод файла в вашей форме.
???????????? ??? | ???? input file |
????? | |
???????????????? ????? | |
??????????? ????? | |
???????????? ??? | FormType |
????? | FileType |
Базовое применение
Допустим, у вас есть такое определение формы:
1 2 3 4
use Symfony\Component\Form\Extension\Core\Type\FileType;
// ...
$builder->add('attachment', FileType::class);
Когда отправляется форма, поле attachment
будет экземпляром
UploadedFile. Он может
быть использован для перемещения файла attachment
в постоянную локацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
use Symfony\Component\HttpFoundation\File\UploadedFile;
public function uploadAction()
{
// ...
if ($form->isSubmitted() && $form->isValid()) {
$someNewFilename = ...
$file = $form['attachment']->getData();
$file->move($dir, $someNewFilename);
// ...
}
// ...
}
Метод move()
берёт каталог и имя файла в качестве своих аргументов. Вы
можете вычислить имя файла одним из следующих способов:
1 2 3 4 5 6 7 8 9 10
// использовать оригинальное имя файла
$file->move($dir, $file->getClientOriginalName());
// создать случайное имя и попробовать угадать расширение (более безопасно)
$extension = $file->guessExtension();
if (!$extension) {
// расширение не может быть угадано
$extension = 'bin';
}
$file->move($dir, rand(1, 99999).'.'.$extension);
Использование оригинального имени через getClientOriginalName()
не безопасно,
так как оно могло быть изменено конечным пользователем. Однако, оно может содержать
символы, которые не разрешены в имени файлов. Вы должны очистить имя перед тем, как
использовать его напрямую.
Прочтите Как загружать файлы, чтобы увидеть пример того, как управлять загрузкой файла, связанного с сущностью Doctrine.
Опции поля
multiple
тип: Boolean
по умолчанию: false
Когда установлена, как "true", пользователь сможет загрузать несколько файлов одновременно.
Переопределённые опции
compound
тип: boolean
по умолчанию: false
Эта опция указывает, содержит ли тип дочерние типы. Эта опция управляется внутренне для встроенных типов, так что нет необходимости конфигурировать её ясно.
data_class
тип: string
default: File
Эта опция устанавливает правильный преобразователь данных, связанный с данными, для использования типом.
empty_data
тип: mixed
по умолчанию: null
Эта опция определяет, какое значение будет возвращать поле, когда отправленное значение пусто.
Наследуемые опции
Эти опции наследуются из FormType:
disabled
тип: boolean
по умолчанию: false
Если вы не хотите, чтобы пользователь изменял значение поля, то вы можете установить опцию отключения, как "true". Любые отправленные данные будут проигнорированы.
error_bubbling
тип: boolean
по умолчанию: false
, кроме случаев, когда форма compound
Если true
, то любые ошибки в этом поле будут переданы родительскому
полю или форме. Например, если установлена, как true
в нормальном
поле, то любые ошибки для этого поля будут присоединены к главной форме,
а не к конкретному полю.
error_mapping
тип: array
по умолчанию: array()
Эта опция позволяет вам изменять цель ошибки валидации.
Представьте, что у вас есть пользовательский метод под именем matchingCityAndZipCode()
,
который валидирует, совпадает ли город и почтовый индекс. К сожалению, поля
"matchingCityAndZipCode" в вашей форме нет, поэтому всё, что Symfony может сделать -
это отобразить ошибку наверху формы.
С настроенным отображением ошибок вы можете сделать лучше: привяжите ошибку к полю города, чтобы она отображалась над ним:
1 2 3 4 5 6 7 8
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'error_mapping' => array(
'matchingCityAndZipCode' => 'city',
),
));
}
Вот правила для лево- и правостороннего отображения:
- Левая сторона содержит пути свойств;
- Если наружение генерируется в свойств или методе класс, то его путь - это
просто
propertyName
; - Вы можете создать вложенные пути свойств, соединив их, разделяя свойства точками.
Например:
addresses[work].matchingCityAndZipCode
; - Правая сторона содержит просто имена полей в форме.
По умолчанию, ошибки любого свойства, которое не отображенно, соберутся в
родительской форме. Вы можете использовать точку (.
) в левой части, чтобы
привязать ошибки всех неотображённых свойств к конкретному полю. Например,
чтобы привязать эти ошибки к полю city
, используйте:
1 2 3 4 5
$resolver->setDefaults(array(
'error_mapping' => array(
'.' => 'city',
),
));
Дата обновления перевода 2023-01-12
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'),
])
Ярлык также может быть установлен внутри шаблона:
- Twig
- PHP
1
{{ form_label(form.name, 'Your name') }}
label_attr
тип: array
по умолчанию: array()
Устанавливает HTML-атрибуты для элемента <label>
, который будет использован
при отображении ярлыка для поля. Это ассоциативный массив с HTML-атрибутом в
качестве ключа. Этот атрибут может также быть установлен прямо внутри шаблона:
- Twig
- PHP
1 2 3
{{ form_label(form.name, 'Your name', {
'label_attr': {'class': 'CUSTOM_LABEL_CLASS'}
}) }}
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
.
required
тип: boolean
по умолчанию: true
Если "true", то будет отображён обязательный атрибут HTML5.
Соответствующий label
также отобразится с классом required
.
Эта опция внешняя и не зависит от валидации. В лучшем случае, если вы позволите Symfony отгадать ваш тип поля, тогда значение этой опции будет угадано из вашей информации о валидации.
Note
Обязательная опция также влияет на то, как будут обработаны пустые данные для каждого поля. Чтобы узнать больше, см. опцию empty_data.
Переменные формы
?????????? | ??? | ??????????? |
---|---|---|
type | string |
??? ?????????? ??????????, ??? file , ????? ?????????? ? ???? ???? ????? ?????. |