Validator依赖于Submit按钮和属性值

问题描述 投票:2回答:2

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

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

示例:

实体 :

/**
* @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,
    ]);
}

我个人约束的人

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
}

谢谢你的灯!

symfony symfony-forms
2个回答
0
投票

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


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,
    ]);
}

我个人约束的人

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");
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.