使用 TYPO3 DataHandler 将现有页面移动到新创建的页面中
Move existing pages into newly created pages with TYPO3 DataHandler
我正在使用 DataHandler 创建和移动页面,就像在这个片段中一样。虽然可以很好地创建新页面,但现有的子页面不会移动到它们新创建的父页面中。
这会创建新页面但不会移动现有页面
$data = [
'pages' => [
'NEW_IT' => [
'pid' => 1,
'hidden' => false,
'title' => 'IT',
],
591 => [
// this is not set
'pid' => 'NEW_IT',
// but this is set
'title' => 'I am a child of IT',
],
]
];
我尝试了 ['pages'][591]['move'] = 'NEW_IT'
但也无济于事。
我还尝试了 '591'
而不是 591
、dataHandler->reverseOrder = true
和 dataHandler->copyTree = true
。
dataHandler->errorLog
为空。
相反,这有效(新页面进入新页面)
$data = [
'pages' => [
'NEW_IT' => [
'pid' => 1,
'hidden' => false,
'title' => 'IT',
],
'NEW_IT_SUB' => [
'pid' => 'NEW_IT',
],
]
];
我还想知道哪些 ID(NEW<any string>
与 NEW<base64>
等)是可以接受的,因为我在文档中没有找到任何内容,而且示例使用了不同的样式。 "must be unique" 很明显。但我不明白为什么有些人会在那里生成 UUID。
参考资料
编辑:我开了一张伪造票:https://forge.typo3.org/issues/90939
我查看了v8/v9中的代码/DataHandler 和master。 DataHandler中相应的逻辑没有改变。
我已经创建了一个测试用例并对其进行了 xdebugged,而且在查看代码后我非常确定会发生什么。但是这样做是为了验证 "it is working the way i think the code tells" - 虽然这不是您期望的方式。我也是。记得我去年通过迁移脚本遇到过这样的问题,但没有深入研究它(因为时间),我改变了它并将其作为循环。
正在创建页面 => 检索替换的 ID => 将其用于其他数据命令。
数据处理程序循环遍历提供的数据集数组中 table 的每条记录。
foreach ($this->datamap[$table] as $id => $incomingFieldArray) { ... }
首先它准备一些东西,然后调用注册的 processDatamap_preProcessFieldArray
钩子,它检查给定的 $id
// Is it a new record? (Then Id is a string)
if (!MathUtility::canBeInterpretedAsInteger($id)) { ... } else { ... }
如果id不是整数或整数字符串,则执行真分支,否则执行假分支。久违了,真好
TRUE-Branch 处理创建新记录(页面,tt_content,...),添加对提供的 NEWxxx 的替换作为替换等。
它还会检查 'pid' 字段是否在记录中,以及它是否包含 NEW。如果是这样,它将用先前创建的记录的 uid 替换 NEWxxx。
另一方面,如果 $id 不是整数或整数字符串,则假定它是现有记录。 (假分支)。在此分支上没有检查 'pid',如果它包含 NEW 并查找替换。
但是..为什么没有错误?如果它没有替换它,它应该崩溃或类似的东西? - 是的,这就是我们的假设 - 至少是这样。
'pid' 在应用于记录时总是被忽略(参见方法 fillInFieldArray()
)
switch ($field) {
case 'uid':
case 'pid':
// Nothing happens, already set
break;
...
}
等等 .. 只要您不在第二页数组中提供进一步的 fields/values(具有整数 id 和初始 pid 的 NEW),它就没有任何关系。无所事事不是错误 - 因此,它什么都不做,甚至不通知任何相关信息。
这是一个错误吗?不知道,我个人会说是的。但也许这应该作为一个问题创建,并最终与核心 developer/other 贡献者讨论。
也许有 were/are 为什么它只做这一个 运行 的原因。
要么更改文档以明确,'pid' 替换仅有效,id $id => [] 也是一个新的 / playholder id .. 或者你必须在 2 轮中完成.
或者 .. 将 as as feature/bug 放到问题跟踪器中,让我们讨论一下。也许也可以尝试在 FALSE/existing 记录分支中实现它。但是让我们听听其他一些关于它的意见。
如果其他事情也应该在同一轮中对现有记录完成,我会花时间 tommorrow/at 周末为它/问题提供补丁。 (与数据处理程序战斗会很有趣)。
我正在使用 DataHandler 创建和移动页面,就像在这个片段中一样。虽然可以很好地创建新页面,但现有的子页面不会移动到它们新创建的父页面中。
这会创建新页面但不会移动现有页面
$data = [
'pages' => [
'NEW_IT' => [
'pid' => 1,
'hidden' => false,
'title' => 'IT',
],
591 => [
// this is not set
'pid' => 'NEW_IT',
// but this is set
'title' => 'I am a child of IT',
],
]
];
我尝试了 ['pages'][591]['move'] = 'NEW_IT'
但也无济于事。
我还尝试了 '591'
而不是 591
、dataHandler->reverseOrder = true
和 dataHandler->copyTree = true
。
dataHandler->errorLog
为空。
相反,这有效(新页面进入新页面)
$data = [
'pages' => [
'NEW_IT' => [
'pid' => 1,
'hidden' => false,
'title' => 'IT',
],
'NEW_IT_SUB' => [
'pid' => 'NEW_IT',
],
]
];
我还想知道哪些 ID(NEW<any string>
与 NEW<base64>
等)是可以接受的,因为我在文档中没有找到任何内容,而且示例使用了不同的样式。 "must be unique" 很明显。但我不明白为什么有些人会在那里生成 UUID。
参考资料
编辑:我开了一张伪造票:https://forge.typo3.org/issues/90939
我查看了v8/v9中的代码/DataHandler 和master。 DataHandler中相应的逻辑没有改变。
我已经创建了一个测试用例并对其进行了 xdebugged,而且在查看代码后我非常确定会发生什么。但是这样做是为了验证 "it is working the way i think the code tells" - 虽然这不是您期望的方式。我也是。记得我去年通过迁移脚本遇到过这样的问题,但没有深入研究它(因为时间),我改变了它并将其作为循环。
正在创建页面 => 检索替换的 ID => 将其用于其他数据命令。
数据处理程序循环遍历提供的数据集数组中 table 的每条记录。
foreach ($this->datamap[$table] as $id => $incomingFieldArray) { ... }
首先它准备一些东西,然后调用注册的 processDatamap_preProcessFieldArray
钩子,它检查给定的 $id
// Is it a new record? (Then Id is a string)
if (!MathUtility::canBeInterpretedAsInteger($id)) { ... } else { ... }
如果id不是整数或整数字符串,则执行真分支,否则执行假分支。久违了,真好
TRUE-Branch 处理创建新记录(页面,tt_content,...),添加对提供的 NEWxxx 的替换作为替换等。
它还会检查 'pid' 字段是否在记录中,以及它是否包含 NEW。如果是这样,它将用先前创建的记录的 uid 替换 NEWxxx。
另一方面,如果 $id 不是整数或整数字符串,则假定它是现有记录。 (假分支)。在此分支上没有检查 'pid',如果它包含 NEW 并查找替换。
但是..为什么没有错误?如果它没有替换它,它应该崩溃或类似的东西? - 是的,这就是我们的假设 - 至少是这样。
'pid' 在应用于记录时总是被忽略(参见方法 fillInFieldArray()
)
switch ($field) {
case 'uid':
case 'pid':
// Nothing happens, already set
break;
...
}
等等 .. 只要您不在第二页数组中提供进一步的 fields/values(具有整数 id 和初始 pid 的 NEW),它就没有任何关系。无所事事不是错误 - 因此,它什么都不做,甚至不通知任何相关信息。
这是一个错误吗?不知道,我个人会说是的。但也许这应该作为一个问题创建,并最终与核心 developer/other 贡献者讨论。
也许有 were/are 为什么它只做这一个 运行 的原因。
要么更改文档以明确,'pid' 替换仅有效,id $id => [] 也是一个新的 / playholder id .. 或者你必须在 2 轮中完成.
或者 .. 将 as as feature/bug 放到问题跟踪器中,让我们讨论一下。也许也可以尝试在 FALSE/existing 记录分支中实现它。但是让我们听听其他一些关于它的意见。
如果其他事情也应该在同一轮中对现有记录完成,我会花时间 tommorrow/at 周末为它/问题提供补丁。 (与数据处理程序战斗会很有趣)。