0

エンティティ ( 'data_class' => ...) にマップされたフォームがあります。エンティティのプロパティに (注釈を介して) バリデーターを設定しました。

エンティティには、nameTranslationsドクトリンのタイプ のプロパティ ( ) がありますarray。フォームのこのフィールドに割り当てられる複数のフィールドで構成されるカスタム フィールド タイプを作成しました。サブフォームの各フィールド (タイプ) には、オプションを介しtextてバリデーターのセットアップ ( ) があります。NotBlankvalidation_constraint

nameTranslationsなど、プロパティでさまざまな検証注釈を試しましたValid()。ほとんど何でも error_bubbling を設定してみました。サブフォーム (フィールドnameTranslations) はまったく検証されません。

サブフォーム:

class TranslatableTextType extends AbstractType
{
    private $langs;

    /**
    * {@inheritDoc}
    */
    public function __construct($multilang)
    {
        $this->langs = $multilang->getLangs();
    }

    /**
    * {@inheritDoc}
    */
    public function buildForm(FormBuilder $builder, array $options)
    {
        foreach($this->langs as $locale => $lang)
        {
            $builder->add($locale, 'text', array(
                'label' => sprintf("%s [%s]", $options['label'], $lang),
                'error_bubbling' => true,
            ));
        }
    }

    /**
    * {@inheritDoc}
    */
    public function getDefaultOptions(array $options)
    {
        $constraints = [
            'fields' => [],
            'allowExtraFields' => true,
            'allowMissingFields' => true,
        ];

        foreach($this->langs as $locale => $lang)
        {
            $constraints['fields'][$locale] = new NotBlank();
        }

        $collectionConstraint = new Collection($constraints);

        return [
            'validation_constraint' => $collectionConstraint,
            'label' => '',
            'error_bubbling' => true
        ];
    }

    /**
    * {@inheritDoc}
    */
    public function getParent(array $options)
    {
        return 'form';
    }

    /**
    * {@inheritDoc}
    */
    public function getName()
    {
        return 'translatable_text';
    }
}

メインフォーム:

$builder->add('nameTranslations', 'translatable_text', [
            'label' => 'Name'
        ]);

エンティティ内:

/**
 * @var array
 *
 * @Assert\Valid
 * @ORM\Column(type="array")
 */
protected $nameTranslations;
4

1 に答える 1

0

そのためには、カスタムタイプの代わりにコレクションタイプを使用するか、カスタムタイプのコレクションタイプを親として定義する必要があると思います。

次のようなすべてのバリデーターを使用できます。

/**
 * @Assert\All({
 *     @Assert\NotBlank
 * })
 * @ORM\Column(type="array")
 */
 protected $nameTranslations;

各配列値が空白でないかどうかをチェックします。

于 2013-01-11T19:33:40.860 に答える