Symfony 2:如何在没有一天的情况下渲染日期字段?

时间:2013-12-19 06:10:40

标签: symfony symfony-2.3

我正在尝试使用日期字段构建表单,用户只能选择一个月和一年(没有一个月的日期),但我无法弄清楚如何实现这一点。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add(
        'month',
        'date',
        array(
            'label' => 'Month & year',
            'input' => 'array',
            'widget' => 'choice',
        ));

    $builder->add('submit',
                  'submit');
}

理想的结果是两个下拉列表:月份列表(数字表示)和年份列表(4位数,5年后)。

我想我可以使用2个选择类型的字段,但也许有更优雅的解决方案?

4 个答案:

答案 0 :(得分:7)

您可以在twig文件中执行以下操作。

    {{ form_widget(yourForm.month.month) }}
    {{ form_widget(yourForm.month.year) }}

这将显示两个选项字段,一个用于月份,另一个用于年份。我建议将字段名称从月份更改为其他内容。我不确定但它可能会发生冲突。我希望这有帮助..!

编辑:要显示过去5年,请在“表单”构建器中

   $builder->add(
     'month',
     'date',
     array(
        'years' => range(date('Y'), date('Y')-5)
        'label' => 'Month & year',
        'input' => 'array',
        'widget' => 'choice',
     ));

答案 1 :(得分:1)

我认为你可以做一些对你的用户更好的事情,但对你来说更复杂。

您可以使用Bootstrap Datetimepicker(http://www.malot.fr/bootstrap-datetimepicker/)并将其设置为用户只能选择年份和月份的方式,如下图所示:

datetimepicker

调用脚本时,请将格式设置为“mm-yyyy”或类似的内容。

<script>
        $(function (){
            $(".datepicker").datetimepicker({
                weekStart: 1,
                format : 'mm-yyyy'
            });
        });
</script>

必须进一步研究此解决方案的细节,但这是一般性的想法。

答案 2 :(得分:0)

你应该去语义并使用&#34;月&#34;输入。然后,当然,当客户端不支持此类输入类型时,您可以回退到任何javascript datepicker。这是一个超级简单(但完全正常)的代码示例(适用于Symfony 2.8或更高版本):

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;

/**
 * Month Type.
 */
class MonthType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->addModelTransformer(new CallbackTransformer(
                function ($dateTime) {
                    return empty($dateTime) ? null : $dateTime->format('Y-m');
                },
                function ($monthString) {
                    return new \DateTime("$monthString-01");
                }
            ))
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['type'] = 'month';
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return TextType::class;
    }
}

答案 3 :(得分:0)

如果您不介意提交的日期,您可以通过类隐藏日期输入,这可能是您实现此目标的最简单方法:

{{ form_start(form) }}
{{ form_widget(form.date.day, {'attr': {'class': 'hide'}}) }}
{{ form_widget(form) }}
{{ form_end(form) }}