【问题标题】:Symfony2: How to render datetime-local fields with FormBuilder?Symfony2:如何使用 FormBuilder 呈现本地日期时间字段?
【发布时间】:2014-05-30 09:57:01
【问题描述】:

标题说明了一切:如何从表单构建器呈现 html5 日期时间本地字段? 与

$builder->add('start', 'datetime', array('widget' => 'single_text'))

我可以得到一个日期时间字段,但是 chrome 不支持这个。

提前致谢!

【问题讨论】:

    标签: html forms symfony


    【解决方案1】:

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

    添加继承 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';
        }
    }
    

    将其注册为服务:

    app.form.type.local_datetime:
        class: AppBundle\Form\Type\LocalDateTimeType
        tags:
            - { name: form.type, alias: local_datetime }
    

    现在您可以在表单中使用它:

    (...)
    $builder->add('myLocalDateTimeField', 'local_datetime', [
        'widget' => 'single_text'
    ];
    (...)
    

    将小部件设置为single_text 很重要 - 是的,这当然是可能的(从 Symfony 2.7 开始)。

    使用本地化的日期时间,您可能希望将标准化的日期时间存储在数据库中。在这里可以找到一个不错的方法:

    http://jeremycook.ca/2012/06/24/normalising-datetimes-with-doctrine-events/

    【讨论】:

    • 这个答案应该是正确的,谢谢
    【解决方案2】:

    datetime field type 不支持小部件“single_text”。

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

    <?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
            ));
    

    Definition of the widget options for the date type.
    Definition of the widget options for the time type.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      相关资源
      最近更新 更多