TYPO3 custom content元素如何直接添加IRRE内联元素
TYPO3自定义内容元素内嵌内联元素免指定存储页实现方案
完全可以实现你需要的效果,不需要提前为内联元素指定固定存储页面,内联元素记录会自动绑定所属内容元素,跟随内容元素的存储位置自动归属。
核心原理
你之前接触到的「必须指定内联元素存储页」的实现方式,本质是只配置了基础的表关联,没有开启TYPO3原生IRRE(Inline Relational Record Editing,内联关联记录编辑)的父记录跟随机制,才会强制要求子记录必须配置固定存储pid。开启对应绑定配置后,子记录会自动继承父内容元素的存储pid,不需要额外手动指定。
具体实现步骤
- 第一步:给内联元素对应子表添加关联字段
先给内联元素对应的数据库表新增2个必备字段:parentid:int(11) 类型,默认值0,用于存储所属父内容元素的uidparenttable:varchar(255) 类型,默认值空字符串,用于存储父记录所在表名(内容元素统一存tt_content)
- 第二步:配置内联元素子表的TCA
在子表的TCA配置中补充父记录关联相关参数,参考配置如下:// 内联元素子表TCA的ctrl配置段 'ctrl' => [ 'title' => '自定义内联元素', 'label' => 'title', // v12+版本必加:允许子记录存放在任意类型的页面,不受页面类型限制 'security' => [ 'ignorePageTypeRestriction' => true, ], // 绑定父记录关联字段 'type' => 'parenttable', 'cruser_id' => 'cruser_id', 'crdate' => 'crdate', 'tstamp' => 'tstamp', 'delete' => 'deleted', 'hideTable' => true, // 建议开启:隐藏子表在后台列表的独立入口,避免脱离父元素单独创建无效记录 ], - 第三步:在自定义内容元素中配置内联关联字段
在自定义内容元素对应的tt_contentTCA配置中,添加内联字段,不要配置固定pid的默认值,只需要关联上一步配置的两个父绑定字段即可:// 自定义内容元素内的内联字段配置 'inline_elements' => [ 'exclude' => 0, 'label' => '内联元素集合', 'config' => [ 'type' => 'inline', 'foreign_table' => 'tx_yourext_domain_model_inlineelement', // 替换为你自己的内联元素表名 'foreign_field' => 'parentid', // 关联子表存储父记录uid的字段 'foreign_table_field' => 'parenttable', // 关联子表存储父表名的字段 'maxitems' => 99, 'appearance' => [ 'collapseAll' => 1, 'levelLinksPosition' => 'top', 'showAllLocalizationLink' => 1, ], ], ], - 第四步:更新数据库结构
执行数据库结构同步(可通过后台维护模块的「分析数据库结构」功能,或执行CLI命令vendor/bin/typo3 database:updateschema),确保新增字段和表结构生效。
注意事项
- 不要给inline字段配置
foreign_record_defaults.pid的固定值,否则会强制将内联元素存到指定页面,无法跟随父内容元素动态存储 - 如果使用Extbase做数据持久化,记得在父内容元素模型的内联元素属性上添加级联删除注解
@TYPO3\CMS\Extbase\Annotation\ORM\Cascade("remove"),删除内容元素时关联的内联元素会同步清理 - 多语言场景下,只需要给子表正常配置
sys_language_uid、l10n_parent、l10n_source等本地化字段,IRRE会自动处理本地化关联,不需要额外配置
内容的提问来源于stack exchange,提问作者180690
相关产品推荐
相关产品推荐

