Перед сохранением блока его нужно продублировать, чтобы сохранить в новую версию. (Затем эта новая версия связывается с новой созданной версией страницы.)
Если вы посмотрите на 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