使用 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' 而不是 591dataHandler->reverseOrder = truedataHandler->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 周末为它/问题提供补丁。 (与数据处理程序战斗会很有趣)。