TYPO3:使用新文本字段扩展 FAL sys_file_reference

TYPO3: Extend FAL sys_file_reference with a new textfield

我只是想用新的文本字段 "copyright" 扩展 sys_file_reference table,这只是正常的 extbase 方式。像魅力一样工作,领域出现了。但是当我用 sys_file_reference 关系保存记录时,它不会添加引用。保存后它只是空的...记录是带有常规媒体字段的页面还是我的自定义扩展之一都没有关系。有人知道我错过了什么吗?

非常感谢您的帮助!

TCA:

$fileReferenceColumns = [
'copyright' => [
    'exclude' => true,
    'label' => $ll . 'sys_file_reference.copyright',
    'config' => [
        'type' => 'input',
        'size' => 20,
        'max' => 255,
        'eval' => 'null',
        'default' => null,
    ]
]];

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('sys_file_reference', $fileReferenceColumns);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette(
    'sys_file_reference',
    'imageoverlayPalette',
    'copyright'
);

SQL:

CREATE TABLE sys_file_reference (
  copyright VARCHAR(255) DEFAULT ''          NOT NULL,
);

型号:

class FileReference extends AbstractEntity
{

    /**
     * uid of a sys_file
     *
     * @var integer
     */
    protected $originalFileIdentifier;

    /**
     * @var \TYPO3\CMS\Extbase\Domain\Model\File
     */
    protected $file;

    /**
     * @var string
     */
    protected $copyright;

    /**
     * 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\Extbase\Domain\Model\File
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * @param \TYPO3\CMS\Extbase\Domain\Model\File $file
     */
    public function setFile($file)
    {
        $this->file = $file;
        $this->originalFileIdentifier = $file->getUid();
    }

    /**
     * @return string
     */
    public function getCopyright()
    {
        return $this->copyright;
    }

    /**
     * @param string $copyright
     */
    public function setCopyright($copyright)
    {
        $this->copyright = $copyright;
    }
}

打字错误:

config.tx_extbase {
    persistence {
        classes {
            Interlutions\ItlGallery\Domain\Model\FileReference {
                mapping {
                    tableName = sys_file_reference
                    columns {
                        uid_local.mapOnProperty = originalFileIdentifier
                        uid_local.mapOnProperty = file
                        votes.mapOnProperty = votes
                    }
                }
            }
        }

        objects {
            TYPO3\CMS\Extbase\Domain\Model\FileReference.className = Interlutions\ItlGallery\Domain\Model\FileReference
        }
    }
}

嘿,欢迎来到 Whosebug :-) 我猜你所有的引用都丢失了,因为你完全 "replace" 原始 FileReference 对象使用:

config.tx_extbase.objects.TYPO3\CMS\Extbase\Domain\Model\FileReference.className = Interlutions\ItlGallery\Domain\Model\FileReference

在您的整个系统中,Extbase FileReference 将被替换为您的 FileReference。因此,我认为有关每个 FileReference 的重要信息不会存储到数据库中,因为您的 "override"-模型缺少很多 Setters / Getters,因为您的模型仅扩展了 AbstractEntity。

请尝试扩展现有的 FileReference - 这可能会解决问题:

class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference

请注意,使用 config.tx_extbase.objects 覆盖 类 可能会导致其他扩展中断。您可以考虑使用 plugin.tx_yourextension.objects 为您的扩展覆盖它。 您的新字段无论如何都可以通过使用 file.properties.copyright 默认 FileReference 访问,例如在 Fluid 模板中。

另一件事:由于您需要版权字段,此扩展也做同样的事情:https://typo3.org/extensions/repository/view/tgm_copyright

问题是,如果未填写新字段 "copyright",它会尝试将值保存为 NULL。但是 SQL 定义不允许 NULL。

因此将 SQL 定义更改为例如以下有效(查看 sys_file_reference 标题和描述的字段定义):

CREATE TABLE sys_file_reference (
  copyright TINYTEXT,
);

我知道这真的很简单...