TYPO3 Extbase - рассчитать свойство и добавить в базу данных - PullRequest
0 голосов
/ 29 декабря 2018

Я программирую расширение управления временем в Extbase (TYPO3 8).В моей модели у меня есть два свойства startdate и enddate .Теперь duration следует рассчитать по этим свойствам и сохранить в базе данных.После создания нового свойства duration с помощью построителя расширений я изменил свою модель следующим образом:

/**
* duration
*
* @var int
*/
protected $duration = 0;


/**
* Returns the duration
*
* @return int $duration
*/
public function getDuration()
{
    return $this->duration;
}

/**
* Sets the duration
*
* @return void
*/
public function setDuration($duration)
{
return $this->duration = intval($this->enddate->format('U')) - intval($this->startdate->format('U'));
}

Но вычисленное время не вставляется в базу данных.

Что я делаю не так?

Ответы [ 5 ]

0 голосов
/ 08 января 2019

То, что вы действительно хотите сделать, это вообще не хранить эту избыточную информацию.

/**
* Returns the duration
*
* @return int $duration
*/
public function getDuration()
{
    return $this->getStartdate()->diff($this->getEnddate())->seconds;
}
0 голосов
/ 30 декабря 2018

Вам не нужно хранить такие значения в базе данных.Вы должны настроить duration в TCA как «сквозной».В вашей модели вы определяете геттер и сеттер как обычно.Теперь вы можете вычислить продолжительность в вашем контроллере, примерно так:

$start = $this->yourRepository->getStartdate();
$end = $this->yourRepository->getEnddate();
$duration = $end->format('U') - $start->format('U');
$this->yourRepository->setDuration( $duration);

Вы можете сделать это в вашем initializeAction, чтобы значение вычислялось в каждом действии.

0 голосов
/ 29 декабря 2018

Я думаю, что ваш подход к сохранению длительности в БД уже неверен.Не храните избыточную информацию!

Вам следует хранить поля startdate и enddate в базе данных, но не указывать продолжительность, так как она может быть рассчитана на лету.

Избыточная информациятипичный источник проблем и ошибок.

0 голосов
/ 29 декабря 2018

Вы очистили красный кеш в TYPO3 (Очистить все кеши)?Это необходимо после изменения вашей модели.

Также методы установки не используются автоматически в extbase.Так что если вы не вызываете ->setDuration() в своем коде, это вообще не вызывается.Модуль отображения данных extbase использует метод _setProperty для установки значения для каждого свойства.

Вы можете вызвать метод ->setDuration() в своем коде для записи в базу данных (обновление / добавление):

$model->setDuration(0);
$repository->add($model);

$model->setDuration(0);
$repository->update($model);
0 голосов
/ 29 декабря 2018

В базе данных есть поле "длительность" (или, если оно вызывается по-другому - существует ли сопоставление длительности с этим именем?).Кроме того: есть ли TCA для продолжительности поля?Все остальное хранится как положено?Если нет, пожалуйста, также разместите свой код, где модель вызывается и сохраняется (например, действие контроллера).Что делать, если вы отлаживаете свой объект непосредственно перед сохранением?Правильно ли заполнена длительность объекта?

...