我的扩展如何从TYPO3 CMS 7.6中的tt_内容读取正文字段?

我的扩展如何从TYPO3 CMS 7.6中的tt_内容读取正文字段?,typo3,extbase,typo3-7.x,typo3-extensions,Typo3,Extbase,Typo3 7.x,Typo3 Extensions,我正在使用TYPO3 CMS 7.6.x LTS和扩展生成器编写一个TYPO3扩展。我的扩展的任务之一是扫描TYPO3的tt_内容表的“header”和“bodytext”字段;匹配“bodytext”中的特定文本模式;解析找到的文本;并将结果数据与tt_内容“header”字段中的标签一起放入扩展的日志表中 []的“使用Extbase和Fluid开发TYPO3扩展”中的“使用外国数据源”谈到了使用打字脚本映射将数据放入tt_地址。相反,我从tt_内容中读取数据,并且宁愿留在扩展中的PHP中 c

我正在使用TYPO3 CMS 7.6.x LTS和扩展生成器编写一个TYPO3扩展。我的扩展的任务之一是扫描TYPO3的tt_内容表的“header”和“bodytext”字段;匹配“bodytext”中的特定文本模式;解析找到的文本;并将结果数据与tt_内容“header”字段中的标签一起放入扩展的日志表中

[]的“使用Extbase和Fluid开发TYPO3扩展”中的“使用外国数据源”谈到了使用打字脚本映射将数据放入tt_地址。相反,我从tt_内容中读取数据,并且宁愿留在扩展中的PHP中

config.tx_extbase{
    persistence{
        classes{

            Mynamespace\Myextensionkey\Domain\Model\Content {
                mapping {
                    tableName = tt_content
                    columns {
                        header.mapOnProperty = header
                        bodytext.mapOnProperty = bodytext
                    }
                }
            }

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


在Extension Builder中,我是否在日志模型中建立与现有外部类的关系?如果是,我应该使用哪个外部类?或者,我是否在Extension Builder中创建了tt_内容的模型,并以某种方式克服了错误606?这似乎不难做到,因为我想从TYPO3中已有的表中读取数据。

解决方案:创建一个Extbase模型和一个表示现有tt_内容表的存储库,然后编写一个TypoScript属性映射

在TYPO3 Extension Builder的域建模器中,添加一个名为“Content”的模型或一些提醒您tt_Content表的名称。在内容模型的“域对象设置”部分,将“tt_内容”放在“映射到现有表”框中。不要选中“扩展现有模型类”框,因为Extbase没有用于tt_内容的类

此外,在域对象设置中,将对象类型设置为“实体”,选中“是聚合根”框,取消选中“添加已删除字段”、“添加隐藏字段”、“添加开始时间/结束时间字段”和“启用分类”框。将对象类型设置为“entity”并选中“is aggregate root?”框会导致Extension Builder为内容模型创建存储库

向内容模型中添加表示要在tt_内容数据库表中访问的列的属性。在我的内容模型中,我只添加了“header”和“bodytext”属性

注意:您不需要将TYPO3的uid或pid属性添加到内容模型中。这些属性已从父\TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject类扩展而来

在Extension Builder中单击“保存”以保存新的域模型。您将收到一条消息:“警告!表“tt_内容”的配置与extbase不兼容。如果要映射到此表(错误606),您必须自己配置它。是否仍要保存?”是,仍要保存。扩展生成器将响应“成功。扩展已保存。您的扩展尚未安装。”退出扩展生成器

注意:如果您在Extension Builder中进行了多次建模迭代,您可能会在扩展的最终代码中找到工件,这些工件是您以前的迭代遗留下来的。Extension Builder覆盖部分扩展区域,但保留其他区域。请参阅位于[]的扩展生成器配置参考

使用Extbase表映射来配置并访问TYPO3 tt_content表中的内容。使用“typo3conf/ext/yourextensionkey/ext\u TypoScript\u setup.txt”文件中的TypoScript“config.tx\u extbase.persistence.classes”映射参数执行此配置。扩展生成器在保存域模型时创建了此文件。这是错误606中提到的配置

请参见位于[]的“使用外部数据源”中的代码示例。这个打字脚本代码示例定义了映射线本身。您可能希望使用“config.tx_extbase”而不是“plugin.tx_myextension”。下一页,[]的“类层次结构建模”有一个“config.tx_extbase”的代码示例;但它并没有显示映射线本身

在我的情况下,我在ext_TypoScript_setup.txt中添加了打字说明,以映射“header”和“bodytext”列。我还删除了Extension Builder编写的
recordType=Tx\u Myextensionkey\u内容
行,因为我想读取已经存在的tt\u内容记录,而不是我的扩展所生成的记录

config.tx_extbase{
    persistence{
        classes{

            Mynamespace\Myextensionkey\Domain\Model\Content {
                mapping {
                    tableName = tt_content
                    columns {
                        header.mapOnProperty = header
                        bodytext.mapOnProperty = bodytext
                    }
                }
            }

        }
    }
}
我的TYPO3扩展现在可以读取tt_内容

注意:在ext\u typoscript\u setup.txt中为recordType指定一个值会导致Extbase持久性层在底层
tt\u content.CType
列中搜索该值。Extbase通过其\TYPO3\CMS\Extbase\Configuration\AbstractConfigurationManager getConfiguration()$frameworkConfiguration数组及其\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapFactory buildDataMapInternal()函数实现这一点。在撰写本文时,您不能在recordType值中使用通配符,如
*
%
;并且您不能给出值列表,例如
text、textmedia