Как установить поле файла в соответствии с требованиями генератора генератора связки 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)

Удачи!

Другие вопросы по тегам