datepicker发布now()即使是空的ZF2 Doctrine2

时间:2013-11-28 09:26:41

标签: doctrine-orm datepicker zend-framework2

我有一个带有两个日期的表单,我使用bootstrap3 datepicker。日期不是强制性的。当我提交表单并且未填写一个或两个日期时,发布的实体包含实际的日期时间而不是假的NULL。当我检查$ _POST时,日期为NULL。 我使用doctrine2和ZF2。也许您需要更多信息......提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我的解决方案是将过滤器Zend \ Filter \ Null添加到表单元素,以便将空字符串转换为NULL。

array(
  'name' => 'Zend\Filter\Null',
  'options' => array(
    'type' => 'string',
  ),
),

问题原因:

如果您的表单设置为BindOnValidate,那么将使用水分器,它可以操纵值。如果实体属性是DateTime,它会将字符串转换为DateTime对象。使用

进行测试
$form->setBindOnValidate(false);

这应该意味着你的价值仍然是一个空字符串'''在致电isValid()之后立即。

我发现DoctrineObject hydrator-> handleTypeConversions()正在将任何字符串(例如从我的表单POST)转换为DateTime对象以与实体字段保持一致。空字符串导致DateTime表示time(),即当前时间。

当我拦截表单POST并转换为空字符串''为了null,水化器将该字段留空。

我不确定在验证之前是否最好操纵控制器内的POST数据,或者修改水合作用策略但是我可能要么工作吗? 编辑:我尝试将自定义策略添加到DoctrineObject水合器中以转换空字符串''为NULL但DoctrineObject不触发自定义策略,它无论如何都进行类型转换。

正在进行更改的DoctrineObject水化器代码的副本:

protected function handleTypeConversions($value, $typeOfField)
{
    switch($typeOfField) {
        case 'datetime':
        case 'time':
        case 'date':
            if (is_int($value)) {
                $dateTime = new DateTime();
                $dateTime->setTimestamp($value);
                $value = $dateTime;
            } elseif (is_string($value)) {
                $value = new DateTime($value);
            }

            break;
        default:
    }

    return $value;
}

答案 1 :(得分:0)

您应该使用默认值NULL定义日期字段,然后添加nullable=true选项。

/**
 * @ORM\Column(type="date", nullable=true)
 */
private $someDateField= null;

请查看documentation了解详情。

答案 2 :(得分:0)

我发现了一些新东西: 在我的控制器中,$ form-> isValid()函数是使用当前日期时间填充日期字段的原因。 我在isValid()之前写出了字段值,并且它们按预期为NULL,因为没有在表单中填写。 我在isValid()之后写出了字段值,它们不是NULL,而是一个对象。

代码非常简单:

if ($form->isValid()) {
        $objectManager->persist($group);
        $objectManager->flush();
}

我真的不知道ghow要解决这个问题......