我有一个映射到实体('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;
答案 0 :(得分:0)
我认为你应该使用collection类型而不是自定义类型,或者你的自定义类型应该将集合类型定义为父类。
您可以使用All验证码,如:
/**
* @Assert\All({
* @Assert\NotBlank
* })
* @ORM\Column(type="array")
*/
protected $nameTranslations;
它将检查每个数组值是否为空白。