我发现很难理解控制器的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()函数是否也处理了这种情况?
答案 0 :(得分:4)
在保存块之前,需要复制它,以便保存到新版本。 (然后新版本与创建的新页面版本相关联。)
如果查看https://github.com/concrete5/concrete5/blob/master/web/concrete/core/libraries/block_controller.php#L197,您会看到基类有一个非常简单的重复方法。如果您的块很简单(大多数情况下它只有一个数据库表),那么这应该可以正常工作,您不必重载它。
幻灯片显示块有一个示例,您需要重载duplicate()。它不仅具有“普通”表,还具有图像ID的链接表。所以它首先调用父方法,该方法复制普通的块表,然后进行自己的重复。
继续编辑/粘贴几个内容块,同时观看Blocks
表,您将看到何时创建新块。请记住在两次编辑之间发布。
你会注意到,当新的 被创建时,他们会获得一个新的bID
(这是有道理的)。现在看看btContentLocal
。您会注意到每个新的块ID都有一个新条目(与bID
中的Blocks
匹配)。这就是duplicate()
的作用 - 每次编辑块时都会创建一个新行。一切正常,它会自动运作。
但如果MyBlock'sSecondaryTable
中有一些行,那么我保证不会使用新的bID
创建/复制这些行。因此,如果您的块依赖于具有bID
的辅助表链接到块的实例,则新的(更新的)块将具有新的bID
并且无法“查找”旧记录。
这就是幻灯片的作用。您有bID
== 1.有一堆btSlideshowImg
行bID
1,每行一行。当您编辑幻灯片显示块时,您会得到bID
== 2.现有的btSlideshowImg
行不会使用新的bID
进行更新 - 它们会被保留,以便您可以还原版本。 (这就是为什么还原工作正常......这不是duplicate()
处理的还原,而是新版本。)
(从剪贴簿(剪贴板)粘贴块后不立即调用Duplicate()。它看起来很像创建特定页面类型的新页面 - 该块最初创建为别名,并且仅在你首先编辑它是否重复 - 但是复制()确实被调用。)
答案 1 :(得分:0)
每当分配模板或复制/粘贴块时,都会调用复制函数。
复制功能主要是需要保存在多个表中的附加组件。
加载项只能识别一个表,并且只能自动管理那个表。
例如,幻灯片加载项将在一个表中保存设置,在另一个表中保存图像列表。数据将通过bID字段链接。
编辑块时,保存功能处理两个表。但是,在分配模板或粘贴块时(例如),块的bID将在不进行编辑的情况下更改,因此不会通过保存功能。
如果没有复制函数,会发生的情况是新的bID将保存在主表中,但不会保存在辅助表中,这意味着幻灯片不会显示任何图像。
请记住,加载项只能识别主表,任何其他表都必须手动处理。