所以我有一个“简单”的形式
class SiteAddForm extends Form
{
public function __construct()
{
parent::__construct('add_site_form');
$site = new SiteFieldSet();
$this->add($site);
}
public function getTemplate()
{
return 'site_add.phtml';
}
}
它自己的表格什么也没做。它添加了一个field_set并返回一个模板名称。
SiteFieldSet看起来像:
class SiteFieldSet
extends FieldSet
implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct('site');
$name = new Text('name');
$this->add($name);
$domains = new Collection('domains');
$domains->setTargetElement(new DomainFieldSet())
->setShouldCreateTemplate(true);
$this->add($domains);
}
public function getTemplate()
{
return 'site.phtml';
}
/**
* Should return an array specification compatible with
* {@link Zend\InputFilter\Factory::createInputFilter()}.
*
* @return array
*/
public function getInputFilterSpecification()
{
return [
'name' => [
'required' => true,
'validators' => [
new StringLength([
'min' => 200,
])
]
],
'domains' => [
'required' => true,
],
];
}
}
它向fieldset添加了一个text和collection元素。字段集实现InputFilterProviderInterface
以验证投入其中的数据。
名称必须至少为200个字符(用于测试),并且需要收集。
但现在问题来了。使用抛出到集合中的字段集,代码:
class DomainFieldSet
extends FieldSet
implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct('domain');
$host = new Url('host');
$this->add($host);
$language = new Select('language', [
'value_options' => [
'nl_NL' => 'NL',
],
]);
$this->add($language);
$theme = new Select('theme', [
'value_options' => [
'yeti' => 'Yeti',
]
]);
$this->add($theme);
}
public function getTemplate()
{
return 'domain.phtml';
}
/**
* Should return an array specification compatible with
* {@link Zend\InputFilter\Factory::createInputFilter()}.
*
* @return array
*/
public function getInputFilterSpecification()
{
return [
'host' => [
'required' => true,
'validators' => [
new StringLength([
'min' => 200,
])
]
],
'language' => [
'required' => true,
],
'theme' => [
'required' => true,
],
];
}
}
再一点没什么特别的。现在有三个元素定义主机,主题和&语言。字段集再次实现InputFilterProviderInterface
。所以在类中必须有一个getInputFilterSpecification。
当我填写表格时
site[name]
=“测试”
site[domains][0][host]
='测试'
site[domains][0][theme]
='雪人'
site[domains][0][language]
='nl_NL'
它给网站[name]一个错误,说它必须至少200个字符,所以验证“有效”
但它也应该在site[domains][0][host]
上给出一个错误,它需要至少200个字符(代码是复制粘贴的,并且使用是正确的。)
那么为什么不进行验证,以及如何解决问题,以便正确验证集合中的元素/字段集
答案 0 :(得分:2)
尝试以__construct方法
的形式使用setValidationGroup像:
public function __construct()
{
$this->add(array(
'type' => 'Your\Namespace\SiteFieldSet',
'options' => array(
'use_as_base_fieldset' => true,
),
));
$this->setValidationGroup(array(
'site' => array(
'domain' => array(
'host',
'language',
'theme',
),
),
));
}
或者这可能也有效......
$this->setValidationGroup(FormInterface::VALIDATE_ALL);