Сортировка Sortable

Делаем самую простую сортировку с помощью трейта Sortable из Winter CMS. Данный трейт просто задаёт порядковый номер (1, 2, 3, 4, 5, ...) каждому экземпляру модели. Собственно по этому порядковому номеру потом и сортируется коллекция при запросе.

Моделе, экземпляры которой будут сортироваться, нужно добавить поле sort_order. Определение поля (столбца в таблице базы данных) выглядит так:

$table->integer('sort_order')->default(0);

Добавляем трейт Sortable в модель:

plugins/authorname/gellery/models/Album.php
class Album extends Model
{
    use \Winter\Storm\Database\Traits\Sortable;
}

При добавлении этого признака в существующую модель с уже заполнеными ранее данными, потребуется полю sort_order присвоить значения, прежде чем этот трейт заработает правильно. Для этого для каждой строки необходимо вручную проставить значения полю sort_order или же можно выполнить SQL-запрос в котором полю sort_order присвоить значение из поля id. Тем самым значения будут уникальны для каждой записи. Пример такого запроса:

UPDATE myvendor_myplugin_mymodelrecords SET sort_order = id

Далее реализуем интерфейс сортировки в бэкенде Winter CMS.

В контроллер добавляем поведение сортировки и конфигурационный файл для неё:

plugins/authorname/gellery/controllers/Albums.php
namespace AuthorName\Gallery\Controllers;

class Albums extends Controller
{
    public $implement = [
        \Backend\Behaviors\ReorderController::class,
    ];

    public $reorderConfig = 'config_reorder.yaml';

    // ...
}

В папке контроллера создаём файл config_reorder.yaml со следующими данными:

plugins/authorname/gellery/controllers/albums/config_reorder.yaml
# ===================================
#  Reorder Behavior Config
# ===================================

# Reorder Title
title: Сортировка альбомов

# Attribute name
nameFrom: name

# Model Class name
modelClass: AuthorName\Gallery\Models\Album

# Toolbar widget configuration
toolbar:
    # Partial for toolbar buttons
    buttons: reorder_toolbar

Расшифровка полей из данного файла конфига:

  • title – заголовок страницы сортировки;
  • nameFrom – поле модели из которого будет браться название для сортируемых элементов;
  • modelClass – модель, экземпляры которой сортируются;
  • toolbar/buttons – путь к паршилу html-разметки тулбара выводимого над списком сортировки.

Создаём новый файл reorder.php cо следующим содержимым:

plugins/authorname/gellery/controllers/albums/reorder.php
<?= $this->reorderRender() ?>

Далее создаём файл _reorder_toolbar.php. Это будет тулбар на странице сортировки. В нём ссылка в виде кнопки, которая позволяет вернуться к списку экземпляров модели. Содержимое файла:

plugins/authorname/gellery/controllers/albums/_reorder_toolbar.php
<div data-control="toolbar">
    <a href="<?= Backend::url('authorname/gallery/albums') ?>" class="btn btn-primary wn-icon-caret-left">Вернутся к списку альбомов</a>
</div>

На этом сортировка полностью реализована. Осталось добавить в интерфейс ссылку которая будет вести на страницу сортировки. Для этого в файл _list_toolbar.php расположенный в папке контроллера добавляем кнопку:

<a
    href="<?= Backend::url('authorname/gallery/albums/reorder') ?>"
    class="btn btn-default wn-icon-sort"
>
    Сортировать альбомы
</a>

Добавлять нужно во внутрь дива тулбара в подходящее вам место среди других кнопок.

Событие после сортировки
Событие после сортировки Простое решение сделать что то сразу после сортировки, переопределить метод onReorder в вашем контроллере. Внутри метода сначала вызовем стандартный метод поведения onReorder, а затем можем делать всё то что нам нужно.
Комментарии 0

*** чтобы писать комментарии.