Добавить класс для каждого выбора DateTimeType в форме symfony - PullRequest
0 голосов
/ 29 апреля 2020

Вот тип формы, который у меня есть: // src / Form / Type / TaskType. php

namespace App\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use App\Entity\Task;

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('task', TextType::class, array(
                    'attr' => ['class' => 'myclass'],
                )
            )
            ->add(
                'dueDate', DateType::class, array(
                    'attr' => ['class' => 'myclass'],
                )
            )
            ->add('save', SubmitType::class)            
        ;

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Task::class,
        ]);
    }

}

Вот представление:

{# templates/task/new.html.twig #}
<div class="form-control">
    {{ form_label(form.task) }}
    {{ form_widget(form.task) }}

    <small>{{ form_help(form.task) }}</small>

    <div class="form-error">
        {{ form_errors(form.task) }}
    </div>  
    <i class="fa fa-calendar"></i> {{ form_label(form.dueDate) }}
    {{ form_widget(form.dueDate) }}

    <small>{{ form_help(form.dueDate) }}</small>

    <div class="form-error">
        {{ form_errors(form.dueDate) }}
    </div>
</div>

Класс «myclass» добавляется в div, содержащий все поля выбора, и я хочу, чтобы он применялся к каждому выбору. Если невозможно настроить это в типе формы, должен быть способ разбить оператор «form_widget (form.dueDate)» в представлении, чтобы я мог передать класс каждому выбору, и я не могу найти его в документация.

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Если вы хотите добавить class к каждому DateTimeType в приложении, расширение типа - более чистый подход.

Из документов:

У них есть 2 основных варианта использования:

Вы хотите добавить указанную c функцию к одному типу формы.

Итак, основные преимущества состоят в том, что нет необходимости передавать attr в каждое поле конфигурации или form функций рендеринга, и что он будет автоматически применять класс к любой составной форме, которая использует эти типы: DateTimeType, BirthdayType, et c.

namespace App\Form\Type\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TimeType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;

class DateTimeAddClassExtension extends AbstractTypeExtension
{
    const WIDGET_CLASS = 'myclass';

    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        // Apply only if it's going to be rendered as 'select'
        if ('choice' == $options['widget']) {
            // Child fields of interest, add less used fields if desired
            foreach (['month', 'year', 'day', 'hour', 'minute'] as $field) {
                // We can check the options, but the view has already been built
                if (isset($view->children[$field])) {
                    $this->mergeAttrs($view->children[$field]);
                }
            }
        }
    }

    /**
     * Merge our attribute with those defined in the field
     */
    private function mergeAttrs(&$child)
    {
        $child->vars['attr'] = array_merge(
          $child->vars['attr'],
          ['class' => self::WIDGET_CLASS]
        );
    }

    public static function getExtendedTypes(): iterable
    {
        return [
          DateType::class,
          TimeType::class,
        ];
    }
}
0 голосов
/ 29 апреля 2020

Если мы говорим о DateTimeType, то вы можете использовать следующий пример:

= form_widget(form.dueDate.date, { attr: { class: 'myclass' } }) 
= form_widget(form.dueDate.time, { attr: { class: 'myclass' } })

В противном случае DateType можно разделить следующим образом:

= form_widget(form.dueDate.day, { attr: { class: 'myclass' } }) 
= form_widget(form.dueDate.month, { attr: { class: 'myclass' } })
= form_widget(form.dueDate.year, { attr: { class: 'myclass' } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...