TYPO3 Extbase FAL - Как обновить метаданные файла (sys_file) из контроллера внешнего интерфейса
У меня есть расширения внешнего интерфейса, где вошедшие в систему пользователи должны добавлять / редактировать записи sys_file.
Я пытаюсь обновить метаданные файла следующим образом (упрощенно):
$uid = (int)$this->request->getArgument('file');
$resourceFactory = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance();
$file = $resourceFactory->getFileObject($uid);
$file->updateProperties(array(
'title' => $this->request->getArgument('title'),
'keywords' => $this->request->getArgument('keywords'),
'description' => $this->request->getArgument('description'),
'copyright' => $this->request->getArgument('copyright'),
'modification_date' => time()
));
$this->fileRepository->update($file);
$this->addFlashMessage(LocalizationUtility::translate('messages.success.file'));
$this->persistenceManager->persistAll();
persistenceManager и fileRepository внедряются через:
/**
* fileRepository
*
* @var \TYPO3\CMS\Core\Resource\FileRepository
* @inject
*/
protected $fileRepository = NULL;
/**
* @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
* @inject
*/
protected $persistenceManager;
и, как правило, я не получаю ошибки, отображается флэш-сообщение, текучая форма даже показывает новые данные внутри формы, но на самом деле они не сохраняются.
Любой способ отладить / решить это? Кажется, $ fileRepository на самом деле не выполняет оператор "update", есть ли какая-то проверка разрешений, которую мне нужно обойти во внешнем интерфейсе?
2 ответа
Вроде старого потока, но есть решение, которое работает в 7.6 и 8.x, так как репозиторий в 7.6 использует $GLOBAL['TYPO3_DB']
а в 8.x он уже перенесен в Doctrine, поэтому нет необходимости переписывать ваш код. Может быть, это сэкономит кому-то время.
Использовать TYPO3\CMS\Core\Resource\Index\MetaDataRepository
репозиторий и просто загрузить его через objectManager.
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$metadata = $objectManager->get('TYPO3\CMS\Core\Resource\Index\MetaDataRepository');
тогда вы можете заполнить метаданные, как это
$metadata->update($fileUid, $metadataInput);
Для метода обновления требуются два параметра: файл uid и массив с именами и значениями полей БД.
Насколько я знаю, вы должны обновить их самостоятельно с помощью запроса на обновление:
$GLOBALS['TYPO3_DB']->->exec_UPDATEquery('sys_file_metadata', 'file = ' . $fileUid, array('modification_date' => time()));