2017-10-13 14 views
1

J'ai une entité de projet qui a beaucoup d'images, chaque image a un titre, attributs imageFileSpécifiez différents groupes de validation pour chaque élément d'une collection dans Symfony 3?

Je souhaite que l'utilisateur puisse ajouter, mettre à jour et supprimer des images du formulaire de projet.

Le problème est que les groupes de validation d'entité projectImage lorsqu'ils sont nouveaux doivent être différents de ceux en cours de modification.

ce qui est le code

ProjectType

class ProjectType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->addEventSubscriber(new \ControlPanelBundle\Form\EventListener\CityFieldSubscriber()) 
      ->addEventSubscriber(new \ControlPanelBundle\Form\EventListener\CountryFieldSubscriber()); 

     $builder 
      ->add('title') 
      ->add('description') 
      ->add('area') 
      ->add('startDate') 
      ->add('deliveryDate') 
      ->add('phases') 
      ->add('partners', EntityType::class, [ 
       'class'   => 'AppBundle:Partner', 
       'multiple'  => true, 
       'query_builder' => function (EntityRepository $er) { 
        return $er->createQueryBuilder('p') 
         ->orderBy('p.title', 'ASC'); 
       } 
      ]) 
      ->add('projectImages', CollectionType::class, [ 
       'entry_type'  => ProjectImageType::class, 
       'allow_add'  => true, 
       'allow_delete' => true, 
       'delete_empty' => true, 
       'by_reference' => false, 
       'error_bubbling' => false 
     ]); 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Project' 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'project'; 
    } 
} 

ProjectImageType

class ProjectImageType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('id', HiddenType::class) 
      ->add('title', TextType::class) 
      ->add('type', ChoiceType::class, ['choices' => array_flip(\AppBundle\Entity\ProjectImage::getTypeChoices())]) 
      ->add('imageFile', FileType::class); 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class'  => 'AppBundle\Entity\ProjectImage', 
      'validation_groups' => function(\Symfony\Component\Form\FormInterface $form) { 
       $validationGroups = ['Default']; 

       if ($form->getData() === null || null === $form->getData()->getId()) { 
        $validationGroups[] = "newImage"; 
       } 

       return $validationGroups; 
      } 
     ]); 
    } 

    public function getName() 
    { 
     return 'project_image'; 
    } 
} 

comme vous pouvez le voir dans le ProjectImageType j'ajouter un groupe de validation "newImage" si l'image est neuve ou si l'utilisateur veut ajouter une nouvelle image, dans ce cas seulement l'im Le fichier d'âge devrait être obligatoire et ne devrait pas être requis si l'utilisateur veut juste mettre à jour le titre de l'image.

le problème est que le groupe de validation "newImage" que j'ajoute dans ProjectImageType est toujours ignoré.

J'ai essayé la solution fournie ici Specify different validation groups for each item of a collection in Symfony 2? mais le problème est que l'option cascade_validation retiré de symfony 3

la question ici est de savoir comment peut valider chaque entité de type collection contre différents groupes de validation de l'autre et aussi différents à partir des groupes de validation de type de formulaire parent?

Répondre

3

je résolu le problème sans utiliser des groupes de validation en ajoutant une validation de rappel dans l'entité de projet comme suit:

ProjectImage Entité

/** 
* assert that image not blank only if new object 
* 
* @Assert\Callback 
*/ 
public function validateImage(ExecutionContextInterface $context) { 
    if (null === $this->id && null === $this->getImageFile()) { 
     $context->buildViolation('Image is required') 
       ->atPath('imageFile') 
       ->addViolation(); 
    } 
}