Вопрос по symfony – Как отобразить выпадающий месяц-год в Symfony2

11

В моем приложении пользователь должен указать дату, выбрав месяц и год только в двух выпадающих списках. Как я могу этого достичь?

Вот что я пробовал до сих пор:

В моей форме:

<code>$builder->add('date1', 'date', array(
 'widget'      => 'choice',
 'empty_value' => '',
 'format'      => 'MMMM-yyyy',
 'input'       => 'datetime',
 'years'       => range(date('Y'), date('Y') - 30, -1)
)
</code>

который на самом деле работает и отображает его именно так, как я хочу, но при проверке формы я получаю сообщение об ошибке:

<code>This value is not valid
</code>

Скриншот желаемого результата:

Screenshot

Привет, через три года, есть ли простое решение, что-то вроде$builder->add('mydate', 'date', array( 'format'=> 'ONLY YEAR')? mario
В настоящее время нет простого решения вашей проблемы. Кстати, у меня была та же проблема несколько дней назад, но моя около минут .. Я отправилPR (еще не объединены), если хотите, можете добавить к нему свою функцию :) egeloen

Ваш Ответ

5   ответов
9

$builder->add('expirationDate', 'date', array(
 'label' => 'Expiration date',
 'widget' => 'choice',
 'empty_value' => array('year' => 'Year', 'month' => 'Month', 'day' => 'Day'),
 'format' => 'dd-MM-yyyy',
 'input' => 'string',
 'data' => date('Y-m-d'),
 'years' => range(date('Y'), date('Y') + 10),
));

Затем вы должны сделать это поле вручную.

Шаблон вашей формы:

{{ form_row(form.expirationDate, {'date_pattern': '<span style="display: none;">{{ day }}</span> {{ month }} <span class="delim">&#47;</span> {{ year }}'}) }}

Переопределениеdate_pattern скрыть день выбора. Ты получишьmonth / year формат.

4

@ Олег был очень близок к правильному ответу. чтобы убедиться, что DateTime получает день.

/* 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()));
)

Создайте трансформатор:

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

Создайте шаблон ветки, в котором вы используете собственную форму формы из самого файла:

{# example.html.twig #}
{% form_theme form _self %}

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

<h2>Select a date</h2>
{{ form(form) }}

Рекомендации:

Data transformers Form customization Choice type
Error: User Rate Limit Exceeded
0

самозагрузки-DateTimePicker вsingle_text, Для меня было бы трудно сохранить месяц и год в отдельных полях в базе данных, потому что я делаю заказ к этой дате. Поэтому я решил всегда сохранять первый день выбранного месяца. Я используюDatetimepickerBundleи мой пользовательский тип формы выглядит так:

class MonthPickerType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'pickerOptions' => array(
                'autoclose' => true,
                'format' => 'mm/yyyy',
                'startView' => 'year',
                'minView' => 'year',
            )
        ));
    }

    public function getParent()
    {
        return 'collot_datetime';
    }

    public function getName()
    {
        return 'month_picker';
    }
}

И результат:

enter image description here

5

который позволил бы решить такую проблему. Решение основано на том, что предложил @ oleg-andreyev. Логика обернута в тип формы.

Использование:

<?php
$builder->add('exp_date', 'payum_credit_card_expiration_date');

Код типа формы:

<?php
namespace Payum\Bundle\PayumBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CreditCardExpirationDateType extends AbstractType
{
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        if ('choice' == $options['widget']) {
            if (empty($view['day']->vars['value'])) {
                $view['day']->vars['value'] = $view['day']->vars['choices'][0]->value;
            }

            $style = 'display:none';
            if (false == empty($view['day']->vars['attr']['style'])) {
                $style = $view['day']->vars['attr']['style'].'; '.$style;
            }

            $view['day']->vars['attr']['style'] = $style;
        }
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->replaceDefaults(array(
            'years' => range(date('Y'), date('Y') + 9)
        ));
    }

    public function getParent()
    {
        return 'date';
    }

    public function getName()
    {
        return 'payum_credit_card_expiration_date';
    }
}

Вы можете скопировать \ вставить его или зарегистрировать пакет Payum и использовать этот тип из (будет доступно там в следующем основном выпуске).

8

Вам нужно вывести день, примерно так:

        ->add(
            'ccExpirationDate',
            'date',
            array(
                'format'          => 'MMM-yyyy',
                'years'           => range(date('Y'), date('Y')+12),
                'days'            => array(1),
                'empty_value'     => array('year' => '----', 'month' => '----', 'day' => false)
            )
        )

TWIG:

{{ 
    form_widget(
        form.payment.ccExpirationDate.day, 
        { 
            'attr': { 'style': 'display:none' } }
        ) 
}}
Error: User Rate Limit Exceededgithub.com/symfony/symfony/issues/8345
Error: User Rate Limit ExceededdayError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded i.am.michiel

Похожие вопросы