首页 文章

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

提问于
浏览
1

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

"Using Foreign Data Sources" in "Developing TYPO3 Extensions with Extbase and Fluid" at [https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html]讨论使用TypoScript映射将数据放入tTO_address . 相反,我正在读取FROM tt_content中的数据,而宁愿在扩展中保留在PHP中 .

Foreign Key to TYPO3 Frontend User中的图形为例,我向我的扩展添加了第二个模型's domain model in Extension Builder. I made a 193899 model, and used its 193900 to 193901 , its entry being 193902 . I did NOT enter a value into the 193903 field. I made a 193904 field in my Log model, and ran a wire connected from my Log:ttContent relation field to the title bar of my TtContent model. When I then clicked 193905 , Extension Builder replied: 193906 tt_content 193907 . I don' t了解此错误消息 .

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

1 回答

  • 2

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

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

    同样在域对象设置中,将对象类型设置为“Entity”,选中“is aggregate root”框,并取消选中“add deleted field”,“add hidden field”,“add starttime / endtime fields”和“enable”分类“盒子 . 将对象类型设置为“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]中"Using Foreign Data Sources"中的代码示例 . 此TypoScript代码示例定义了映射行本身 . 您可能希望使用"config.tx_extbase"而不是"plugin.tx_myextension" . [https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/5-modeling-the-class-hierarchy.html]的下一页"Modeling the Class Hierarchy"有"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 .

相关问题