在我的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(
// \Zend\Validator\Callback::INVALID_VALUE => $value,
// ),
'callback' => function ($value) {
if($value === 'global')
{
$value = null;
//return true;
// echo '<pre>' . var_export($value, true) . '</pre>';
// die();
}
}
),
),
),
));
这段代码适用于&#34; mobile&#34;选项已被选中。但是,有了全球的&#39;选项它没有用。 正如您所看到的,我已经完成了一些基本的调试,以确保在回调时覆盖了值,并且它确实返回NULL。无论验证者说什么:
阵列( &#39;的productId&#39; =&GT; 阵列( &#39; callbackValue&#39; =&GT; &#39;输入无效&#39;, ) )
所以我试图在回调时返回true,导致以下错误:
无法执行语句(23000 - 1452 - 无法添加或更新子行:外键约束失败(
app
。codes
,CONSTRAINTfk_products_id
FOREIGN KEY({{ 1}})参考productId
(products
)))
我应该如何将空参数传递给我的数据库?如果我从形式完全切割这个字段然后它被忽略,一切正常。
答案 0 :(得分:0)
找到解决方案,实际上非常简单。
我可以将所需的选项设置为某个特定值,然后使用ToNull过滤器将其转换为null - 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' => \Zend\Filter\ToNull::TYPE_STRING)),
),
));