#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
orDateTime
? Обязательно очистите кеши из инструмента установки после изменения.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 /. …