在保存块之前,需要对其进行复制,以便保存到新版本。(然后该新版本与创建的新页面版本相关联。)
如果您查看https://github.com/concrete5/concrete5/blob/master/web/concrete/core/libraries/block_controller.php#L197,您会发现基类有一个非常简单的复制方法。如果您的块很简单(主要是因为它只有一个 DB 表),那么这应该可以正常工作并且您不必重载它。
幻灯片块有一个需要重载 duplicate() 的示例。它不仅有“普通”表,还有图像 ID 的链接表。所以它首先调用父方法,复制正常的块表,然后自己复制。
继续并在观看Blocks
表格的同时编辑/粘贴一些内容块,您将看到何时创建新块。请记住在两次编辑之间发布。
您会注意到,当创建新的时,它们会得到一个新的bID
(这是有道理的)。现在来看看btContentLocal
。您会注意到每个新块 ID 都有一个新条目(与bID
s from匹配Blocks
)。就是这样duplicate()
做的——每次编辑块时都会创建一个新行。一切正常,它会自动运行。
但是,如果您在 a 中有一些行MyBlock'sSecondaryTable
,那么我向您保证这些行不会被新的bID
. 因此,如果您的块依赖于具有bID
链接到块实例的辅助表,那么新的(更新的)块将具有新的bID
并且无法“找到”旧记录。
这就是幻灯片的作用。你有bID
== 1。有一堆1btSlideshowImg
行bID
,每个文件有一行。当您编辑幻灯片块时,您会得到bID
== 2。现有btSlideshowImg
行不会随新行更新bID
——它们会被保留,以便您可以还原版本。(这就是恢复工作正常的原因……duplicate()
处理的不是恢复,而是新版本。)
(从剪贴簿(剪贴板)粘贴块后,不会立即调用 Duplicate()。它看起来很像创建特定页面类型的新页面 - 该块最初是作为别名创建的,并且仅在您第一次编辑时它确实重复了-但确实调用了duplicate()。)