У меня есть расширение на основе Extbase для Typo3, которое имеет иерархическую модель данных. Мне пришлось вставить дополнительный слой к этой модели, т.е. Project contains multiple items
, Теперь у меня есть Project contains multiple sub-projects
а также Sub-project contains multiple items
, Все моделируется с использованием таблиц MM-отношений и работает в бэкэнде. Я могу добавлять, удалять, сортировать подпроекты и элементы.
Тем не менее, шаблон жидкости ничего не показывает, и если я передам, например, подпроекту t3lib_utilities_debug::Debug
, Я получил
Вы никогда не должны видеть это предупреждение. Если вы делаете, вы, вероятно, использовали PHP
функции массива, такие как current () на
Tx_Extbase_Persistence_ObjectStorage. Чтобы получить первый результат,
Вы можете использовать методы rewind () и current ().
при печати ObjectStorage
для предметов. Я предполагаю, что MM-отношение, которое я добавил, каким-то образом нарушено, но я не могу понять, как. Кроме того, кажется, что __construct
метод доменной модели не вызывается (я добавил отладочный вывод, который не печатается).
Перечисление работает, если я передаю результат вызова findAll
репозитория, но он не работает для моих отфильтрованных вызовов (которые работали до того, как я добавил дополнительный слой). Метод фильтрации выглядит, например, для элемента
public function findBySubProject(SubProject $p) {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(false);
$query->matching($query->equals('subproject', $p));
return $query->execute();
}
Как я уже сказал, запрос дает результаты, но они каким-то образом нарушены. их отношения.
Есть идеи, как это исправить?
Я не знаю, на какой версии Extbase вы разрабатываете.
Но на TYPO3 4.6+
Вы должны знать о object
а также reflection
кэширование. Во время разработки вы можете отключить это caching
от:
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_reflection']['backend'] = 't3lib_cache_backend_NullBackend';
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['extbase_object']['backend'] = 't3lib_cache_backend_NullBackend';
Поскольку ваша проблема связана с изменениями в вашей модели, вы должны попытаться усечь таблицы cf_extbase_object
, cf_extbase_object_tags
, cf_extbase_reflection
а также cf_extbase_reflection_tags
после любых изменений.
Если это не поможет вам решить вашу проблему, то вы должны дать нам больше информации о вашей конфигурации (особенно конфигурации TCA, потому что Extbase полагается на нее).
Как проверить Extbase QueryResult
$items = $this->itemRepository->findAll();
echo count($items);
if ($items) {
echo '<pre>';
foreach ($items as $item) {
print_r($item);
}
echo '</pre>';
}
— редактировать —
Вы определили поле subproject
в твоём ТСА? Это должно быть как минимум доступно как тип passtrough
:
'subproject' => array(
'config' => array(
'type' => 'passthrough',
),
),
В случае, если кто-то еще сталкивается с той же проблемой: я случайно использовал объект без элементов в качестве тестового объекта. Если вы попытаетесь перечислить / отладить / отобразить пустой ObjectStorage
предупреждение напечатано.