Как установить поле файла в соответствии с требованиями генератора генератора связки Symfony2.3
Я использую Symfony2.3 и админ генератор генератор. У меня есть сущность с файловым полем. Я хочу отметить это поле как обязательное. Я пробовал несколько способов, но ничего не получалось, как ожидалось.
Это мое поле файла в сущности:
/**
* @Assert\NotNull()
* @Assert\Image(
* maxSize="50k",
* maxSizeMessage = "El tamaño maximo de la imagen es de {{ limit }}kb",
* minWidth = 237,
* maxWidth = 237,
* minHeight = 170,
* maxHeight = 170,
* minWidthMessage = "La imagen debe tener {{ min_width }}px de ancho.",
* minHeightMessage = "La imagen debe tener {{ min_height }}px de alto.",
* maxWidthMessage = "La imagen debe tener {{ max_width }}px de ancho.",
* maxHeightMessage = "La imagen debe tener {{ max_height }}px de alto."
* )
* @Vich\UploadableField(mapping="product_mapping", fileNameProperty="fileName")
*
* @var File $file
*/
protected $file;
/**
* @var string $fileName
*
* @ORM\Column(name="fileName", type="string", length=255, nullable = false)
*/
protected $fileName;
Обратите внимание на @Assert\NotNull() и nullable = false.
С этой конфигурацией я могу проверить создание новой сущности (если я позволю пустому полю файла, то в генераторе админки покажут мне сообщение: поле не может быть пустым...), но когда я редактирую (обновляю)) созданный объект, проверка для NotNull повышается (с объектом, ранее созданным с допустимым файлом). Я вынужден снова загрузить файл, чтобы иметь возможность обновить сущность.
Это конфигурация для генератора администратора (entity-generator.yml)
file:
label: Imagen
formType: single_upload
dbType: string
addFormOptions:
#required: true ## this launch a exception
previewFilter: 150x150_outbound_thumnail
help: "La imagen del producto debe tener 237px de ancho y 170px de alto, y no debe exceder los 50kb."
заранее спасибо
2 ответа
Я хочу поделиться своим собственным решением для этой проблемы:
Проблема возникла, когда я установил ограничения для файла (или изображения, такие как максимальная ширина, максимальная высота и т. Д.) Для свойства файла в объекте, а также ограничение NotNull. Другими словами, я хочу проверить, чтобы файл был таким, каким я хочу быть, а также сделать файл необходимым. Я использую Vich Uploadable Bundle.
Проблема заключается в том, что при сбое какого-либо ограничения файла файл не загружается в объект, и при сбое формы Admin Generator Bundle файл снова отображается при повторном отображении формы.
Что я делаю: не используйте ограничение NotNull.
В моей файловой сущности я создаю новое свойство: requiredFile как личное, не сохраняемое в БД. Также я создаю ограничение обратного вызова: validateRequiredFile. В конструкторе установите требуемый файл = true и вуаля!
Последняя сущность выглядит так:
/ ** * @Vich \ Uploadable * @ORM \ Table (name = "table_name") * @Assert \ Callback (method ={"validateRequiredFile"}) * @ORM\Entity(repositoryClass="repo/path") */ Класс продукта {...
/**
* Non persistent, just to determinate if file is required
* @var string
*/
private $requiredFile;
...
/**
* Constructor
*/
public function __construct()
{
$this->requiredFile = true;
}
...
/**
* This function is to validate the requires files
*
* How to use:
* In the contructor of the entity who inherit from BaseFile, set requiredFile property as true, Ex:
* public function __construct()
* {
* ...
* $this->requiredFile = true;
* parent::__construct();
* }
*
* @param \Symfony\Component\Validator\ExecutionContextInterface $context
*/
public function validateRequiredFile(ExecutionContextInterface $context){
//get the validated object
$object = $context->getValue();
//to know if is a creation or a update
$newObject = $object->getId() == null;
//validation
if ($newObject && empty($this->file) && $this->requiredFile === true ) {
$context->addViolationAt('file', "The file is required", array(), null);
$this->fileName = Constants::RELATIVE_NOT_VALID_IMAGE_PATH;
}
//in case we dont want to validate file as required, and no file was updated, clean property "fileName" who was setted in constructor
if ($newObject && empty($this->file) && empty($this->requiredFile)) {
$this->fileName = null;
}
}
PS: я создаю пользовательское изображение для отображения в случае сбоя проверки. Я положил его в веб-папку, чтобы быть доступным для всего сайта. Путь к этому изображению сохраняется в константах:: RELATIVE_NOT_VALID_IMAGE_PATH;
PS1: функция validateRequiredFile ориентирована так, чтобы находиться в сущности BaseFile (@ORM\MappedSuperclass), где я помещаю все общие свойства для сущности с файлом. Таким образом, даже легко использовать эту функциональность.
Я нуждаюсь в помощи, это стоило мне времени:(
single_upload не поддерживается, у вас будут проблемы с его использованием. Несколько месяцев назад этот проект изменил свои типы форм на AvocodeFormExtension - но упомянул об этом только в журнале изменений. Зачем редактировать документацию?
Если вы все еще хотите использовать single_upload, попробуйте проверить наличие файла в контроллере. Если вы отметите это поле как обязательное, вам придется загружать его каждый раз, даже редактируя объект с прикрепленным файлом. Обязательно означает, что отправляемая из браузера на сервер форма должна содержать файл, а не объект! (Я использую FormType или шаблоны, чтобы передать необходимые для newActions, и не требуются для editActions)
Удачи!