首页 > 解决方案 > 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>

        }
    }
}

标签: extbasetypo3-9.xtypo3-extensions

解决方案


我假设您的模型中有以下内容(我将该字段命名为“图像”):

/**
 * @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'])
],

推荐阅读