如何全局设置Symfony表单的日期格式?

时间:2014-12-29 12:23:52

标签: php forms symfony date

为Symfony2表单全局设置自定义日期格式的正确方法是什么?

默认格式与Y-m-d类似,如果我输入m/d/Yd/m/Y之类的日期,则视为无效。

有没有办法以某种方式将格式与选定的区域设置相关联? 我在寻找简单的解决方案而无需编写自定义表单类型。

4 个答案:

答案 0 :(得分:2)

如果您想要其他格式,可以在FormType中设置格式。

$builder->add('date_created', 'date', array(
    'widget' => 'single_text',
    // this is actually the default format for single_text
    'format' => 'yyyy-MM-dd',
));

默认情况下,'Y-m-d'不是IntlDateFormatter的实例。因此,如果您不使用单个文本,则应选择正确的区域设置。

  

type:integer或string default:IntlDateFormatter :: MEDIUM(或   yyyy-MM-dd如果widget是single_text)

http://symfony.com/doc/current/reference/forms/types/date.html#format http://php.net/manual/en/class.intldateformatter.php

答案 1 :(得分:1)

您应该能够使用事件监听器http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

全局设置

答案 2 :(得分:1)

如果要根据区域设置更改日期字段的格式,则必须创建自定义字段并使用它而不是日期。这是我所知道的唯一方式。

首先,创建服务并在参数中传递区域设置:

# src/Acme/DemoBundle/Resources/config/services.yml
services:
    acme_demo.form.type.localedate:
        class: Acme\DemoBundle\Form\Type\LocaleDateType
        arguments:
            - "%locale%"
        tags:
            - { name: form.type, alias: localedate }

使用新字段类型的代码创建类。如您所见,它基于字段类型日期,并根据当前区域设置更改格式:

// src/Acme/DemoBundle/Form/Type/LocaleDateType.php
namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class LocaleDateType extends AbstractType
{
    private $locale;

    public function __construct($locale)
    {
        $this->locale = $locale;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'format' => $this->getFormat(),// return the format depending on locale
        ));
    }

    private function getFormat() {
        switch($this->locale) {
            case 'es':
                return 'dd-MM-yyyy';// return valid date format for this locale
            default:
                return 'yyyy-MM-dd';
        }
    }

    public function getParent()
    {
        return 'date';
    }

    public function getName()
    {
        return 'localedate';
    }
}

在您的应用中使用它而不是date字段类型:

$builder->add('date_created', 'localedate', array(
    'widget' => 'single_text',
));

希望它有所帮助。

亲切的问候。

答案 3 :(得分:1)

您可以在YourProjectFolder \ vendor \ symfony \ symfony \ src \ Symfony \ Bridge \ Twig \ Resources \ views \ Form \ form_div_layout.html.twig下覆盖symfony的date_widget。 将文件复制到另一个文件,如fields.html.twig,并将其放在全局资源\ views \ Form \下,并覆盖date_widget(将其更改为默认格式):

{% block date_widget -%}
{% if widget == 'single_text' %}
    {{- block('form_widget_simple') -}}
{% else -%}
    <div {{ block('widget_container_attributes') }}>
        {{- date_pattern|replace({
            '{{ year }}':  form_widget(form.year),
            '{{ month }}': form_widget(form.month),
            '{{ day }}':   form_widget(form.day),
        })|raw -}}
    </div>
{%- endif %}

{% - endblock date_widget%}

然后在表单中添加:

{% form_theme form 'AAAYourBundle:Form:fields.html.twig'%}