具体5:何时以及如何在块控制器中使用duplicate()函数?

时间:2013-04-09 13:31:53

标签: concrete5

我发现很难理解控制器的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()函数是否也处理了这种情况?

2 个答案:

答案 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.有一堆btSlideshowImgbID 1,每行一行。当您编辑幻灯片显示块时,您会得到bID == 2.现有的btSlideshowImg行不会使用新的bID进行更新 - 它们会被保留,以便您可以还原版本。 (这就是为什么还原工作正常......这不是duplicate()处理的还原,而是新版本。)

(从剪贴簿(剪贴板)粘贴块后不立即调用Duplicate()。它看起来很像创建特定页面类型的新页面 - 该块最初创建为别名,并且仅在你首先编辑它是否重复 - 但是复制()确实被调用。)

答案 1 :(得分:0)

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

复制功能主要是需要保存在多个表中的附加组件。

加载项只能识别一个表,并且只能自动管理那个表。

例如,幻灯片加载项将在一个表中保存设置,在另一个表中保存图像列表。数据将通过bID字段链接。

编辑块时,保存功能处理两个表。但是,在分配模板或粘贴块时(例如),块的bID将在不进行编辑的情况下更改,因此不会通过保存功能。

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

请记住,加载项只能识别主表,任何其他表都必须手动处理。