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