typo3 - 新创建的 sys_file_refences 的问题
问题描述
我正在尝试在 TYPO3 7.6 的调度程序任务中创建 sys_file_references。
但是在创建的sys_file_references 中只有Title 和Description 可以看到,文件丢失了。
我的模型类包含这个:
/**
* uid of a sys_file
*
* @var integer
*/
protected $originalFileIdentifier;
/**
* setOriginalResource
*
* @param \TYPO3\CMS\Core\Resource\FileReference $originalResource
* @return void
*/
public function setOriginalResource(\TYPO3\CMS\Core\Resource\FileReference $originalResource) {
$this->originalResource = $originalResource;
$this->originalFileIdentifier = (int)$originalResource->getOriginalFile()->getUid();
}
/**
* @return \TYPO3\CMS\Core\Resource\AbstractFile|\TYPO3\CMS\Core\Resource\FileReference|\TYPO3\CMS\Core\Resource\Folder|\TYPO3\CMS\Core\Resource\ResourceInterface
* @throws \TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException
*/
public function getOriginalResource()
{
if ($this->originalResource === null) {
$this->originalResource = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance()->getFileReferenceObject($this->getUid());
}
return $this->originalResource;
}
/**
* setFile
*
* @param \TYPO3\CMS\Core\Resource\File $falFile
* @return void
*/
public function setFile(\TYPO3\CMS\Core\Resource\File $falFile) {
$this->originalFileIdentifier = (int)$falFile->getUid();
}
任务代码:
$contentElement = $contentRepository->findByUid(123);
if( file_exists($pathToFile)) {
/** @var File $file */
$file = $resourceFactory->getFileObjectFromCombinedIdentifier('1:/'.$pathToFile);
/** @var SysFileReference $newFileReference */
$newFileReference = $objectManager->get('VENDOR\\MyExtension\\Domain\\Model\\SysFileReference');
$newFileReference->setFile($file);
$newFileReference->setTitle('The Title');
$newFileReference->setDescription('Lorem Ipsum Dolor');
$contentElement->addMedia($newFileReference);
$contentRepository->update($contentElement);
$persistanceManager->persistAll();
}
在创建的 sys_file_reference 中缺少文件:
我尝试附加的 $file:
解决方案
使用 Extbase 创建文件引用非常棘手。您最好的方法是直接数据库操作:
protected function createFileReference($contentUid, $pid, $fieldName, File $file)
{
$data = [
'sys_file_reference' => [
StringUtility::getUniqueId('NEW') => [
'table_local' => 'sys_file',
'uid_local' => $file->getProperty('uid'),
'tablenames' => 'tt_content',
'uid_foreign' => $contentUid,
'fieldname' => $fieldName,
'pid' => $pid,
]
]
];
$dataHandler = GeneralUtility::makeInstance(DataHandler::class);
$dataHandler->start($data, []);
$dataHandler->admin = true;
$dataHandler->process_datamap();
}
上面的示例适用于后端模式。您应该DataHandler
在那里使用,因为它还会更新各种系统表。
推荐阅读
- swift - App中同种语言的冗余外观
- java - 删除每页第一行的 FixedLeading
- javascript - 其他内容 CSS 之上的导航栏
- sql - 如何在 Oracle 11g 监听器中启用 SSL
- php - 如何有效地制作许多(100 多个)具有细微差异的 HTML 页面
- java - 编译失败:-source 7 中不支持 lambda 表达式
- php - 如何在 php 代码库中停止请求具有 504 超时响应的外部 API
- c# - 错误 System.NullReferenceException:“对象引用未设置为对象的实例。” 在集合视图中(再次)
- c# - System.IO.FileLoadException 如果在设置文件中使用俄语字母
- react-native - 如何在 React Navigation 中使用标题按钮导航到其他页面?