扩展 sys_file_reference (FAL)

Extending sys_file_reference (FAL)

我想用自己的字段扩展 sys_file_reference。所以我创建了字段和 TCA。在后端,该字段可用,但我无法在我的流体模板中引用该字段。

ext_tables.php:

CREATE TABLE sys_file_reference (
 nofollow int(11) DEFAULT '0' NOT NULL,
);

Configuration/TCA/Overrides/sys_file_reference.php:

$tempColumns = array(
    'nofollow' => array(
        'exclude' => 1,
        'l10n_mode' => 'mergeIfNotBlank',
        'label' => 'Link als Nofollow?',
        'config' => array(
            'type' => 'check',
            'default' => '0'
        )
    )
);
TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('sys_file_reference',$tempColumns,1);
TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette('sys_file_reference', 'imageoverlayPalette','--linebreak--,nofollow','after:description');

到目前为止它在后端工作。

Classes/Domain/Model/MyFileReference.php

<?php
namespace LISARDO\Foerderland\Domain\Model;
use TYPO3\CMS\Extbase\Domain\Model\FileReference;

class MyFileReference extends FileReference {

    /**
     * nofollow
     *
     * @var integer
     */
    protected $nofollow;


    /**
     * Returns the nofollow
     *
     * @return integer $nofollow
     */
    public function getNofollow() {
        return $this->nofollow;
    }

    /**
     * Sets the nofollow
     *
     * @param integer $nofollow
     * @return void
     */
    public function setNofollow($nofollow) {
        $this->nofollow = $nofollow;
    }
}

在我的设置中:

config.tx_extbase.persistence.classes {
    LISARDO\Foerderland\Domain\Model\MyFileReference {
        mapping {
            tableName = sys_file_reference
        }
    }
}

在 Fluid 中我得到 image.uid 或 image.link 但 image.nofollow 总是空的。我做错了什么?我认为映射不正确...


好吧,我得到了正确的答案,并注意到我犯了一个错误,并在某些方面解释错误。第一:它不是普通的 extbase 扩展,而只是一个自己的内容元素。所以我没有自己的扩展模型,我可以在其中注入 Georg 和 Victor 提议的实现。我只需要更改 fluid 中的语法:{image.properties.nofollow} 就可以了。

而且我认识到我不需要我的大部分代码:

只需要 TCA 代码和不同的语法。

但我无法弄清楚为什么这种语法有效而普通语法无效。

谢谢大家的回答!

您是否也在引用您的 sys_file_reference 实施?

所以,这可能看起来像那样

/**
 *
 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\LISARDO\Foerderland\Domain\Model\MyFileReference>
 * @lazy
 */
protected $media;

据我所知,您可以使用 {image.properties.nofollow}.

在流体中访问您自己的属性

您需要参考您的自定义实现。

Georg Ringer 在他的回答中建议的那样,或者您可以在 TS 级别替换 class,如下所示:

plugin.tx_yourext {
    objects {
        TYPO3\CMS\Extbase\Domain\Model\FileReference {
            className = LISARDO\Foerderland\Domain\Model\MyFileReference
        }
    }
}

这将在引用它的所有属性中自动实例化 MyFileReference 而不是核心的 FileReference,还包括 @injectObjectManager->get() 调用。

如果你想在全局级别(对于所有插件,包括核心)进行,你可以在上面的 TS 中将 tx_yourext 更改为 tx_extbase