在我们的例子中,我们有一个表A,其中包含使用表B的IRRE记录。在后端模块中,我们导入一个XML文件来导入表B的那些记录。
表A的所有记录/数据均可用。 除了新的uid /标识符外,表B的所有数据都可用。
基于https://docs.typo3.org/typo3cms/CoreApiReference/6.2/ApiOverview/Typo3CoreEngine/Database/我必须为所有新创建的记录设置标识符NEWxxxx
。
我一次导入大量记录。我可以在循环中生成这些标识符并立即处理所有记录,还是必须按记录运行整个数据图处理记录?
除了标识符,我是否需要在包含IRRE记录的父记录上设置任何字段?
不涉及翻译/工作空间/其他关系。
感谢您的帮助。
答案 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
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中的所有引用类型,其行为相同:
$ttContentId = $dataHandler->substNEWwithIDs['NEW58d5079c8741c8.22627844']; // e.g. 333
,适用于所有变体(普通,tt_content.image
,NEW...
)inline
,适用于所有变体(普通,foreign_field
)MM
,适用于所有变体(普通,select
)通过MM
传递数据可确保创建日志条目,并且在大多数情况下可以使用TYPO3的历史记录/回滚模块恢复修改。
除此之外,还可以执行批量操作 - group
的调用不仅限于聚合(上例中的MM
记录)。但是,DataHandler
ID必须是唯一的,在大规模执行期间不得重复使用以避免副作用。
DataHandler
&amp; tt_content
场景将此转换为初始问题的NEW...
和table_a
方案,table_b
可能如下所示。当然,您必须确定哪些对table_a
的引用绑定到table_b
。
$dataMap