Как работать с типом «Time *» (заданным в сборщике расширений) в контроллере и представлении Extbase Extension

#typo3 #extbase #typo3-6.2.x

#typo3 #extbase #typo3-6.2.x

Вопрос:

Я создал объект Appointment в своем сборщике расширений.
Каждый Appointment из них происходит в определенный день и имеет время начала и время окончания.
Он никогда не выходит за рамки дня, поэтому мне нужна только одна дата.
Вот почему я добавил эти 3 свойства в свою модель в сборщике расширений:
введите описание изображения здесь

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

При попытке вызвать vendor extname Controller AppointmentController->createAction() произошла ошибка

 newAppointment.startTime:
    "09:35" is no integer.
    The given subject was NULL.
newAppointment.endTime:
    "10:35" is no integer.
  

В моем контроллере у меня есть эта функция, которая работает для даты:

 public function initializeAction() {
        if ($this->arguments->hasArgument('newAppointment')) {
            $this->arguments->getArgument('newAppointment')->getPropertyMappingConfiguration()->forProperty('startDate')->setTypeConverterOption('TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter',TYPO3CMSExtbasePropertyTypeConverterDateTimeConverter::CONFIGURATION_DATE_FORMAT,'d.m.Y');
        }
    }
  

Я попытался добавить:

 $this->arguments->getArgument('newAppointment')->getPropertyMappingConfiguration()->forProperty('startTime')->setTypeConverterOption('TYPO3\CMS\Extbase\Property\TypeConverter\IntegerConverter',TYPO3CMSExtbasePropertyTypeConverterIntegerConverter);
  

но это был сбой, как говорится:

Фатальная ошибка: неопределенная константа ‘TYPO3 CMS Extbase Property TypeConverter IntegerConverter’ …Назначениеcontroller…

Я даже проверил этот путь, и там есть IntegerConverter…
Не уверен, должен ли я использовать его в этом случае или есть какой-то другой простой способ сделать это …?

А также, как только это сработает, как я буду отображать его — в настоящее время на дату, которую я делаю:

 {appointment.startDate->f:format.date(format:'d.m.Y')}
  

но смогу ли я сделать это с моим целым числом времени?:

 {appointment.startTime->f:format.date(format:'H:i')}
  

Комментарии:

1. Что произойдет, если вы измените тип for startTime в своей модели на DateTime or DateTime ? Обязательно очистите кеши из инструмента установки после изменения.

2. если я изменю их на DateTime в модели и преобразоваю их в своем контроллере в формате «H: i», это не выдает ошибку и, похоже, работает… Но я не вижу смысла вводить тип «Time *» тогда, если бы я сделал это так, потому что я мог бы просто изменить тип на «DateTime», и конструктор расширений автоматически изменил бы мою модель…

Ответ №1:

Второй аргумент setTypeConverterOption ожидает не класс, а константу из этого класса. Поскольку IntegerConverter у него нет опций, это все равно бессмысленно. Но это устраняет одну из ошибок.

Вы можете использовать поля времени (внутренне обрабатываемые как целое число, eval time в TCA), но требуется некоторая ручная работа.

Сначала вам нужен конвертер, который определяет временную метку с заданного времени. Вы можете найти пример здесь.

Затем в вашем initializeCreateAction и initializeUpdateAction используйте конвертер для преобразования заданной даты и времени из интерфейса в целое число, которое будет сохранено в БД:

 $propertyMappingConfiguration->forProperty('fromTime')->setTypeConverter($this->objectManager->get('My\Extension\Property\TypeConverter\TimestampConverter'))->setTypeConverterOption('My\Extension\Property\TypeConverter\TimestampConverter', My\ExtensionPropertyTypeConverterTimestampConverter::CONFIGURATION_DATE_FORMAT, 'H:i');
  

Тогда у вас должно быть все в порядке с сохранением времени в целочисленном поле.

Комментарии:

1. Я получаю эту ошибку: Fatal error: Call to a member function getTimestamp() on a non-object in /ext/myExt/Classes/Property/TypeConverter/TimestampConverter.php on line 38 Но вы сказали «заданное время даты»… Я чувствую, что в этом проблема, я думаю, что я просто получаю строку, но я не знаю, как это доказать или изменить его на DateTime. Сейчас я использую это поле во внешнем интерфейсе: <f:form.textfield property="startTime" type="date" value="{appointment.starttime -> f:format.date(format:'H:i')}" class="app-timepicker" />

2. Или это потому, что я нигде не определял objectManager ?

3. Ваша ошибка означает, что DateTime объекта нет. Пожалуйста, отладьте $source и $dateFormat в TimestampConverter , чтобы выяснить, чего не хватает.

4. Как я и подозревал, это строка — string(5) "08:00" NULL что я могу делать неправильно?

5. Я использую средство выбора даты и времени Boostrap ( eonasdan.github.io/bootstrap-datetimepicker ) и %R как формат, смотрите Пример здесь: github.com/visol/ext-easyvote_education/blob/master/Resources /.