如何在TYPO3中使用DataHandler创建内联记录(IRRE)?

时间:2017-03-24 11:25:54

标签: typo3 typo3-6.2.x datahandler

在我们的例子中,我们有一个表A,其中包含使用表B的IRRE记录。在后端模块中,我们导入一个XML文件来导入表B的那些记录。

表A的所有记录/数据均可用。 除了新的uid /标识符外,表B的所有数据都可用。

基于https://docs.typo3.org/typo3cms/CoreApiReference/6.2/ApiOverview/Typo3CoreEngine/Database/我必须为所有新创建的记录设置标识符NEWxxxx

我一次导入大量记录。我可以在循环中生成这些标识符并立即处理所有记录,还是必须按记录运行整个数据图处理记录?

除了标识符,我是否需要在包含IRRE记录的父记录上设置任何字段?

不涉及翻译/工作空间/其他关系。

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

TYPO3中的DataHandler使用以下数组结构来创建新记录或更新现有记录 - 这在TYPO3 CMS 8中是有效的:

A = [1,2,3]
B = A[:]

现有记录使用记录的B = copy.deepcopy(A) 字段的整数值,例如$dataMap = ['<table-name>' => ['<record-uid>' => ['<field-name>' => '<field-value>']] ,新记录使用一些以uid为前缀的随机但唯一的标识符,例如由123创建的NEW - 也可以使用TYPO3 CMS 7 NEWa2b3c4f8

通用示例

我们假设应创建以下记录: *表uniqid('NEW', true)中的新内容元素 *字段StringUtility::getUniqueId('NEW')的表tt_content的两个新的内联文件引用   +使用uid sys_file_reference引用现有的tt_content.image记录   +使用uid sys_file

引用现有的123记录
sys_file

准备数据图

Hava密切关注234,这实际上定义了(新的)内联引用,由新记录或现有记录的逗号分隔值定义 - 可以是$ttContentId = 'NEW58d5079c8741c8.22627844'; // uniqid('NEW', true) $fileRefId1st = 'NEW58d506f3cd0c41.59344142'; // uniqid('NEW', true) $fileRefId2nd = 'NEW58d50714c12260.92562338'; // uniqid('NEW', true) ,{{ 1}}或tt_content.image,混合新的和现有的记录引用。

NEWabc,NEWdef

准备命令映射

123,234,345

执行DataHandler

NEWabc,123,NEWdef

如果您需要$dataMap = [ 'tt_content' => [ 'NEW58d5079c8741c8.22627844' => [ 'title' => 'My new content element', 'bodytext' => 'Look at the following images...', 'CType' => 'textpic', // $fileRefId1st & $fileRefId2nd, the sorting order is defined by this as well 'image' => 'NEW58d506f3cd0c41.59344142,NEW58d50714c12260.92562338', ], ], 'sys_file_reference' => [ 'NEW58d506f3cd0c41.59344142' => [ 'uid_local' => 123, 'title' => 'Image #123', ], 'NEW58d50714c12260.92562338' => [ 'uid_local' => 234, 'title' => 'Image #234', ], ] ]; 创建的记录,可以从内部DataHandler记录映射中解析。例如,以下代码解析了创建的// the command-maps is similar to the data-map to copy, localize, move records // however, it's not required in this scenario and thus stays empty $commandMap = []; 记录的新$dataHandler = new \TYPO3\CMS\Core\DataHandling\DataHandler(); $dataHandler->start($dataMap, $commandMap); $dataHandler->process_datamap(); // $dataHandler->process_cmdmap(); // if $commandMap should be processed as well

uid

备注

在上面的示例中直接为字段uid定义引用,该字段可以包含tt_content ID以及现有的整数ID。对于TYPO3中的所有引用类型,其行为相同:

  • TCA类型$ttContentId = $dataHandler->substNEWwithIDs['NEW58d5079c8741c8.22627844']; // e.g. 333 ,适用于所有变体(普通,tt_content.imageNEW...
  • TCA类型inline,适用于所有变体(普通,foreign_field
  • TCA类型MM,适用于所有变体(普通,select

通过MM传递数据可确保创建日志条目,并且在大多数情况下可以使用TYPO3的历史记录/回滚模块恢复修改。

除此之外,还可以执行批量操作 - group的调用不仅限于聚合(上例中的MM记录)。但是,DataHandler ID必须是唯一的,在大规模执行期间不得重复使用以避免副作用。

转换为DataHandler&amp; tt_content场景

将此转换为初始问题的NEW...table_a方案,table_b可能如下所示。当然,您必须确定哪些对table_a的引用绑定到table_b

$dataMap