ZF2 - inputFilter - >将值设置为null

时间:2017-07-08 18:25:03

标签: mysql pdo zend-framework2

在我的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 - 无法添加或更新子行:外键约束失败(appcodes,CONSTRAINT fk_products_id FOREIGN KEY({{ 1}})参考productIdproducts)))

我应该如何将空参数传递给我的数据库?如果我从形式完全切割这个字段然后它被忽略,一切正常。

1 个答案:

答案 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)),
    ),
));