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()));
Другие вопросы по тегам