2

我发现很难理解控制器的 duplicate() 函数的概念。

在 C5 文档中,它说:

Run automatically when a block is duplicated. This most likely happens when a block that is in an approved version is updated...

当已批准版本中的块被更新时,它不只是被保存,由 save() 函数处理吗?

我也不确定这个函数里面有什么。有人可以澄清一下吗?

当从剪贴板粘贴块时,duplicate() 函数是否也能处理这种情况?

4

2 回答 2

4

在保存块之前,需要对其进行复制,以便保存到新版本。(然后该新版本与创建的新页面版本相关联。)

如果您查看https://github.com/concrete5/concrete5/blob/master/web/concrete/core/libraries/block_controller.php#L197,您会发现基类有一个非常简单的复制方法。如果您的块很简单(主要是因为它只有一个 DB 表),那么这应该可以正常工作并且您不必重载它。

幻灯片块有一个需要重载 duplicate() 的示例。它不仅有“普通”表,还有图像 ID 的链接表。所以它首先调用父方法,复制正常的块表,然后自己复制。

继续并在观看Blocks表格的同时编辑/粘贴一些内容块,您将看到何时创建新块。请记住在两次编辑之间发布。

您会注意到,当创建新的时它们会得到一个新的bID(这是有道理的)。现在来看看btContentLocal。您会注意到每个新块 ID 都有一个新条目(与bIDs from匹配Blocks)。就是这样duplicate()做的——每次编辑块时都会创建一个新行。一切正常,它会自动运行。

但是,如果您在 a 中有一些行MyBlock'sSecondaryTable,那么我向您保证这些行不会被新的bID. 因此,如果您的块依赖于具有bID链接到块实例的辅助表,那么新的(更新的)块将具有新的bID并且无法“找到”旧记录。

这就是幻灯片的作用。你有bID== 1。有一堆1btSlideshowImgbID,每个文件有一行。当您编辑幻灯片块时,您会得到bID== 2。现有btSlideshowImg行不会随新行更新bID——它们会被保留,以便您可以还原版本。(这就是恢复工作正常的原因……duplicate()处理的不是恢复,而是新版本。)

(从剪贴簿(剪贴板)粘贴块后,不会立即调用 Duplicate()。它看起来很像创建特定页面类型的新页面 - 该块最初是作为别名创建的,并且仅在您第一次编辑时它确实重复了-但确实调用了duplicate()。)

于 2013-04-09T20:29:35.027 回答
0

每当分配模板或复制/粘贴块时,都会调用复制函数。

复制功能对于需要保存在多个表中的附加组件来说是必需的。

附加组件只能知道一张表,并且只会自动管理那张表。

例如,幻灯片插件会将设置保存在一个表格中,并将图像列表保存在另一个表格中。数据将通过 bID 字段链接。

当你编辑你的块时,保存函数会处理这两个表。但是,当分配模板或粘贴块(例如)时,块的 bID 将在没有您编辑的情况下更改,因此它不会通过保存功能。

如果没有复制功能,将会发生的情况是新的投标 ID 将保存在主表中,但不会保存在辅助表中,这意味着幻灯片不会显示任何图像。

请记住,插件只知道主表,任何其他表都必须手动处理。

于 2013-04-13T06:48:42.587 回答