Concrete5: Когда и как использовать функцию дублирования() в блочном контроллере?

Мне трудно понять концепцию функции дублирования() контроллера.

В документации C5 сказано:

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

Когда блок в утвержденной версии обновляется, разве он не сохраняется, как это обрабатывается функцией save()?

Я также не уверен, что происходит внутри этой функции. Может кто-нибудь уточнить?

Также обрабатывает ли функция дубликат() ситуацию, когда блок вставляется из буфера обмена?


person user1448031    schedule 09.04.2013    source источник


Ответы (2)


Перед сохранением блока его нужно продублировать, чтобы сохранить в новую версию. (Затем эта новая версия связывается с новой созданной версией страницы.)

Если вы посмотрите на https://github.com/concrete5/concrete5/blob/master/web/concrete/core/libraries/block_controller.php#L197 вы увидите, что базовый класс имеет довольно простой дублирующий метод. Если ваш блок прост (в основном, если он имеет одну таблицу БД), то это должно работать нормально, и вам не нужно его перегружать.

В блоке слайд-шоу есть пример ситуации, в которой вам нужно перегрузить дубликат(). У него есть не только «обычная» таблица, но и связанная таблица идентификаторов изображений. Поэтому он сначала вызывает родительский метод, который дублирует обычную таблицу блоков, а затем выполняет собственное дублирование.

Идите вперед и отредактируйте / вставьте несколько блоков содержимого, наблюдая за таблицей Blocks, и вы увидите, когда будут созданы новые блоки. Не забывайте публиковать между правками.

Вы заметите, что когда новые создаются, они получают новый bID (что имеет смысл). Теперь взгляните на btContentLocal. Вы заметите, что для каждого нового идентификатора блока создается новая запись (соответствует bID из Blocks). Это то, что делает duplicate() — он создает новую строку каждый раз, когда редактируется блок. Все работает нормально, работает автоматически.

Но если у вас есть несколько строк в MyBlock'sSecondaryTable, то я гарантирую вам, что эти строки не будут созданы/скопированы с новым bID. Таким образом, если ваш блок опирается на вторичную таблицу, имеющую bID для связи с экземпляром блока, то новый (обновленный) блок будет иметь новый bID и не сможет «найти» старые записи.

Вот что делает слайд-шоу. У вас есть bID == 1. Есть куча btSlideshowImg строк с bID 1 и по одной строке для каждого файла. Когда вы редактируете блок слайд-шоу, вы получаете bID == 2. Существующие btSlideshowImg строки не обновляются новыми bID — они сохраняются, чтобы вы могли вернуть версию. (Вот почему возврат работает нормально... duplicate() обрабатывает не возврат, а новую версию.)

(Duplicate() не вызывается сразу после вставки блока из записки (буфера обмена). Это очень похоже на создание новой страницы определенного типа — блок изначально создается как псевдоним и только при первом редактировании. он дублирует -- но дубликат() вызывается.)

person James S    schedule 09.04.2013
comment
Спасибо за ответ. Я все еще пытаюсь понять концепцию функции дублирования(). В моем блоке я использую 2 таблицы. Моя функция save() обрабатывает сохранение во вторичную таблицу, а также вызывает родительский метод save(). Я внес несколько изменений в свой блок, и мне удалось успешно вернуться к предыдущим версиям страницы со старыми данными блока. Кажется, у меня все работает отлично БЕЗ функции дублирования ()... - person user1448031; 10.04.2013
comment
... Я посмотрел блок слайд-шоу C5. Когда я копирую и вставляю его из буфера обмена, блок слайд-шоу, похоже, не создает новый идентификатор в базе данных мгновенно. Только когда я редактирую новый блок и снова сохраняю, он создает для него новый идентификатор. Точно такое же поведение и с моим собственным блоком. Итак, похоже, что функция дублирования() ничего не делает для вставки из буфера обмена? Я до сих пор не уверен, когда мне следует использовать дубликат () или в моем случае это необязательно? - person user1448031; 10.04.2013
comment
дубликат() вызывается при вставке -- но только после сохранения. Добавьте Log::addEntry("block duplicated $newBID"); в качестве первой строки метода duplicate() в Concrete5_Library_BlockController для тестирования и посмотрите, что и когда произойдет. Новый ID всегда будет происходить без проблем - это то, что происходит во вторичных таблицах (или что-то еще, что связано с bID), за что отвечает дубликат(). .... Надеюсь, изменения в моем ответе помогли. Без ваших примеров кода и других подробностей я больше ничего не могу сказать. - person James S; 10.04.2013

Функция дублирования вызывается при назначении шаблонов или копировании/вставке блоков.

Функция дублирования необходима в основном для надстроек, которые необходимо сохранять более чем в одной таблице.

Надстройки могут знать только об одной таблице и будут автоматически управлять только этой одной таблицей.

Надстройка слайд-шоу, например, сохранит настройки в одной таблице и список изображений в другой таблице. Данные будут связаны через поле bID.

Когда вы редактируете свой блок, функция сохранения работает с двумя таблицами. Однако при назначении шаблона или вставке блока (например) идентификатор bID блока изменится без вашего редактирования, поэтому он не будет проходить через функцию сохранения.

Без функции дублирования новый идентификатор bID будет сохранен в основной таблице, но не будет сохранен во вторичной таблице, что означает, что в слайд-шоу не будет отображаться никакого изображения.

Помните, надстройки знают только об основной таблице, любая другая таблица должна обрабатываться вручную.

person Nour Akalay    schedule 13.04.2013