利用ZF2 +原则2的项目
我尝试了很多格式。我正在使用一个没有验证的表单。
我的最后一次尝试是:
$traindate = new ElementDateTime('trainDate');
$traindate->setAttributes(array(
'name' => 'trainDate',
'id' => 'trainDate',
'size' => '30',
'class' => 'datepicker',
'options' => array(
'label' => '',
'format' => 'd-m-Y H:i'
),
));
我需要使用输入设置事件的日期和时间。关于巴西的基本格式是:14-05-2014 20分15-05-2015 15:00
With表示日、月、年、时、分,就像我在选项->格式中表示的那样。
这种方式总是当我试图插入,我得到以下消息:输入似乎不是一个有效的日期
删除格式,我只能通过Y-m-d(美国格式)传递$form->isValid($data),但顺便说一下,我也不能传递时间到日期,这给我带来了很大的麻烦。
我需要在表单/输入上设置日期PT_BR,通过验证,转换数据做Mysql格式(YYYY-mm-dd HH:ii:ss)。然后从数据库中检索并转换回pt_br格式。
但是即使是我也不能将时间与日期传递到zf2表单,甚至这个错误消息。
我从这个表单中删除了所有的过滤器,试图得到工作,但不工作。
主要问题在哪里?
经过长时间的关注,我找到了正确而快速的解决方案。经过6个月的科学研究,我得到了:
:
$traindate = new ElementDateTime('trainDate');
$traindate->setAttributes(array(
'name' => 'trainDate',
'id' => 'trainDate',
'size' => '30',
'class' => 'datepicker',
));
$traindate->setFormat('d/m/Y'); //ONLY WORKS ON THIS FORMAT.
文档和互联网上的人没有明确说明,但设置格式只适用于此表单。
要将它抓取到Entity,你需要编写你自己的Hydrator扩展DoctrineHydrator:
namespace ApplicationHydrator;
use DoctrineModuleStdlibHydratorDoctrineObject;
class MyCustomHydrator extends DoctrineObject {
protected function handleTypeConversions($value, $typeOfField)
{
if($typeOfField == 'datetime'){
return DateTime::createFromFormat('d/m/Y', $value);
}
return parent::handleTypeConversions($value, $typeOfField);
}
}
它使任何日期格式的工作变得简单。
我建议您在Train实体中进行日期转换工作。trainData属性getter和setter可以是:
//THE PROPERTY IS IN MYSQL FORMAT, BUT THE GETTER WILL RETURN IT ALWAYS IN THE BRAZILIAN ONE
public function getTrainDateTime() {
return $this->trainDateTime->format( 'd/m/Y H:i' );
}
//IT WILL ALWAYS RECIEVE A BRAZILIAN DATETIME, CONVERT IT TO MYSQL FORMAT
public function setTrainDateTime( $trainDateTime ) {
$time = DateTime::createFromFormat( 'd/m/Y H:i', $trainDateTime )->getTimestamp();
$this->trainDateTime = new DateTime( date( 'Y-m-d', $time ) );
return $this;
}
如果你这样做,你总是可以自由地处理巴西日期,而不用担心格式。这些繁琐的工作将由实体类来完成。