我的扩展如何从TYPO3 CMS 7.6中的tt_content读取bodytext字段?

时间:2016-01-04 20:26:49

标签: typo3 extbase typo3-7.x typo3-extensions

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

在[https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html]的“使用Extbase和Fluid开发TYPO3扩展”中的“使用外部数据源”讨论了如何使用TypoScript映射将数据放入tTO_address。相反,我正在读取FROM tt_content中的数据,而宁愿在扩展中保留在PHP中。

Foreign Key to TYPO3 Frontend User中的图形为例,我在Extension Builder中为扩展程序的域模型添加了第二个模型。我制作了一个“TtContent”模型,并使用其“域对象设置”来“映射到现有表格”,其条目为“tt_content”。我没有在“使用模型类扩展”字段中输入值。我在我的Log模型中创建了一个“关系”字段,并运行了从我的Log:ttContent关系字段连接到我的TtContent模型的标题栏的电线。当我单击“保存”时,Extension Builder回复:“表的配置”tt_content“与extbase不兼容。如果要映射到此表,则必须自己配置(错误606)”。我不明白这个错误信息。

在Extension Builder中,我是否将Log模型中的关系与现有外部类建立关系?如果是这样,我会使用哪个外部课程?或者,我是否在Extension Builder中创建了tt_content模型,并以某种方式完成了错误606?这似乎并不难,因为我想从TYPO3中已有的表中读取。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

注意:您无需将TYPO3的uid或pid属性添加到Content模型。这些属性已从父\ TYPO3 \ CMS \ Extbase \ DomainObject \ AbstractDomainObject类扩展。

点击Extension Builder中的“保存”以保存新的域模型。您将收到一条消息:“警告!表的配置”tt_content“与extbase不兼容。如果要映射到此表,则必须自己配置(错误606)。您还要保存吗?”是的,无论如何要保存。 Extension Builder将回复“成功。扩展已保存。您的扩展尚未安装。”退出Extension Builder。

注意:如果您在Extension Builder中进行了几次建模迭代,您可能会在扩展的最终代码中找到工件,并在之前的迭代中留下。 Extension Builder会覆盖您的某些扩展区域,但只留下其他区域。请参阅[https://docs.typo3.org/typo3cms/extensions/extension_builder/Configuration/Index.html]上的Extension Builder配置参考。

使用Extbase表映射来配置TYPO3 tt_content表中的内容,从而访问内容。使用TypoScript“config.tx_extbase.persistence.classes”映射参数在“typo3conf / ext / yourextensionkey / ext_typoscript_setup.txt”文件中进行此配置。保存域模型时,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]的”建立类层次结构“有一个代码示例”config.tx_extbase“;但它没有显示映射线本身。

在我的情况下,我在ext_typoscript_setup.txt中添加了TypoScript指令来映射“header”和“bodytext”列。我还删除了Extension Builder编写的recordType = Tx_Myextensionkey_Content行,因为我想读取已存在的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值中使用通配符,例如*%;并且无法提供值列表,例如text, textmedia