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

发布于 2024-12-14 07:47:22 字数 75 浏览 0 评论 0原文

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

Is it possible to make a date input field, with only year selector widget in Symfony 2 FormBuilder, or should I use a simple text type input field?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

九八野马 2024-12-21 07:47:22

您还可以使用:

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

You can also use:

'choices' => range(Date('Y') - 4, date('Y'))
迷你仙 2024-12-21 07:47:22

最好使用选择字段类型,而不是破解日期字段类型或仅使用文本字段类型。

使用一些基本的 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));
}

It's better to use the choice field type, rather than hacking the date field type or just using text field type.

Using few basic php date/time functions, you will get what you need.

In FormType:

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));
}
不语却知心 2024-12-21 07:47:22

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

{{ 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 }}

This approach was giving me errors with validation:

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

I finallay solved the problem by adding css attributes to hide the fields:

{{ 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 }}
伏妖词 2024-12-21 07:47:22

您可以覆盖 'date_pattern':

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

注意! 使用 display: none 隐藏字段,不要删除它们以通过验证。

You can override 'date_pattern':

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

NOTE! Hide fields with display: none, Do not remove them to pass validation.

赤濁 2024-12-21 07:47:22

您可以使用表单自定义

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

You can use form customization:

{% block date_widget %}
{% spaceless %}
    {% if widget == 'single_text' %}
        {{ block('field_widget') }}
    {% else %}
        <div {{ block('widget_container_attributes') }}>
            {{ date_pattern|replace({
                '{{ year }}':  form_widget(form.year),
                '{{ month }}': '',
                '{{ day }}': '',
            })|raw }}
        </div>
    {% endif %}
{% endspaceless %}
{% endblock date_widget %}
月隐月明月朦胧 2024-12-21 07:47:22

在这里查看这个答案:如何显示Symfony2 中的月年下拉列表

只需使用不同的 date_widget 块(twig)即可。

Check out this answer here: How to display a month-year dropdown in Symfony2

Just use a different date_widget block (twig).

二货你真萌 2024-12-21 07:47:22

例如,使用选择类型获取五年范围的年份的更简单方法:

    '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,
    )

请注意,创建返回所选年份的字符串。

A simpler method to get, for example, a five year range of years, with a choice type :

    '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,
    )

Note that is creates returns a string of the year selected.

沩ん囻菔务 2024-12-21 07:47:22

我已经这样编写了代码并且插入数据库是正确的

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

I have written my code this way and inserting in database is correct

->add('yearfield', 'datetime', array(
    'widget' => 'single_text',
    'format' => 'yyyy'
))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文