我有一个映射到实体 ( '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;