解决方案:创建一个 Extbase 模型和一个代表现有 tt_content 表的存储库,然后编写一个 TypoScript 属性映射。
在 TYPO3 Extension Builder 的域建模器中,添加一个名为“Content”的模型或一些让您想起 tt_content 表的名称。在内容模型的“域对象设置”部分,将“tt_content”放入“映射到现有表”框中。不要介意“扩展现有模型类”框,因为 Extbase 没有这样的 tt_content 类。
同样在域对象设置中,将对象类型设置为“实体”,选中“是聚合根”框,取消选中“添加已删除字段”、“添加隐藏字段”、“添加开始时间/结束时间字段”和“启用分类”框。将对象类型设置为“实体”并检查“是聚合根吗?” 框使 Extension Builder 为您的内容模型创建存储库。
将属性添加到您的内容模型中,这些属性表示您要在 tt_content 数据库表中访问的列。在我的内容模型中,我只添加了“标题”和“正文”属性。
注意:您不需要将 TYPO3 的 uid 或 pid 属性添加到 Content 模型。这些属性已从父类 \TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject 扩展而来。
单击 Extension Builder 中的“保存”以保存新的域模型。您将收到一条消息:“警告!表“tt_content”的配置与 extbase 不兼容。如果要映射到此表,则必须自己配置(错误 606)。是否仍要保存?是的,无论如何都要保存。扩展生成器将响应“成功。扩展已保存。您的扩展尚未安装。” 退出扩展生成器。
注意:如果您在 Extension Builder 中进行多次建模迭代,您可能会在扩展的最终代码中找到工件,这些工件是您之前的迭代遗留下来的。Extension Builder 会覆盖您的一些扩展区域,但不会影响其他区域。请参阅 [ https://docs.typo3.org/typo3cms/extensions/extension_builder/Configuration/Index.html ]上的 Extension Builder 配置参考。
使用 Extbase 表映射来配置并访问 TYPO3 tt_content 表中的内容。使用“typo3conf/ext/yourextensionkey/ext_typoscript_setup.txt”文件中的 TypoScript“config.tx_extbase.persistence.classes”映射参数进行此配置。Extension Builder 在您保存域模型时创建了此文件。这是错误 606 中提到的配置。
请参阅 [ https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html ]中“使用外部数据源”中的代码示例。这个 TypoScript 代码示例定义了映射线本身。您可能希望使用“config.tx_extbase”而不是“plugin.tx_myextension”。下一页,“建模类层次结构”在 [ https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/5-modeling-the-class-hierarchy.html ],有一个代码示例“配置.tx_extbase"; 但它不显示映射线本身。
在我的情况下,我在 ext_typoscript_setup.txt 中添加了 TypoScript 指令来映射“header”和“bodytext”列。我还删除了recordType = Tx_Myextensionkey_Content
Extension Builder 写的那行,因为我想读取已经存在的 tt_content 记录,而不是我的扩展创建的记录。
config.tx_extbase{
persistence{
classes{
Mynamespace\Myextensionkey\Domain\Model\Content {
mapping {
tableName = tt_content
columns {
header.mapOnProperty = header
bodytext.mapOnProperty = bodytext
}
}
}
}
}
}
我的 TYPO3 扩展现在可以从 tt_content 读取。
注意:在 ext_typoscript_setup.txt 中为 recordType 赋值会导致 Extbase 持久层在底层列中搜索该值。tt_content.CType
Extbase 通过它的 \TYPO3\CMS\Extbase\Configuration\AbstractConfigurationManager getConfiguration() $frameworkConfiguration 数组和它的 \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapFactory buildDataMapInternal() 函数来实现这一点。在撰写本文时,您不能在 recordType 值中使用通配符,例如*
or %
;并且您不能给出诸如text, textmedia
.