2012-07-07 13 views
13

En mi entidad Doctrina, que es data_class para mi forma I tiene un fichero propiedad definida así:campo de entrada de archivo en blanco no en forma de Symfony2

/** 
    * Image. 
    * 
    * @Assert\NotBlank 
    * @Assert\File 
    * @Assert\Image(minWidth="138", minHeight="96") 
    */ 
    protected $file; 

Además, añade que para formar el tipo con ->add('file', 'file') ...

Crear entidad funciona perfecto, pero el problema es cuando uso el formulario para actualizar esta entidad. Solicita el archivo nuevamente, ya que tiene @Asertar \ NotBlank. Como tengo otros campos en este formulario, no quiero volver a cargar la imagen en cada actualización.

Cuando elimino @Assert \ NotBlank, todo funciona bien, pero quiero que este campo de archivo sea obligatorio.

¿Alguna idea?

Respuesta

7

tienes dos maneras de salir de esta situación y ambos dependen de Callback validadores: (Symfony callback)

O añadir boolean llamado isUpdate a que entidad que no se persistió y le dirá validador que se ha intentado la operación. Este método se describe por completo en el enlace anterior.

Otra forma de abordar esto es agregar el validador de devolución de llamada directamente a su tipo de formulario. Una vez más, será necesario algún isUpdate bandera pero esta vez dentro del tipo de formulario (que pasan a través de constructor):

if ($this->isUpdate == false){ 
    $builder->addValidator(new CallbackValidator(function(FormInterface $form){ 
     if ($form['image_file']->getData() == NULL){ 
      $form->addError(new FormError('You need to specify image file.'));     
     } 
    })); 
} 

tal vez hay manera más simple para lograr la validación deseado, pero me encontré con estos dos unos meses atrás.

Espero que esto ayude ...

+1

Gracias, eso me dio ideas, definitivamente :) No entiendo por qué necesita otro isUpdate booleano, y ¿cómo se establecen esos valores? Comprobé 'if (null! == $ this-> getId())'. Puedes consultar mi esencia https://gist.github.com/3066507. Incluso fue más divertido en Symfony 2.0 cuando puedes pasar el contexto al validador https://gist.github.com/3066488. Gracias de nuevo. – umpirsky

+0

Oh, buen punto. Al comparar ID de entidad con nulo, definitivamente podría decir si la operación es "agregar" o "actualizar". Y la segunda esencia es la solución perfecta, supongo :) –

+0

Sí, lástima que cerraron ExecutionContext y ya no es posible establecer la ruta de la propiedad fuera de la clase https://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky

6

También puede utilizar grupos de validación para eso. Un grupo de validación (quizás uno por defecto) será para crear y segundo para actualizar.

+0

Debería ser la respuesta aceptada IMO – Shady

+0

Sé que esto es muy viejo, pero ¿podrías elaborar un poco? Estoy luchando por comprender la documentación sobre eso, en realidad no es amigable con novatos. Si puede hacerlo compatible con v3, sería muy agradable –

Cuestiones relacionadas