extbase - TYPO3 9.5 如何从存储的 FileReference 中获取文件
问题描述
所以我们有 a21glossary 扩展名,我们用我们自己的扩展名 a21glossary_file 进行扩展。在我们的扩展中,我们对扩展表进行 TCA 覆盖,并添加我们的文件字段,如下所示:
$fields = array(
'tx_a21glossary_file_reference' => array(
'label' => 'Winerap',
'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
'tx_a21glossary_file_reference',
array(
'foreign_types' => array(
\TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => array(
'showitem' => '--palette--;;filePalette',
)
),
'maxitems' => 1,
'readOnly' => true,
'foreign_match_fields' => [
'fieldname' => 'tx_a21glossary_file_reference',
'tablenames' => 'tx_a21glossary_main',
'table_local' => 'sys_file',
]
),
'mp3'
),
),
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('tx_a21glossary_main', $fields);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
'tx_a21glossary_main', // Table name
'--palette--;Winerap;tx_a21glossary_file' // Field list to add
);
$GLOBALS['TCA']['tx_a21glossary_main']['palettes']['tx_a21glossary_file'] = array(
'showitem' => 'tx_a21glossary_file_reference'
);
域/模型也通过我们新领域的 getter 和 setter 得到扩展。
所以我们可以转到我们的词汇表页面并添加带有 FileReference 的列表元素,可以选择并归档。
我的问题是我如何以及在哪里可以获得视图层的实际文件,因为存储在数据库中的是 0 或 1。
如果您需要任何类型的信息,请发表评论,非常感谢您的帮助。
编辑:模型
namespace xxx\A21glossaryFile\Domain\Model;
use TYPO3\CMS\Extbase\Domain\Model\FileReference;
class Glossary extends \SveWap\A21glossary\Domain\Model\Glossary
{
/**
* @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
* @cascade remove
*/
protected $tx_a21glossary_file_reference = null;
/**
* @return \TYPO3\CMS\Extbase\Domain\Model\FileReference
*/
public function getTxA21glossaryFileReference(): FileReference
{
return $this->tx_a21glossary_file_reference;
}
/**
* @param \TYPO3\CMS\Extbase\Domain\Model\FileReference $tx_a21glossary_file_reference
*/
public function setTxA21glossaryFileReference(\TYPO3\CMS\Extbase\Domain\Model\FileReference $tx_a21glossary_file_reference)
{
$this->tx_a21glossary_file_reference = $tx_a21glossary_file_reference;
}
}
在我们切换到模型之前,音频文件刚刚被那件作品渲染,这已经完全过时了,对吧?现在我们使用模型并将字段数据传递给模板,我们只是在模板结构中使用它。
tx_a21glossary_main {
60 = FILES
60 {
references {
table = tx_a21glossary_main
uid.data = uid
fieldName = tx_a21glossary_file_reference
}
renderObj = TEXT
renderObj {
stdWrap.data = file:current:publicUrl
stdWrap.wrap = <audio class="audio" controls><source src="|" type="audio/mpeg"/></audio>
}
}
}
解决方案
我假设您的模型中有以下内容(我将该字段命名为“图像”):
/**
* @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
* @cascade remove
*/
protected $image = null;
/**
* @return \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
*/
public function getImage()
{
return $this->image;
}
/**
* @param \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
* @return void
*/
public function setImage(\TYPO3\CMS\Extbase\Domain\Model\FileReference $image)
{
$this->image = $image;
}
如果提供了所有类型,则只需在流体中使用该属性,如下所示:
<f:image image="{item.image}" width="200c" height="200c" alt="Foo Bar"/>
如果您需要从实际图像中获取更多信息,请执行以下操作:
<f:image image="{item.image}" width="200c" height="200c" alt="{item.image.originalResource.originalFile.alternative}"/>
// or
{item.image.originalResource.publicUrl}
尽管这些文档不是专门针对 v9 的,但那里的代码应该仍然可以工作。
我猜那个部分
'foreign_match_fields' => [
'fieldname' => 'tx_a21glossary_file_reference',
'tablenames' => 'tx_a21glossary_main',
'table_local' => 'sys_file',
]
可以安全删除,这可能是您获得 0/1 的原因。到的连接sys_file
是默认的,并通过中间表完成sys_file_reference
。因此,表中的列将始终只包含关系计数器,而不是 a 的 uid sys_file
(这是预期的)。您的 uid 和 sys_file uid 之间的连接被存储sys_file_reference
。来自工作 v9 项目的示例 TCA:
'image' => [
'label' => 'FooBar Label',
'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig('image', [
'maxitems' => 1,
'appearance' => [
'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference'
],
'overrideChildTca' => [
'types' => [
'0' => [
'showitem' => '
--palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette,
--palette--;;filePalette'
],
]
]
], $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'])
],
推荐阅读
- android - 即使新通知到达 Android 设备的通知栏,也始终在最左侧显示通知图标
- java - 错误消息:E/RecyclerView:未连接适配器;跳过布局
- next.js - 元标记属性 og:Linkedin 无法识别图像
- android - 如何使用 Navigation 组件在一个 Activity 的菜单中拥有具有不同片段的 BottomNavigationView 和 NavigationDrawer?
- javascript - 你可能需要一个合适的加载器来处理这个文件类型 js
- kiwi-tcms - 默认语言英语并禁用翻译模式
- c# - 在 IIS 服务器上创建 X509Certificate2 对象时出错
- visual-studio-code - 使用父目录中的 jsconfig
- c - 如何在不冻结系统的情况下处理长中断
- javascript - angularjs 1.x 需要帮助,“长时间使用”