How to display a month-year dropdown in Symfony2

前端 未结 5 1208
生来不讨喜
生来不讨喜 2020-12-09 11:36

In my application, the user hsa to give a date by only selecting a month and a year in two dropdown lists. How can I achieve that?

Here is what I\'ve tried so far :

5条回答
  •  猫巷女王i
    2020-12-09 12:30

    @Oleg was pretty close to the correct answer. You have to use a view transformer to make sure that the DateTime gets a day.

    /* In your formType.php */
    
    $builder->add(
       $builder->create('date1', 'date', array(
           'format'      => 'MMMM-yyyyd', // you need to have 'y', 'M' and 'd' here
           'years'       => range(date('Y'), date('Y') - 30, -1)
       ))
       ->addViewTransformer(new IncompleteDateTransformer()));
    )
    

    Create a transformer:

    class IncompleteDateTransformer implements DataTransformerInterface
    {
    /**
     * Do nothing when transforming from norm -> view
     */
    public function transform($object)
    {
        return $object;
    }
    
    /**
     * If some components of the date is missing we'll add those. 
     * This reverse transform will work when month and/or day is missing
     *
     */
    public function reverseTransform($date)
    {
        if (!is_array($date)) {
            return $date;
        }
    
        if (empty($date['year'])) {
            return $date;
        }
    
        if (empty($date['day'])) {
            $date['day']=1;
        }
    
        if (empty($date['month'])) {
            $date['month']=1;
        }
    
        return $date;
    }
    } 
    

    Create a twig template where you use a custom form theme from the file itself:

    {# example.html.twig #}
    {% form_theme form _self %}
    
    {% block date_widget %}
    {% spaceless %}
        {% if widget == 'single_text' %}
            {{ block('field_widget') }}
        {% else %}
            
    {{ date_pattern|replace({ '{{ year }}': form_widget(form.year), '{{ month }}': form_widget(form.month), '{{ day }}': '', })|raw }}
    {% endif %} {% endspaceless %} {% endblock date_widget %}

    Select a date

    {{ form(form) }}

    References:

    • Data transformers
    • Form customization
    • Choice type

提交回复
热议问题