Symfony2自定义时间选择字段



我试图使自定义日期时间表单字段。就像在这个答案中,我使用datattransformer将datetime字段与一个日期表单字段和一个时间表单字段分开。

我使用一个jquery日期选择器的日期选择,但我想有一个自定义的选择表单字段的时间选择与半小时的间隔:

00:00
00:30
...
23:30

这是我的代码,但我不确定如何接近这个

In my entity

/**
 * Time
 *
 * @ORMTable(name="time")
 * @ORMEntity
 */
class Time
{
...
    /**
     * @var DateTime
     *
     * @ORMColumn(name="begin_date", type="datetime", nullable=false)
     */
    private $beginDate;
    /**
     * @var DateTime
     *
     * @ORMColumn(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';
}
}

这是datattransformer:

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

而我有拆分项目datetime +自定义选择正确地持久化到DB。

我认为reverseTransform函数返回日期时间格式,而表单构建器无法将其转换为选择格式:

array('00:00' => '00:00',…)

你能告诉我怎样才能摆脱这个错误吗?

有更好的方法吗?

您的datattransformers转换函数返回的数据数组是一个DateTime对象数组。这些对象不能转换为选择字段值。要解决这个问题,返回实际格式化的日期和时间字符串:

$result = array(
    'date' => $date->format('Y-m-d'),
    'time' => $time->format('H:i')
);

reverseTransform函数还应该将这些字符串转换回实际的DateTime对象,使用以下代码:

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

相关内容

  • 没有找到相关文章

最新更新