TYPO3 9.5 如何从存储的 FileReference 中获取文件
TYPO3 9.5 How to get File from stored FileReference
所以我们有了 a21glossary 扩展,我们用自己的扩展 a21glossary_file 扩展了它。在我们的扩展中,我们对扩展 table 进行了 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'
);
Domain/Model 也扩展了新字段的 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>
}
}
}
我在您的模型中假定以下内容(我将该字段命名为 "image"):
/**
* @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}
虽然 docs 不是专门针对 v9 的,但那里的代码应该仍然有效。
我猜的部分
'foreign_match_fields' => [
'fieldname' => 'tx_a21glossary_file_reference',
'tablenames' => 'tx_a21glossary_main',
'table_local' => 'sys_file',
]
可以安全删除,这可能是你只得到 0/1 的原因。与 sys_file
的连接是默认的,并通过中间 table sys_file_reference
完成。因此,您的 table 中的列将始终只包含关系计数器,而不是 sys_file
的 uid(这是预期的)。你的 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'])
],
所以我们有了 a21glossary 扩展,我们用自己的扩展 a21glossary_file 扩展了它。在我们的扩展中,我们对扩展 table 进行了 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'
);
Domain/Model 也扩展了新字段的 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>
}
}
}
我在您的模型中假定以下内容(我将该字段命名为 "image"):
/**
* @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}
虽然 docs 不是专门针对 v9 的,但那里的代码应该仍然有效。
我猜的部分
'foreign_match_fields' => [
'fieldname' => 'tx_a21glossary_file_reference',
'tablenames' => 'tx_a21glossary_main',
'table_local' => 'sys_file',
]
可以安全删除,这可能是你只得到 0/1 的原因。与 sys_file
的连接是默认的,并通过中间 table sys_file_reference
完成。因此,您的 table 中的列将始终只包含关系计数器,而不是 sys_file
的 uid(这是预期的)。你的 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'])
],