1

私は次のフォームクラスを持っています:

public function buildForm(FormBuilderInterface $builder, array $options)
{
        $builder
            ->add('existingfolder', 'entity', array(
                'class'     => 'ImageBundle:Folder',
                'required'  => false,
            ))
            ->add('folder', 'text', array('required' => false))
            ->add('file', 'file');
}

existingfolderまたはfolderフィールドのいずれか(両方ではない)に入力する必要があるように検証を設定するにはどうすればよいですか?

アドバイスをいただければ幸いです。

ありがとう。

4

1 に答える 1

8

TrueまたはCallback検証アサーションを使用します。ここでは、ユーザーが少なくとも1つのフォルダーを指定する必要があるかどうかを確認する例を示します。

<?php
namespace Acme\BlogBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Image
{
    // ...properties, functions, etc...

    /**
     * @Assert\True(message = "You must give at least an existing folder or a new folder")
     */
    public function isThereOneFieldFilled()
    {
        return ($this->existingfolder || $this->folder); // If false, display an error !
    }
}

ここに、ユーザーが1つのフィールドのみを指定する必要があり、両方を指定する必要がない場合の別の例を示します。

    /**
     * @Assert\True(message = "You must give an existing folder or a new folder, not both")
     */
    public function isThereOnlyOneFieldFilled()
    {
        return (!$this->existingfolder && $this->folder || $this->existingfolder && !$this->folder);
    }

編集:

フォーム内のコールバック検証(ここで例を見つけました):

// use ...
use Symfony\Component\Form\CallbackValidator;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormInterface;

// Inside the form:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('existingfolder', 'entity', array(
            'class'     => 'ImageBundle:Folder',
            'required'  => false,
        ))
        ->add('folder', 'text', array('required' => false))
        ->add('file', 'file');

    // Use the CallbackValidator like a TrueValidator behavior
    $builder->addValidator(new CallbackValidator(function(FormInterface $form) {
        if (!$form["existingfolder"]->getData() && !$form["folder"]->getData()) {
            $form->addError(new FormError('You must give at least an existing folder or a new folder'));
        }
    }));
}
于 2013-01-07T08:28:43.777 に答える