Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 2仅带年份选择器的日期输入_Symfony_Formbuilder - Fatal编程技术网

Symfony 2仅带年份选择器的日期输入

Symfony 2仅带年份选择器的日期输入,symfony,formbuilder,Symfony,Formbuilder,是否可以在Symfony 2 FormBuilder中仅使用年份选择器小部件创建日期输入字段,还是应该使用简单的文本类型输入字段?您可以使用: {%block date\u widget%} {%spaceless%} {%if widget=='single_text%} {{block('field_widget')} {%else%} {{日期|模式|替换({ “{{year}}”:form_小部件(form.year), “{{month}}”:”, “{day}}”:”, })|原始}

是否可以在Symfony 2 FormBuilder中仅使用年份选择器小部件创建日期输入字段,还是应该使用简单的文本类型输入字段?

您可以使用:

{%block date\u widget%}
{%spaceless%}
{%if widget=='single_text%}
{{block('field_widget')}
{%else%}
{{日期|模式|替换({
“{{year}}”:form_小部件(form.year),
“{{month}}”:”,
“{day}}”:”,
})|原始}}
{%endif%}
{%endspaceless%}
{%endblock日期\小部件%}

这种方法给了我验证错误:

{{ date_pattern|replace({
    '{{ year }}':  form_widget(form.year),
    '{{ month }}': '',
    '{{ day }}': '',
})|raw }}
我通过添加css属性来隐藏字段,最终解决了这个问题:

{{ date_pattern|replace({
    '{{ year }}': form_widget(form.year),
    '{{ month }}': form_widget(form.month, { 'attr' : { 'style': 'display:none' }}), 
    '{{ day }}':  form_widget(form.day, { 'attr' : { 'style': 'display:none' }}),
})|raw }}

最好使用choice字段类型,而不是黑客攻击日期字段类型或仅使用文本字段类型

使用一些基本的php日期/时间函数,您将获得所需的内容

格式类型:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('yearfield', 'choice',
                    array(
                        'required' => true, 'choices' => $this->buildYearChoices()
                    ));
}

public function buildYearChoices() {
    $distance = 5;
    $yearsBefore = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y") - $distance));
    $yearsAfter = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y") + $distance));
    return array_combine(range($yearsBefore, $yearsAfter), range($yearsBefore, $yearsAfter));
}

一种更简单的方法,例如,通过选择类型获得五年的时间范围:

    'choices' => array(
        Date('Y') => Date('Y'),
        Date('Y') - 1 => Date('Y') - 1,
        Date('Y') - 2 => Date('Y') - 2,
        Date('Y') - 3 => Date('Y') - 3,
        Date('Y') - 4 => Date('Y') - 4,
    )
请注意,is将返回所选年份的字符串。

您还可以使用:

'choices' => range(Date('Y') - 4, date('Y'))

我以这种方式编写了代码,并且在数据库中插入是正确的

->add('yearfield', 'datetime', array(
    'widget' => 'single_text',
    'format' => 'yyyy'
))

您可以覆盖“日期模式”:

{{ form_row(form.fieldName, {'date_pattern': '<span style="display: none;">{{ day }}{{ month }}</span>{{ year }}'}) }}
{form_行(form.fieldName,{'date_pattern':{{{day}}{{month}}{{year}}}}}}

注意
显示隐藏字段:无
,不要删除它们以通过验证。

在此处查看此答案:


只需使用不同的date_widget block(twig)。

这是一个解决问题的小技巧,但没有回答问题——如何使用FormBuilder实现这一点?我想做完全相同的事情。你能解释一下你是怎么做的吗?我有一个错误:
Twig\u error\u运行时:变量“date\u widget”不存在
你救了我一天!谢谢(为什么要修复它?)ps。最好的答案是
{{ form_row(form.fieldName, {'date_pattern': '<span style="display: none;">{{ day }}{{ month }}</span>{{ year }}'}) }}