2017-10-13 5 views
1

私は多くのイメージを持つプロジェクトエンティティを持っています。すべてのイメージにタイトル、imageFile属性があります。Symfony 3のコレクションの各項目に対して異なる検証グループを指定しますか?

プロジェクトフォームからイメージを追加、更新、削除できるようにします。

問題は、projectImageエンティティの検証グループが新しくなったときに、編集するときとは異なることです。

、これはコード

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'; 
    } 
} 

あなたは、私が検証グループ "NEWIMAGE" を追加しているProjectImageTypeで見ることができるようですイメージが新しいか、ユーザーが新しいイメージを追加したい場合、この場合はimのみ年齢ファイルが必要であり、ユーザーがイメージのタイトルを更新するだけの場合は必要ありません。

ProjectImageTypeで追加する検証グループ "newImage"は常に無視されます。

私はここSpecify different validation groups for each item of a collection in Symfony 2? 提供される解決策を試してみましたが、問題はsymfony 3

から削除cascade_validationオプションは、ここで問題が異なるの検証グループに対して、すべてのコレクション型のエンティティを検証しても異なることができどのようなことです親フォームタイプの検証グループから?

答えて

3

私は次のようにプロジェクトエンティティにおけるコールバックの検証を追加することにより、検証グループを使用せずに、問題を解決:

ProjectImageエンティティ

/** 
* 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(); 
    } 
} 
関連する問題