1

我正在使用 TYPO3 CMS 7.6.x LTS 和 Extension Builder 编写 TYPO3 扩展。我的扩展程序的任务之一是扫描 TYPO3 的 tt_content 表的“header”和“bodytext”字段;匹配“bodytext”中的特定文本模式;解析找到的文本;并将结果数据连同来自 tt_content “标题”字段的标签一起放入我的扩展程序的日志表中。

[ https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html ]的“使用 Extbase 和 Fluid 开发 TYPO3 扩展”中的“使用外国数据源”谈到使用 TypoScript 映射将数据放入 tt_address。相反,我正在从 tt_content 读取数据,并且宁愿留在扩展中的 PHP 中。

以 TYPO3 前端用户的外键中的图表为例,我在 Extension Builder 中向我的扩展的域模型中添加了第二个模型。我制作了一个“TtContent”模型,并使用它的“域对象设置”来“映射到现有表”,它的条目是“tt_content”。我没有在“使用模型类扩展”字段中输入值。我在我的 Log 模型中创建了一个“关系”字段,并运行了一条从我的 Log:ttContent 关系字段连接到我的 TtContent 模型的标题栏的线路。然后当我点击“保存”时,扩展生成器回复:“表“tt_content”的配置与 extbase 不兼容。如果要映射到该表,则必须自己配置(错误 606)”。我不明白这个错误信息。

在 Extension Builder 中,我是否在我的 Log 模型中与现有的外部类建立关系?如果是这样,我使用哪个外部类?或者,我是否在 Extension Builder 中制作了 tt_content 模型,并以某种方式解决了该错误 606?这似乎不难做到,因为我想从 TYPO3 中已经存在的表中读取数据。

4

1 回答 1

2

解决方案:创建一个 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_ContentExtension 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.CTypeExtbase 通过它的 \TYPO3\CMS\Extbase\Configuration\AbstractConfigurationManager getConfiguration() $frameworkConfiguration 数组和它的 \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapFactory buildDataMapInternal() 函数来实现这一点。在撰写本文时,您不能在 recordType 值中使用通配符,例如*or %;并且您不能给出诸如text, textmedia.

于 2016-01-09T17:39:06.970 回答