我有一个实体的ZendFormForm
,它使用DoctrineModuleFormElementObjectSelect
元素使用户能够选择引用的实体。
class MyEntityForm extends ZendFormForm
{
public function __construct()
{
// ...
$this->add([
'name' => 'referenced_entity',
'type' => 'DoctrineModuleFormElementObjectSelect',
'options' => [
'object_manager' => $object_manager,
'target_class' => 'MyOtherEntity',
'property' => 'id',
'display_empty_item' => true
],
]);
// ...
}
}
引用的实体可以为空(= 数据库中的外键字段可以NULL
)。我只是无法让表单来验证是否没有选择引用的实体。我希望我的表单能够验证,即使给定的referenced_entity
为空(null
或""
)或根本不存在(数据数组中缺少键referenced_entity
)。
我尝试了各种不同的输入滤波器规格,最后的设置如下所示
class MyEntityForm
extends ZendFormForm
implements ZendInputFilterInputProviderInterface
{
// ...
public function getInputSpecification()
{
return [
// ...
'referenced_entity' => [
'required' => false,
'allow_empty' => true,
'continue_if_empty' => false
],
// ...
}
// ...
}
但无济于事,验证错误保持不变($form->isValid()
后$form->getMessages()
var_dump摘录)
'referenced_entity' =>
array (size=1)
'isEmpty' => string 'Value is required and can't be empty' (length=36)
我是否必须扩展ObjectSelect
表单元素才能更改其输入过滤器规范并删除isEmpty
验证器,或者是否有更简单的解决方案?
如果我记得不错,如果要在Form
类中提供输入筛选器配置,则必须实现输入筛选器提供程序接口。 如果要在元素级别配置它,则Element
类必须实现InputProviderInterface接口
所以这意味着你的表单类必须是这样的:
class MyEntityForm
extends ZendFormForm
implements
// this...
// ZendInputFilterInputProviderInterface
// must be this!
ZendInputFilterInputFilterProviderInterface
{
// ...
public function getInputFilterSpecification()
{
return [
// ...
'referenced_entity' => [
'required' => false,
'validators' => [],
'filters' => [],
],
// ...
}
// ...
}
DoctrineModuleFormElementObjectSelect
继承了ZendFormElementSelect
,它自动包含一个带有自身验证器的输入规范。
我没有测试自己,但解决这个问题的一种方法是通过在选项中添加'disable_inarray_validator'
键来删除此验证器:
public function __construct()
{
// ...
$this->add([
'name' => 'referenced_entity',
'type' => 'DoctrineModuleFormElementObjectSelect',
'options' => [
'object_manager' => $object_manager,
'target_class' => 'MyOtherEntity',
'property' => 'id',
'display_empty_item' => true,
'disable_inarray_validator' => true
],
]);
// ...
//or via method
$this->get('referenced_entity')->setDisableInArrayValidator(true);
}