8

我的表单作为字段users(实体类型)。如何添加验证以明确应选择至少一个用户?实际上我正在添加一个事件监听器,但我不知道这是否是一个合法的解决方案:

public function buildForm(\Symfony\Component\Form\FormBuilder $builder,
    array $options)
{
    $builder
        ->add('title', 'text', array(
            'label' => 'Titolo'
        ))
        ->add('content',  'textarea', array(
            'label' => 'Contenuto'
        ))
        ->add('sender_text',  'text', array(
            'label' => 'Mittente testuale',
        ))
        ->add('users', 'entity', array(
            'label'    => 'Destinatari',
            'class'    => 'DL\FidelityBundle\Entity\User',
            'property' => 'select_label',
            'multiple' => true
        ));
    ;

    // Valida il numero di utenti selezionati
    $builder->addEventListener(\Symfony\Component\Form\FormEvents::POST_BIND,
        function($event) {
            $form = $event->getForm();
            $data = $event->getData();

            if(!$data->users->isEmpty()) return;

            $msg = 'Occorre specificare almeno un utente destinatario';
            $form->get('users')->addError(new FormError($msg));
    });
}
4

3 回答 3

20

从 Symfony 2.1 开始,您可以使用Count约束。如果您使用的是 2.0,您可以简单地将约束复制到您的项目并调整其命名空间和 API(在 2.0 和 2.1 之间略有更改)。

/**
 * @Assert\Count(min = 1, minMessage = "Occorre specificare almeno un utente destinatario") 
 */
private $users = new ArrayCollection();
于 2012-07-25T17:40:30.917 回答
5

您是否尝试过使用 Count 约束验证器?我想您的代码将如下所示:

->add('users', 'entity', array(
        'label'    => 'Destinatari',
        'class'    => 'DL\FidelityBundle\Entity\User',
        'property' => 'select_label',
        'multiple' => true,
        'constraints' => new Count(
            array('min' => 1, 'minMessage' => "Please select at least one user')
        ),
    ));
于 2013-07-24T00:29:42.707 回答
-1

看看验证组件:http ://symfony.com/doc/current/book/validation.html

您可以在要验证的对象中编写回调约束:

use Symfony\Component\Validator\ExecutionContext;

public function isUsersValid(ExecutionContext $context)
{
    if ($this->users->isEmpty()) {
        $propertyPath = $context->getPropertyPath() . '.users';
        $context->setPropertyPath($propertyPath);
        $context->addViolation('Occorre specificare almeno un utente destinatario', array(), null);
    }
}

请参阅回调约束页面如何将此约束添加到您的实体(这取决于您是否使用注释或 yaml/xml)。

于 2012-07-03T12:46:05.757 回答