2017-03-14 1 views
1

J'ai plusieurs Entités, utilisées sous une forme unique, qui s'étendent à partir d'une classe abstraite. J'ai créé un type de formulaire pour chaque entité, puis ils ont été intégrés dans un formulaire parent. Je souhaite effectuer une validation basée sur des groupes, ainsi EmailType doit vérifier la propriété "elemento" uniquement sur Assert \ NotBlank (groupe par défaut) et Assert \ Email (groupe d'e-mails), et Telefono doit vérifier Assert \ NotBlank (Groupe par défaut) et Assert \ Regex (groupe de téléphones).Symfony Embedded Form Validation

Avec ma configuration les deux vérifications (contraintes) sont effectuées, donc les e-mails sont vérifiés sur la contrainte Email AND Regex, et donc le téléphone classé est ... Où puis-je me tromper?

personnel Entité sur les courriels de collecte et de téléphones ont configuré le Assertion \ valide() contraint

Ceci est l'exemple

Parent Formulaire

<?php 
namespace App\Form\Staff; 

class StaffType extends AbstractType { 

    public function configureOptions(OptionsResolver $resolver) { 
      $resolver->setDefaults(['data_class' => \Cowbell\Entity\Staff\Staff::class, 
        'validation_groups' => ['Default', 'email', 'phone']]); 
} 
    /** 
    * 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) { 


     // ... Other field of Staff Entity 

     ->add('emails', CollectionType::class, ['label' => 'admin.emails', 
       'entry_type' => \App\Form\Contatto\CBEmailType::class, 
       'entry_options' => ['label' => false], 
       'allow_add' => true, 
       'allow_delete' => true, 
       'empty_data' => null, 
       'translation_domain' => 'admin', 
       'validation_groups' => ['email']]) 
      ->add('telefoni', CollectionType::class, ['label' => 'admin.phones', 
       'entry_type' => \App\Form\Contatto\CBTelefonoType::class, 
       'entry_options' => ['label' => false], 
       'allow_add' => true, 
       'allow_delete' => true, 
       'empty_data' => null, 
       'translation_domain' => 'admin', 
       'validation_groups' => ['phone']]); 

    } 

} 

Puis CBEmailType

<?php 
namespace App\Form\Contatto; 

class CBEmailType extends AbstractType{ 

    /** 
    * 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(['data_class' => \App\Entity\Contatto\Email::class, 
     'validation_groups' => ['Default', 'email']]);; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->add('elemento', EmailType::class, ['label' => 'admin.email', 
        'translation_domain' => 'admin']) 

    } 

} 

CBTelefonoType

<?php 
namespace App\Form\Contatto; 

class CBTelefonoType extends AbstractType{ 

    /** 
    * 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(['data_class' => \Cowbell\Entity\Contatto\Telefono::class, 
     'validation_groups' => ['Default', 'phone']]); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 

     $builder->add('elemento', TextType::class, ['label' => 'admin.phone', 
       'translation_domain' => 'admin']) 

    } 

} 

deux, Email et Telefono étendent

<?php 
namespace App\Entity\Contact; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

abstract class AbstractElementoContact { 


    /** 
    * 
    * @var string 
    * 
    * @ORM\Column(name="elemento", type="string", length=100, nullable=false) 
    * @Assert\NotBlank() 
    * @Assert\Email(strict=true, checkHost=true, checkMX=true, groups={"email"}) 
    * @Assert\Regex("/[0-9]{6,50}/", groups={"phone"}) 
    */ 
    protected $elemento; 

Répondre

1

vous ne pouvez pas autant que je sache mettre validation_groups sur champ de formulaire CollectionType (resp. vous pouvez le définir, mais il n'a aucun effet), donc le formulaire entier, y compris l'ensemble des sous-formulaires de la collection est toujours validé avec validation_groups sur le formulaire parent entier. Le but de validation_groups est de permettre la modification des contraintes des propriétés de l'objet à différentes fins (par exemple en créant de nouvelles par rapport à l'édition existante), mais pas pour ce que vous avez décrit ci-dessus. Pensez à, s'il est possible, d'utiliser votre Email et Telephono en tant que propriété directement dans l'objet Staff (ou StaffType respectivement) en utilisant validation_groups pour résoudre le $ elemento devrait être Email elemento une fois et Telephono elemento une fois .. La solution pour votre cas est de définir Email et Telephono comme des classes différentes (non héritées de AbstractElementoContact) avec une contrainte spécifique pour chacune d'entre elles.

+0

Merci beaucoup. La propriété 'validation_groups' m'a induit en erreur et j'ai pensé qu'elle pourrait être utilisée pour "guider" la validation. Merci encore. –