在Symfony2中一次验证多个复选框(需要一个)的正确方法是什么?

5sxhfpxr  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(95)

假设我们有一个包含3个复选框(A,B,C)的Symfony2表单,我们希望用户至少勾选一个复选框来验证表单,因此任何组合([A],[B],[C],[A,B],[A,C],[B,C],[A,B,C])都将返回true,而没有选择[]返回false。
在Doctrine对象上使用Symfony验证器来实现这一点的正确方法是什么?

编辑

使用Doctrine @ORM\Column(type="boolean")将每个复选框Map到数据库中它自己的列

w80xi6nr

w80xi6nr1#

如果您正确地使用选项列表的选择字段类型,则可以使用ChoiceValidator

@Assert\Choice(min=1, minMessage = "You must choose at least one option.")

从文档中:
如果multiple选项为true,则可以使用min选项强制选择至少XX个值。例如,如果min为3,但输入数组仅包含2个有效项,则验证将失败。

8ulbf1ek

8ulbf1ek2#

问题解决了
基于Symfony2类约束验证器文档和有关更改设置验证子路径到UPGRADE-2.1.md的附加信息
在我的实体类中,我添加了:

class Message
{

  // ...

  // check if user selected at least one network to publish the message
  public function isNetworkSelected(ExecutionContext $context)
  {
    if (!$this->network_twitter && !$this->network_facebook && !$this->network_googleplus)
    {
      $context->addViolationAtSubPath('network_facebook', 'Please select at least one network', array(), null);
    }
  }

  // ...

}

validation.yml中:

MY\MessageBundle\Entity\Message
    constraints:
        - Callback:
            methods:   [isNetworkSelected]
ddrv8njm

ddrv8njm3#

你有一个按钮控件吗?如果有,在点击事件上,检查是否有一个选择,如果有,返回true,否则返回false。

zyfwsgd6

zyfwsgd64#

我们可以使用Expression约束:

namespace App\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;

class MyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('myFirstCheckbox', CheckboxType::class, [
                'required'=> false,
            ])
            ->add('mySecondCheckbox', CheckboxType::class, [
                'required'=> false,
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'constraints' => new Assert\Expression(
                expression: 'this.get("myFirstCheckbox").getData() or this.get("mySecondCheckbox").getData()',
                message: 'Please choose 1 of the 2 checkboxes.',
            )
        ]);
    }
}

相关问题