Как добавить отношения sys_category_record_mm через DataHandler? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь добавить записи в 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 вместо увеличения на количество добавленных отношений.

...