我有一个用于课程订阅的表单,其中我有2个实体字段,活动和etudiant。如果我已经预订的培训师(我可以通过实体活动在DB中找到的信息),我不想验证此表格。 如何(在哪里......)我可以添加一些逻辑指令来控制这个表单的验证? 有人有想法吗?铅?没有Symfony(对我来说)会这么简单!... 感谢
class InscriptionType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('activiteId', 'entity',
array('label'=>'Activité',
'attr'=>array('class'=>'form-control'),
'class'=>'AssoFranceRussie\MainBundle\Entity\Activite',
'property'=>'nomEtNiveauEtJour',
))
->add('etudiantId', 'entity',array('label'=>'Etudiant',
'attr'=>array('class'=>'form-control'),
'class'=>'AssoFranceRussie\MainBundle\Entity\Etudiant',
'property'=>'NomEtPrenom',
))
;
}
答案 0 :(得分:1)
您可以通过扩展Symfony验证类来编写自己的约束和验证器。
您需要扩展Symfony\Component\Validator\Constraint
以定义约束,并Symfony\Component\Validator\ConstraintValidator
来定义验证代码。
也可能有其他方法可以做到这一点,但这可以让您完全控制验证。
答案 1 :(得分:1)
你可以用这种方式做你想做的事:
1-您需要一个变量来将EntityManager存储在InscriptionType类中:
protected $em;
public function __construct($em) {
$this->em = $em;
}
2-将实体管理器从控制器传递给FormType类,如下所示:
new InscriptionType( $this->getDoctrine()->getManager() );
3-在setDefaultOptions函数中添加你想要的逻辑,以指定validation_groups你想要的表单:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$p = $this->em->getRepository('YourBundle:YourEntity')->find(1);
if($p){
$resolver->setDefaults(array(
'data_class' => 'YourBundle\Entity\YourEntity',
'validation_groups' => array('myValidation1'),
'translation_domain'=>'custom'
));
}
else{
$resolver->setDefaults(array(
'data_class' => 'YourBundle\Entity\YourEntity',
'validation_groups' => array('myValidation2'),
'translation_domain'=>'custom'
));
}
}
4-在您的实体中,您需要为实体的字段指定验证组:
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
* @Assert\NotNull(groups={"myValidation1"})
*/
private $name;
/**
* @var date
*
* @ORM\Column(name="start", type="date")
* @Assert\NotNull(groups={"myValidation1", "myValidation2"})
* @Assert\Date()
*/
private $start;
在这种情况下,在两种情况下都会验证字段'start',但只有myValidation1的第一个字段才是要验证的组。
通过这种方式,您可以控制要验证的字段。