0

我有一个映射到实体 ( 'data_class' => ...) 的表单。我已经在实体的属性上设置了验证器(通过注释)。

该实体具有nameTranslations学说类型的属性 ( ) array。我创建了一个由多个字段组成的自定义字段类型,该字段在表单中分配给该字段。每个子表单的字段(类型text)都有验证器设置(NotBlank)通过validation_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

我认为您应该为此使用集合类型而不是自定义类型,或者您的自定义类型应该将集合类型定义为父级。

您可以使用All验证器,例如:

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

它将检查每个数组值是否不为空。

于 2013-01-11T19:33:40.860 回答