0

我正在使用 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 = 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>vs NEW<base64>. 等)是可以接受的,因为我在文档中没有找到任何内容,并且示例使用不同的样式。“必须是唯一的”是显而易见的。但我不明白为什么有些人会在那里生成 UUID。

参考

编辑:我开了一张伪造票:https ://forge.typo3.org/issues/90939

4

1 回答 1

1

我已经检查了 v8/v9 和 master 中的代码/DataHandler。DataHandler 中的相应逻辑并没有因此而改变。

我已经创建了一个测试用例并通过它进行了调试,在查看代码后我也很确定会发生什么。但是这样做是为了验证“它按照我认为代码告诉的方式工作” - 尽管它不是您期望的方式。我也是。记得我去年通过迁移脚本遇到了这样的问题,但没有深入研究它(因为时间),我改变了它并将其作为循环。

创建页面 => 检索替换的 id => 将其用于其他数据命令。

数据处理程序循环遍历提供的数据集数组中表的每条记录。

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,否则执行 false-branch。这么久,真好。

TRUE-Branch 处理创建新记录(页面、tt_content、...)、添加对提供的 NEWxxx 的替换作为替换等。

它还检查记录中是否有“pid”字段,以及它是否包含 NEW。如果是这样,它将 NEWxxx 替换为先前创建的记录的 uid。

另一方面,如果 $id 不是整数或整数字符串,则假定它是现有记录。(错误分支)。在这个分支上没有检查 'pid',如果它包含 NEW 并寻找替换。

但是..为什么没有错误?如果它没有替换它,它应该崩溃或类似的东西?- 是的,这就是我们所假设的——至少对此是这样。

'pid' 在应用到记录时总是被忽略(见方法fillInFieldArray()

switch ($field) {
    case 'uid':
    case 'pid':
         // Nothing happens, already set
         break;
  ...
}

等等..只要您不在第二页数组中提供更多字段/值(具有整数 id 和初始值为 NEW 的 pid),它就没有任何关系。无所事事不是错误 - 因此,它什么也不做,甚至不通知任何有关它的信息。

这是一个错误吗?不知道,我个人会说是的。但也许这应该作为一个问题创建,并最终与核心开发人员/其他贡献者讨论。

也许有/是有原因为什么它只运行这一次。

要么应该更改文档以明确,“pid”替换仅有效,id $id => [] 也是一个新的/playholder id .. 或者你必须在 2 轮中完成。

或者 .. 将其作为问题跟踪器的功能/错误,让我们讨论一下。也许也可以尝试在 FALSE/现有记录分支中实现它。但是,让我们听听其他一些关于它的观点。

如果其他事情也应该为同一轮中的现有记录完成,我会在明天/周末花时间为它/问题提供补丁。(与数据处理程序打架会很有趣)。

于 2020-04-02T20:09:35.877 回答