验证器取决于提交按钮和属性值

Validator depends on Submit button and on attribute value

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

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

示例:

实体:

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

表格类型

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),因为我的表单未提交,如果单击 'Submit2',布尔 'clicked' 值始终为 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
}

谢谢你的灯!

最好将模板逻辑(按钮点击)和应用程序一分开。您应该将 state 隐藏字段添加到表单并监听 javascript 订阅者的按钮点击,以根据按下的按钮设置 state 字段值。

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

实体

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

表格类型

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");
   }
}