ZF2 + 原则模块:允许原则表单元素对象选择为空



我有一个实体的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);
}

相关内容

  • 没有找到相关文章