【问题标题】:How to globally set date format for Symfony forms?如何为 Symfony 表单全局设置日期格式?
【发布时间】:2015-02-25 15:17:57
【问题描述】:

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

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

有没有办法以某种方式将格式与选定的语言环境相关联? 我正在寻找无需编写自定义表单类型的简单解决方案。

【问题讨论】:

标签: php forms symfony date


【解决方案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'%}

【讨论】:

    【解决方案2】:

    如果您想根据区域设置更改日期字段的格式,则必须创建一个自定义字段并使用它来代替日期。这是我知道的唯一方法。

    首先,创建服务并在参数中传递语言环境:

    # 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】:

      您应该能够使用事件侦听器http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html 全局设置它

      【讨论】:

        【解决方案4】:

        如果需要其他格式,可以在 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 的一个实例。因此,如果您不使用单个文本,则应该选择正确的语言环境。

        类型:整数或字符串默认值:IntlDateFormatter::MEDIUM(或 yyyy-MM-dd 如果小部件是 single_text)

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

        【讨论】:

        • 感谢您的回答@Stony。我知道我可以通过类型的选项设置自定义格式。但我需要在全球范围内这样做(之前忘了提;更新了我的问题)。这里一定是比更新所有使用date 格式的地方更简单的解决方案。我相信有很多网站使用非默认日期格式(美国、英国和其他国家/地区)。所以这个“问题”应该很普遍。常见问题通常有简单的解决方案:)
        猜你喜欢
        • 2010-09-22
        • 1970-01-01
        • 2020-06-17
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        • 2013-09-01
        • 2013-10-09
        • 2013-04-09
        相关资源
        最近更新 更多