Я пытаюсь добавить записи в sys_category_record_mm
на основании некоторых условий.поэтому я перебираю кучу файлов, которые уже имеют отношение к данной категории.для каждого из этих файлов я хочу добавить другое отношение.Мне сказали, что использование DataHandler
- хорошая идея, поскольку оно автоматически позаботится о ref-index.
весь мой код в настоящее время выполняется в рамках задачи планировщика.
$this->objectManager = GeneralUtility::makeInstance(ObjectManager::class);
/** @var \TYPO3\CMS\Core\Resource\FileRepository $fileRepository */
$fileRepository = $this->objectManager->get(\TYPO3\CMS\Core\Resource\FileRepository::class);
/** @var \TYPO3\CMS\Core\DataHandling\DataHandler $dataHandler */
$dataHandler = $this->objectManager->get(\TYPO3\CMS\Core\DataHandling\DataHandler::class);
/** @var \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository $categoryRepository */
$categoryRepository = $this->objectManager->get(CategoryRepository::class);
/** @var \TYPO3\CMS\Core\Category\Collection\CategoryCollection $collection */
$collection = CategoryCollection::load(
282,
true,
'sys_file_metadata',
'categories'
);
/** @var \TYPO3\CMS\Core\Category\Collection\CategoryCollection $validationCategoryCollection */
$validationCategoryCollection = CategoryCollection::load(
818,
false,
'sys_file_metadata',
'categories'
);
foreach ($collection as $item) {
/** @var \TYPO3\CMS\Core\Resource\File $sysFile */
$sysFile = $fileRepository->findByUid($item['file']);
$identifier = $sysFile->getIdentifier();
$categoriesToAdd = array(818);
// in downloads folder
if (strpos($identifier, $this->storageIdentifier) !== false) {
$validationCategoryCollection->loadContents();
$validationCategoryCollectionArray = $validationCategoryCollection->toArray();
// check if relation is already set, otherwise -> add it
$hasCategoryRelationAlreadySet = $this->searchArrayByFieldValue(
$validationCategoryCollectionArray['items'],
'uid',
$item['uid']
);
if (!$hasCategoryRelationAlreadySet) {
$data = array();
DebugUtility::debug(
'adding category relation between sys_category.uid : 818 sys_file_metadata.uid : '
. $item['uid'],
'info'
);
$uniqueId = StringUtility::getUniqueId('NEW');
$data['sys_category_record_mm'] = array(
$uniqueId => array(
'uid_local' => 818,
'uid_foreign' => $item['uid'],
'tablenames' => 'sys_file_metadata',
'fieldname' => 'categories',
)
);
$data['sys_file_metadata'][$item['uid']] = array(
'categories' => $dataHandler->substNEWwithIDs[$uniqueId]
);
DebugUtility::debug($data, '$data');
$dataHandler->start($data, array());
$dataHandler->process_datamap();
}
}
}
return true;
}
Каждый раз, когда мой код фактически обновлял sys_file_metadata
записей, поле categories
сбрасывалось на 0
вместо увеличения на количество добавленных отношений.