【发布时间】:2012-12-27 10:24:03
【问题描述】:
我正在尝试制作自定义日期时间表单字段。 就像在这个 answer 中一样,我使用 DataTransformer 将日期时间字段与一个日期表单字段和准时表单字段分开。
我使用 jquery datepicker 进行日期选择,但我希望有一个自定义选择表单字段用于半小时间隔的时间选择:
00:00
00:30
...
23:30
这是我的代码,但我不知道如何处理这个
在我的实体中
/**
* Time
*
* @ORM\Table(name="time")
* @ORM\Entity
*/
class Time
{
...
/**
* @var \DateTime
*
* @ORM\Column(name="begin_date", type="datetime", nullable=false)
*/
private $beginDate;
/**
* @var \DateTime
*
* @ORM\Column(name="end_date", type="datetime", nullable=false)
*/
private $endDate;
...
/**
* Set beginDate
*
* @param \DateTime $beginDate
* @return Time
*/
public function setBeginDate($beginDate)
{
$this->beginDate = $beginDate;
return $this;
}
/**
* Get beginDate
*
* @return \DateTime
*/
public function getBeginDate()
{
$this->beginDate;
}
/**
* Set endDate
*
* @param \DateTime $endDate
* @return Time
*/
public function setEndDate($endDate)
{
$this->endDate = $endDate;
return $this;
}
/**
* Get endDate
*
* @return \DateTime
*/
public function getEndDate()
{
return $this->endDate;
}
...
}
表单类型
class TimeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('beginDate', 'my_datetime', array('label' => 'label.form.date'))
->add('endDate', 'my_datetime', array('label' => 'label.form.date'));
}
public function getName()
{
return 'Time';
}
}
这是我的自定义表单类型:
class MyDateTimeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('date', 'genemu_jquerydate', array('input' => 'datetime','widget' => 'single_text','format' => 'dd/MM/yyyy','error_bubbling' => true))
->add('time', 'choice', array(
'choices' => array(
'00:00' => '00:00',
'00:30' => '00:30',
'01:00' => '01:00',
...
'22:30' => '22:30',
'23:00' => '23:00',
'23:30' => '23:30',
),'error_bubbling' => true
));
$builder->appendClientTransformer(new DateTimeToDateTimeArrayTransformer());
}
public function getDefaultOptions(array $options)
{
return array(
'label' => 'label.form.date',
'error_bubbling' => false
);
}
public function getName()
{
return 'my_datetime';
}
}
这是 DataTransformer:
class DateTimeToDateTimeArrayTransformer implements DataTransformerInterface
{
public function transform($datetime)
{
if(null !== $datetime)
{
$date = clone $datetime;
$date->setTime(12, 0, 0);
$time = clone $datetime;
$time->setDate(1970, 1, 1);
}
else
{
$date = null;
$time = null;
}
$result = array(
'date' => $date,
'time' => $time
);
return $result;
}
public function reverseTransform($array)
{
$date = $array['date'];
// $time = $array['time']; // Fatal error: Call to a member function format() on a non-object
$time = new \DateTime($array['time']);
if(null == $date || null == $time)
return null;
$date->setTime($time->format('G'), $time->format('i'));
return $date;
}
}
表单显示正确,但是当我提交表单时出现此错误:
注意:DateTime 类的对象无法在 /var/www/ttime/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php 中转换为 int 第 457 行 500 内部服务器错误 - ErrorException
而我将拆分项目的日期时间 + 自定义选择正确地保存到数据库。
我认为reverseTransform函数返回日期时间格式,表单生成器无法将其转换为选择格式:
数组('00:00' => '00:00',...)
你能告诉我如何摆脱这个错误吗?
有没有更好的方法来做到这一点?
【问题讨论】:
-
您存储日期的实体或数据库可能被定义为 INT。为什么不将它们复制到您的问题中?
-
我已经更新了问题,实体的对象是日期时间对象
标签: php datetime symfony symfony-2.1