Php symfony2自定义时间选择字段

Php symfony2自定义时间选择字段,php,datetime,symfony,symfony-2.1,Php,Datetime,Symfony,Symfony 2.1,我正在尝试创建自定义日期时间表单字段。 像这样,我使用DataTransformer将datetime字段拆分为一个日期表单字段和一个时间表单字段 我使用jquery日期选择器进行日期选择,但我希望有一个自定义的选择表单字段用于时间选择,时间间隔为半小时: 00:00 00:30 ... 23:30 这是我的代码,但我不知道如何处理这个问题 在我的实体中 /** * Time * * @ORM\Table(name="time") * @ORM\Entity */ class Tim

我正在尝试创建自定义日期时间表单字段。 像这样,我使用DataTransformer将datetime字段拆分为一个日期表单字段和一个时间表单字段

我使用jquery日期选择器进行日期选择,但我希望有一个自定义的选择表单字段用于时间选择,时间间隔为半小时:

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';
}
}
这是数据转换器:

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;
}
}
表单显示正确,但提交表单时出现以下错误:

注意:在/var/www/ttime/vendor/symfony/symfony/src/symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php中,类DateTime的对象无法转换为int 第457行 500内部服务器错误-错误异常

然而,我将拆分的项目datetime+自定义选项正确地保存到DB

我认为reverseTransform函数返回datetime格式,表单生成器无法将其转换为choice格式:

数组('00:00'=>'00:00',…)

你能告诉我怎样才能消除这个错误吗


有更好的方法吗?

datatransformers转换函数返回的数据数组是DateTime对象数组。这些对象无法转换为选项字段值。要修复此问题,请返回实际格式化的日期和时间字符串:

$result=array(
“日期”=>$date->格式('Y-m-d'),
'time'=>$time->format('H:i')
);
此外,reverseTransform函数还应使用以下代码将这些字符串转换回实际的DateTime对象:

$dateTimeString=$array['date'].'$数组['time'];
return DateTime::createFromFormat('Y-m-dh:i',$dateTimeString);

可能您存储日期的实体或数据库被定义为INT。为什么不将它们复制到问题中?我已经更新了问题,实体的对象是datetime对象谢谢您的回答,但它仍然不起作用:如果我在转换函数`$result=array('date'=>$date->format('Y-m-d')中使用它,'time'=>$time->format('H:i');`出现以下错误:致命错误:调用非对象上的成员函数format(),如果我在转换中使用它:`$result=array('date'=>$date,'time'=>$time);`在反向转换中:`$dateTimeString=$array['date'].'$数组['time'];return DateTime::createFromFormat('Y-m-dh:i',$dateTimeString);`出现此错误:可捕获致命错误:无法将DateTime类的对象转换为字符串