диапазон дат начальной загрузки на symfony 5 с использованием контроллера

#php #doctrine #symfony-forms #bootstrap-datepicker #symfony5

#php #доктрина #symfony-forms #bootstrap-datepicker #symfony5

Вопрос:

Я пытаюсь добавить ввод диапазона дат (который является двойным вводом для выбора даты), используя диапазон дат начальной загрузки.

Из документации «диапазон дат начальной загрузки» они объясняют, что мне нужна эта структура :

 <div class="input-group input-daterange">
    <input type="text" class="form-control" value="2012-04-05">
    <div class="input-group-addon">to</div>
    <input type="text" class="form-control" value="2012-04-19">
</div>
  

Я использую свой контроллер для отправки параметров в представление.
Как вы думаете, возможно ли это сделать без редактирования представления (twig) и можете ли вы объяснить мне, как?

Мой текущий контроллер :

 $form = $this->createFormBuilder($recording)
                     ->add('starting_date',  DateType::class, [
                        'widget'=>'single_text',
                        'html5'=>false,
                        'attr'=>['class'=>'js-datepicker'],
                        'format'=>'yyyy-mm-dd',
                        'label'=>'Starting time',
                        'row_attr'=>[
                            'class'=>'input-daterange'
                        ]
                     ])
                     ->add('ending_date', DateType::class, [
                        'widget'=>'single_text',
                        'html5'=>false,
                        'attr'=>['class'=>'js-datepicker'],
                        'format'=>'yyyy-mm-dd',
                        'label'=>'Ending time',
                        'row_attr'=>[
                            'class'=>'input-daterange'
                        ]
                     ])
  

Проблема в том, что каждый ввод добавляется в определенный div… но мне нужны оба входных данных для одного.

Ответ №1:

Я справился с этим случаем следующим образом:

Сначала я создаю форму с двумя полями даты :

       <?php

namespace AppForm;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeDateType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;

class BookingSearchType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('dateMin', DateType::class, [
                'widget' => 'single_text',
                'html5' => false,
            ])
            ->add('dateMax', DateType::class, [
                'widget' => 'single_text',
                'html5' => false,
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}
  

Затем создайте форму в контроллере:

       /**
     * @Route("/bookings-for-date", name="bookings_for_date")
     */
    public function bookingForDates(Request $request, BookingRepository $bookingRepository)
    {
        $form = $this->createForm(BookingSearchType::class);
        $bookings = [];
        $form->handleRequest($request);
        if ($form->isSubmitted() amp;amp; $form->isValid()) {
            $bookings = $bookingRepository->findBookingsBetweenDates($form['dateMin']->getData(), $form['dateMax']->getData());
        }
        return $this->render('report/bookings_for_date.html.twig', [
            'form' => $form->createView(),
            'bookings' => $bookings,
        ]);
    }
  

Затем в представлении я отображаю только виджет, завернутый в правильную оболочку div:

  {{ form_start(form) }}
<div class="input-group input-daterange">
    {{ form_widget(form.dateMin) }}
    <div class="input-group-addon">to</div>
    {{ form_widget(form.dateMax) }}
</div>
<input class="btn btn-primary" type="submit">
{{ form_end(form) }}
  

И, наконец, js:

 $(function () {
    $('.datepicker, .input-daterange').datepicker({
        format: 'yyyy-mm-dd',
        language: 'fr',
        todayHighlight: true,
        todayBtn: 'linked',
        daysOfWeekDisabled: [0, 6],
    });
});