1

我有一个前端扩展,登录用户应在其中添加/编辑 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 实际上并没有执行“更新”语句,我需要在前端规避某种权限检查吗?

4

2 回答 2

5

有点像旧线程,但有一个适用于 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);

update 方法需要两个参数,文件 uid 和一个带有 db 字段名称和值的数组

于 2017-07-19T12:08:28.280 回答
0

据我所知,您必须使用更新查询自己更新它们:

$GLOBALS['TYPO3_DB']->->exec_UPDATEquery('sys_file_metadata', 'file = ' . $fileUid, array('modification_date' => time()));
于 2017-01-19T13:22:23.287 回答