我创建了一个扩展事件,其中包含为用户创建事件的选项。这是使用extbase存储库方法实现的。在活动创建表格中,我应该重复活动的开始日期,结束日期和工作日。
例如,如果我将开始日期设置为13-10-2015,结束日期设置为30-10-2015。并选择工作日作为"星期三"。因此,活动将在所有"星期三和#34;在13到30之间。
当我创建一个非重复事件时,它将正常工作。但是对于重复发生的事件,我已经实现了extbase存储库的克隆方法。
if (!empty($endDateRecurring) && !empty($recurringWeekDays)) {
$endDate = new \DateTime($endDateRecurring);
$startDate = $newEvent->getDate();
$startDate->setTime(0, 0);
$datetimeDiff = $startDate->diff($endDate);
for ( $event=1; $event <= $datetimeDiff->days; $event++ ) {
$checkDate = $newEvent->getDate()->add(new \DateInterval('P'.$event.'D'));
$dayOfWeekNo = date('w',$checkDate->getTimestamp());
if ( in_array( $dayOfWeekNo, $recurringWeekDays ) ) {
$eventProperties = \TYPO3\CMS\Extbase\Reflection\ObjectAccess::getGettableProperties( $newEvent );
\TYPO3\CMS\Extbase\Reflection\ObjectAccess::setProperty( $eventProperties, 'date', $eventProperties['date']->add(new \DateInterval('P1D') ) );
$eventCopy = $this->objectManager->create('\TYPO3\EventCreate\Domain\Model\Event');
foreach ( $eventProperties as $propertyName => $propertyValue ) {
if (\TYPO3\CMS\Extbase\Reflection\ObjectAccess::isPropertySettable($eventCopy,
$propertyName) && !in_array($propertyName, array('uid','pid'))) {
$propertyValue = \TYPO3\CMS\Extbase\Reflection\ObjectAccess::getProperty( $newEvent, $propertyName );
\TYPO3\CMS\Extbase\Reflection\ObjectAccess::setProperty( $eventCopy, $propertyName, $propertyValue );
}
}
//TODO: cloning doesn't work because the id is already set and it thus doesn't add a new object to the repository.
//either create a new object and copy all content properties, or find another way to add more events to the db for recurring days.
$this->eventRepository->add($eventCopy);
$this->objectManger->get('Tx_Extbase_Persistence_Manager')->persistAll();
}
}
}
这里$ recurringWeekDays是一个数组,其中包含选定的重复工作日ID(对于星期一-1,星期二-2这样)。
问题是当插入任何天数时,只有一个记录插入数据库。在上面的例子中,3月13日至30日是星期三。但只插入了一条记录。
如果有人知道解决方案,请帮助。
答案 0 :(得分:0)
我想使用objectManager是个问题。尝试改变
$eventCopy = $this->objectManager->create('\TYPO3\EventCreate\Domain\Model\Event');
在
$eventCopy = new \TYPO3\EventCreate\Domain\Model\Event();
这有用吗?
答案 1 :(得分:0)
从我之前的回答中讨论的结论再次尝试:
正如@pgame指出的那样,问题是ORM中使用的内部ID。在Persistence/ObjectStorage.php
中,我可以看到PHP的spl_object_hash($object)
用于生成存储中对象的内部ID。因此,我们必须确保此函数不会多次生成相同的哈希值。
由于它是在http://php.net/manual/de/function.spl-object-hash.php中编写的,您可以在第一个用户注释中读到此函数不会通过对象属性生成其散列,而是通过内部句柄来保证内存中的多个实例将具有不同的散列。但是,一旦实例被销毁,哈希可以重用用于其他实例。
因此,我们必须确保在每次迭代中,$eventCopy
的实例不会被下一个实例覆盖(并因此被破坏),因为它可能导致ObjectStorage中的相同散列。我建议创建一个数组$eventCopies
并将$eventCopy
的每个新实例推送到此。因此,通过for循环中的所有迭代,每个实例都将在此数组中保持活动状态。毕竟,您可以再次循环$eventCopies
并将每个添加到您的存储库。
这次有用吗?