8

フィールドとしての私のフォームusers(エンティティタイプ)。少なくとも1人のユーザーを選択する必要があることを明確にするために、検証を追加するにはどうすればよいですか?実際、私はイベントリスナーを追加していますが、これが正当な解決策であるかどうかはわかりません。

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

カウント制約バリデーターを使用してみましたか?あなたのコードは次のようになると思います:

->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 に答える