При создании контента в OctoberCMS часто возникает необходимость скопировать (клонировать) какую-то Модель.
Или проще говоря на языке Ваших клиентов: а как мне скопировать существующую запись? Учитывая частоту запроса на этот фунционал, я хочу подать идею генерировать этот блок кода по умолчанию в Rainlab.Builder 😎
Для начала найдите необходимый контроллер вашего плагина, например plugins/icstudio/control/controllers/Tariffs.php
Теперь добавим в него новый метод, который будет создавать копии необходимых Моделей. В Интернетах можно встретить аналогичный код, но мы его доработали, поэтому копипастой его использовать не рекомендуется.
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>
Копировать выбранные записи
Код кнопки должен быть внутри
...
Сохраняем, чистим кеш и любуемся: