为Symfony2表单全局设置自定义日期格式的正确方法是什么?
默认格式与Y-m-d
类似,如果我输入m/d/Y
或d/m/Y
之类的日期,则视为无效。
有没有办法以某种方式将格式与选定的区域设置相关联? 我在寻找简单的解决方案而无需编写自定义表单类型。
答案 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)
答案 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'%}