Дублирование записей в OctoberCMS
При создании контента в OctoberCMS часто возникает необходимость скопировать (клонировать) какую-то Модель. Или проще говоря на языке Ваших клиентов: а как мне скопировать существующую запись? Учитывая частоту запроса на этот фунционал, я хочу подать идею генерировать этот блок кода по умолчанию в Rainlab.Builder 😎
При создании контента в OctoberCMS часто возникает необходимость скопировать (клонировать) какую-то Модель.
Или проще говоря на языке Ваших клиентов: а как мне скопировать существующую запись? Учитывая частоту запроса на этот фунционал, я хочу подать идею генерировать этот блок кода по умолчанию в Rainlab.Builder 😎
Для начала найдите необходимый контроллер вашего плагина, например plugins/icstudio/control/controllers/Tariffs.php
Теперь добавим в него новый метод, который будет создавать копии необходимых Моделей. В Интернетах можно встретить аналогичный код, но мы его доработали, поэтому копипастой его использовать не рекомендуется.
- к имени записи добавится цифра 2;
- в slug добавится цифра 2;
- ключ
is_activeбудет выведен в 0. Это обезопасит ваш продакшн от вывода неверных данных.
public function onDuplicate() { $checked_items_ids = input('checked'); foreach ($checked_items_ids as $id) { $original = TariffModel::where("id", $id)->first(); $clone = $original->replicate(); $clone->name = $clone->name . '2'; $clone->slug = $clone->slug . '2'; $clone->service_name = $clone->service_name . '2'; $clone->is_active = 0; $clone->save(); } Flash::success('Записи скопированы'); return $this->listRefresh(); }
Теперь надо привязать этот экшн к верстке бекенда. Для этого найдите файл _list_toolbar.htm для вашего контроллера, например для контроллера из примера путь к этому файлу будет такой: plugins/icstudio/control/controllers/tariffs/_list_toolbar.htm
Добавим этот код, чтобы вывести кнопку:
class="btn btn-default oc-icon-clone" disabled="disabled" onclick="$(this).data('request-data', { checked: $('.control-list').listWidget('getChecked') })" data-request="onDuplicate" data-request-confirm="Хотите скопировать указанные записи?" data-trigger-action="enable" data-trigger=".control-list input[type=checkbox]" data-trigger-condition="checked" data-request-success="$(this).prop('disabled', true)" data-stripe-load-indicator> Копировать выбранные записи
Код кнопки должен быть внутри
...
Сохраняем, чистим кеш и любуемся: