Doctrine orm datepicker posts now()即使ZF2 Doctrine2为空
我有一个有两个日期的表单,我使用bootstrap3日期选择器。日期不是强制性的。当我提交表单并且一个或两个日期都没有填写时,发布的实体包含实际的日期时间,而不是空的。当我检查$u POST时,日期为空。Doctrine orm datepicker posts now()即使ZF2 Doctrine2为空,doctrine-orm,datepicker,zend-framework2,Doctrine Orm,Datepicker,Zend Framework2,我有一个有两个日期的表单,我使用bootstrap3日期选择器。日期不是强制性的。当我提交表单并且一个或两个日期都没有填写时,发布的实体包含实际的日期时间,而不是空的。当我检查$u POST时,日期为空。 我使用doctrine2和ZF2。也许你需要更多的信息。。。提前感谢您的帮助。您应该使用默认值NULL定义日期字段,然后添加NULL=true选项 /** * @ORM\Column(type="date", nullable=true) */ private $someDateField
我使用doctrine2和ZF2。也许你需要更多的信息。。。提前感谢您的帮助。您应该使用默认值
NULL
定义日期字段,然后添加NULL=true
选项
/**
* @ORM\Column(type="date", nullable=true)
*/
private $someDateField= null;
查看以了解更多详细信息。您应该使用默认值
NULL
定义日期字段,然后添加NULL=true
选项
/**
* @ORM\Column(type="date", nullable=true)
*/
private $someDateField= null;
更多详情,请查看。我发现了一些新东西: 在我的控制器中,$form->isValid()函数是日期字段填充当前日期时间的原因。 我在isValid()之前写下了字段值,它们按预期为空,因为没有在表单中填写。 我在isValid()之后写出了字段值,它们不是NULL,而是一个对象 代码非常简单:
if ($form->isValid()) {
$objectManager->persist($group);
$objectManager->flush();
}
我真的不知道该怎么解决这个问题…我发现了一些新的东西: 在我的控制器中,$form->isValid()函数是日期字段填充当前日期时间的原因。 我在isValid()之前写下了字段值,它们按预期为空,因为没有在表单中填写。 我在isValid()之后写出了字段值,它们不是NULL,而是一个对象 代码非常简单:
if ($form->isValid()) {
$objectManager->persist($group);
$objectManager->flush();
}
我真的不知道该如何解决这个问题…我的解决方案是将filter Zend\filter\Null添加到表单元素中,以便将空字符串转换为Null
array(
'name' => 'Zend\Filter\Null',
'options' => array(
'type' => 'string',
),
),
问题原因:
如果您的表单设置为BindOnValidate
,则将使用一个可操纵值的计算器。如果实体属性是DateTime,则它将字符串转换为DateTime对象。使用
$form->setBindOnValidate(false);
这意味着您的值在调用isValid()
后立即保持为空字符串“”
我发现DoctrineObject->handleTypeConversions()
正在将任何字符串(例如来自我的表单帖子)转换为DateTime对象,以与实体字段保持一致。空字符串产生一个日期时间,表示time()
,即当前时间
当我截获表单POST并将空字符串“”转换为null时,该函数将该字段保留为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;
}
我的解决方案是将filter Zend\filter\Null添加到form元素中,以便将空字符串转换为Null
array(
'name' => 'Zend\Filter\Null',
'options' => array(
'type' => 'string',
),
),
问题原因:
如果您的表单设置为BindOnValidate
,则将使用一个可操纵值的计算器。如果实体属性是DateTime,则它将字符串转换为DateTime对象。使用
$form->setBindOnValidate(false);
这意味着您的值在调用isValid()
后立即保持为空字符串“”
我发现DoctrineObject->handleTypeConversions()
正在将任何字符串(例如来自我的表单帖子)转换为DateTime对象,以与实体字段保持一致。空字符串产生一个日期时间,表示time()
,即当前时间
当我截获表单POST并将空字符串“”转换为null时,该函数将该字段保留为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;
}
谢谢你的回复。这正是我所拥有的:
code
/***@var date$valid\u from*@ORM\Column(name=“valid\u from”,type=“date”,nullable=true)/protected$valid\u from;/***@var date$valid\u to*@ORM\Column(name=“valid\u to”,type=“date”,nullable=true)*/protected$valid\u to<代码>代码谢谢您的回复。这正是我所拥有的:code
/***@var date$valid\u from*@ORM\Column(name=“valid\u from”,type=“date”,nullable=true)/protected$valid\u from;/***@var date$valid\u to*@ORM\Column(name=“valid\u to”,type=“date”,nullable=true)*/protected$valid\u to<代码>代码