在我的 ZF2 应用程序中,我有一个包含几个可选字段的表单。如果用户决定将该字段留空,那么它应该在 db 中将其设置为 NULL,但是 - 它不起作用。
示例字段:
$this->add(array(
'name' => 'productId',
'type' => 'select',
'options' => array(
'value_options' => array(
'global' => 'Global option', // this should be null
'mobile' => 'Another option'
)
),
));
并过滤:
$inputFilter->add(array(
'name' => 'productId',
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
// 'messages' => array(
// ZendValidatorCallback::INVALID_VALUE => $value,
// ),
'callback' => function ($value) {
if($value === 'global')
{
$value = null;
//return true;
// echo '<pre>' . var_export($value, true) . '</pre>';
// die();
}
}
),
),
),
));
当选择"移动"选项时,这段代码有效。但是,使用"全局"选项它不起作用。 如您所见,我已经做了一些基本的调试,以确保该值在回调时被覆盖,并且它确实返回 NULL。不管验证者说:
阵列 ( '产品 ID' => 阵列 ( 'callbackValue' => '输入无效', ), )
所以我试图在回调时返回 true,导致以下错误:
无法执行语句 (23000 - 1452 - 无法添加或更新子行:外键约束失败 (
app
.codes
、约束fk_products_id
外键(productId
(引用products
(id
((
我应该如何将空参数传递给我的数据库?如果我从表单中完全删除此字段,则将其忽略并且一切正常。
找到解决方案,实际上非常简单。
我可以将所需的选择选项设置为某个特定值,然后使用 ToNull 过滤器将其转换为空 - https://framework.zend.com/manual/2.4/en/modules/zend.filter.null.html
$inputFilter代码:
$inputFilter->add(array(
'name' => 'productId',
'required' => false,
'filters' => array(
array('name' => 'ToNull', 'options' => array('type' => ZendFilterToNull::TYPE_STRING)),
),
));