Validator取决于Submit按钮和属性值

时间:2017-12-28 10:09:43

标签: symfony symfony-forms

我的提交表单有问题。 我有个人约束,取决于我的实体属性的值(属性不在我的形式)。 单击特定的提交按钮时,必须设置该值(我有多个提交按钮)。

我的问题是我的验证器没有应用。

示例:

实体:

/**
* @MyPersonnalConstraint()
*/    
class Test
{
   private $id;
   private $text;
   private $text2;
   private $state;
}

FormType

public function buildForm(FormBuilderInterface $builder, array $options)
{
   $builder
      ->add('text',    TextType::class)
      ->add('text2',   TextType::class)
      ->add('Submit1', SubmitType::class)
      ->add('Submit2', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Test::class,
    ]);
}

MyPersonnalConstraintValidator

public function validate($value, Constraint $constraint)
{
    if ($value->getState("X")) {   //<-- "X" is set only if "Submit2" is clicked
        if($value->getText2() === null || $value->getText2() === ""){
              $this->context->buildViolation($constraint->message)
                   ->atPath('text2')
                   ->addViolation();
        }
    }
}

当我点击Submit2按钮时,我必须$test->setState("X")

我无法使用addEventListener(PRE_SUBMIT),因为我的表单未提交且布尔点击了#39;如果点击&#39; Submit2&#39;。

,则值始终为false

并且

在我的控制器中,在handleRequest($request)方法后,我可以在我的按钮上抓取isClicked但是对于提交(setState("X"))$form->isValid()提交的修改表单数据来说太晚了总是如此。

控制器:

$form->handleRequest($request);

if ($form->get('Submit2')->isClicked()) {
    $form->getData()->setState("X");
}

if ($form->isSubmitted() && $form->isValid()) {
     //Already valid
}

感谢您的灯光!

2 个答案:

答案 0 :(得分:0)

将模板逻辑(按钮点击)和应用程序逻辑分开是一种很好的做法。您应该在表单中添加state隐藏字段,并听取javascript订阅者按下按钮的次数,以根据按下的按钮设置state字段值。

答案 1 :(得分:0)

我以不同的方式解决了我的问题:

实体

/**
* @MyPersonnalConstraint(groups={'mygroup'})    <--- Add Validation group
*/    
class Test
{
   private $id;
   private $text;
   private $text2;
   private $state;
}

FormType

public function buildForm(FormBuilderInterface $builder, array $options)
{
   $builder
      ->add('text',    TextType::class)
      ->add('text2',   TextType::class)
      ->add('Submit1', SubmitType::class, array(
        'validation_groups' => array('mygroup', 'Default')  //<- Add Validation Group 
      ))
      ->add('Submit2', SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Test::class,
    ]);
}

MyPersonnalConstraintValidator

public function validate($value, Constraint $constraint)
{
//Without test on getState        
if($value->getText2() === null || $value->getText2() === ""){
          $this->context->buildViolation($constraint->message)
               ->atPath('text2')
               ->addViolation();
    }
}

控制器:

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
   if ($form->get('Submit2')->isClicked()) {
        $test->setState("X");
   }
}