Html Symfony2:如何使用FormBuilder呈现datetime本地字段?

Html Symfony2:如何使用FormBuilder呈现datetime本地字段?,html,forms,symfony,Html,Forms,Symfony,标题说明了一切:如何从formbuilder呈现html5 datetime本地字段? 与 我可以获得datetime字段,但chrome不支持该字段 提前谢谢 程序不支持小部件“单一文本” 日期和时间部分有独立的小部件。例如: <?php // from date $builder->add('DateFrom', 'datetime', array( 'input' => 'datetime', 'date_

标题说明了一切:如何从formbuilder呈现html5 datetime本地字段? 与

我可以获得datetime字段,但chrome不支持该字段


提前谢谢

程序不支持小部件“单一文本”

日期和时间部分有独立的小部件。例如:

<?php
// from date
        $builder->add('DateFrom', 'datetime', array(
            'input'  => 'datetime',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
            'empty_value' => '',
            'format' => 'yyyy-MM-dd',
            'label' => 'From Date',
            'required' => false,
            'mapped' => false
        ));

控件不支持小部件“单一文本”

日期和时间部分有独立的小部件。例如:

<?php
// from date
        $builder->add('DateFrom', 'datetime', array(
            'input'  => 'datetime',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
            'empty_value' => '',
            'format' => 'yyyy-MM-dd',
            'label' => 'From Date',
            'required' => false,
            'mapped' => false
        ));

这是一个老问题,但对于任何一个在这篇文章中寻找解决方案的人(比如我),我是如何解决这个问题的:

添加继承DateTimeType的自定义字段类型:

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;

class LocalDateTimeType extends AbstractType
{
    const HTML5_FORMAT = "yyyy-MM-dd'T'HH:mm";

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['widget'] = $options['widget'];

        if ($options['html5'] && 'single_text' === $options['widget'] && self::HTML5_FORMAT === $options['format']) {
            $view->vars['type'] = 'datetime-local';
        }
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'format' => self::HTML5_FORMAT
        ]);
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'datetime';
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'local_datetime';
    }
}
现在,您可以在表单中使用它:

(...)
$builder->add('myLocalDateTimeField', 'local_datetime', [
    'widget' => 'single_text'
];
(...)
您必须将小部件设置为
single_text
——是的,这当然是可能的(从Symfony 2.7开始)

使用本地化的日期时间,您可能希望在数据库中存储规范化的日期时间。在这里可以找到一个很好的方法:


这是一个老问题,但对于任何一个在这篇文章中寻找解决方案的人(像我一样),我是如何解决这个问题的:

添加继承DateTimeType的自定义字段类型:

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;

class LocalDateTimeType extends AbstractType
{
    const HTML5_FORMAT = "yyyy-MM-dd'T'HH:mm";

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['widget'] = $options['widget'];

        if ($options['html5'] && 'single_text' === $options['widget'] && self::HTML5_FORMAT === $options['format']) {
            $view->vars['type'] = 'datetime-local';
        }
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'format' => self::HTML5_FORMAT
        ]);
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'datetime';
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'local_datetime';
    }
}
现在,您可以在表单中使用它:

(...)
$builder->add('myLocalDateTimeField', 'local_datetime', [
    'widget' => 'single_text'
];
(...)
您必须将小部件设置为
single_text
——是的,这当然是可能的(从Symfony 2.7开始)

使用本地化的日期时间,您可能希望在数据库中存储规范化的日期时间。在这里可以找到一个很好的方法:


此答案应标记为正确,谢谢此答案应标记为正确,谢谢