Symfony 4. Как мне расширить DateType до HiddenType? - PullRequest
0 голосов
/ 12 апреля 2019

Я создал строку преобразования данных на сегодняшний день, но я действительно хотел попытаться расширить DateType, так как он имеет всю логику для обработки дат, кто-нибудь делал это раньше или я должен просто использовать DataTransformer (это то, что я реализовали)?

Я пытался сделать следующее:

Class HiddenDateType extends DateType {
   public function getParent() {
       return HiddenType::class;
   } 

}

Но это не сработало, когда я посмотрел на класс DateType, он оказался немного сложнее, чем я ожидал, и не знал, где подключиться к возвращаемому типу.

Я нашел несколько решений, но большинство из них были довольно хакерскими, т.е. Скрытие всего поля с помощью CSS или изменение типа внутри шаблона веточки.

Это мой трансформер, это ОЧЕНЬ переопределение, расстраивает то, что внутри DateType есть код RIGHT, но мои навыки отсутствуют: (

class StringToDateTransformer implements DataTransformerInterface
{

    /**
     * @param \DateTime|null $value
     * @return string
     */
    public function transform($value)
    {
        if(null === $value) {
            return '';
        }

        return $value->format('Y-m-d');
    }


    /**
     * @param  string $value
     * @return \DateTime
     */
    public function reverseTransform($value)
    {
        try {
            return new \DateTime($value);
        } catch (\Exception $e) {
            throw new TransformationFailedException(sprintf(
                'Invalid Format for %s format yyyy-mm-dd',
                $value
            ));
        }
    }
}

На фактической отрендеренной странице есть один div, к которому прикреплено событие javascript daterangepicker (при нажатии), это событие вызывается при нажатии, что позволяет пользователю выбрать дату начала и окончания.

Затем JavaScript заполнит два скрытых поля DateType (startDate, endDate) внутри формы.

Это div, к которому прикреплен сборщик daterangepicker.

<div id="selectedRange">
<i class="fa fa-calendar"></i>&nbsp;
<span></span> <i class="fa fa-caret-down"></i>
 </div>

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Вы можете использовать DateType или DateTimeType , если вы не планируете использовать что-то вроде загрузчика timepicker или любой другой JS-модификации вашего ввода.

Однако, если это так, и вы хотите сделать ввод даты более привлекательным, простой способ сделать это - использовать ее в виде строки, например:

$builder->add('date', TextType::class, array(
                        'required' => true,
                        'label'=>'Date',
                        'attr' => array(
                            'class'   => 'datetimepicker',
                            'data-provide' => 'datepicker',
                            'data-format' => 'dd-mm-yyyy HH:ii'
                        ),
                    ));

И обязательно добавьте свой ModelTransformer вввод в вашем FormType выглядит следующим образом:

$builder->get('date')
                    ->addModelTransformer(new StringToDateTransformer());

Обратите внимание, что вы можете указать формат даты для вашего компонента js в атрибуте input.

0 голосов
/ 12 апреля 2019

Вы должны быть в состоянии сделать это в своем классе formType buildForm() method

// ./src/form/yourType.php

$builder->add('hidden_date_field_name', DateType::class, [
  'attr' => [
    'hidden' => 'hidden',
    'disabled' => 'disabled',
  ],
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...