Я коснусь только простой сортировки, пока что. Довольно хороший гайд есть на форуме октобера https://octoclub.ru/d/21-sortable-simple-tree-nested-tree. Я опишу чуть детальней.
Например есть тестовый проект. В нем «магазин с товарами».
Я буду описывать кейс, когда уже есть лист продуктов. И только потом решили добавить сортировку. Это отличается тем, что у моих продуктов отсутствует ReorderController. При создании новой сущности, указываете, чтобы он был доступен.
При указании данного параметра создадутся вьюшка и некоторые настройки контроллера. У меня этого нет, поэтому буду делать вручную, заодно детальней.
Сначала указываю настройки reorder в контроллере, подключаю Behaivor и файл yaml.
<?php namespace Alex\Store\Controllers;
use Backend\Classes\Controller;
use BackendMenu;
class Prod extends Controller
{
public $implement = [
'Backend\Behaviors\ListController',
'Backend\Behaviors\FormController',
'Backend\Behaviors\ReorderController', // добавил
];
public $listConfig = 'config_list.yaml';
public $formConfig = 'config_form.yaml';
public $reorderConfig = 'config_reorder.yaml'; // добавил
public function __construct()
{
parent::__construct();
BackendMenu::setContext('Alex.Store', 'main-menu-item');
}
}
Далее вставляю config_reorder.yaml в папке /controllers/prod. Соотв указываю заголовок, модель. NameFrom скажу чуть позже для чего.
title: 'Сортировка продуктов'
modelClass: Alex\Store\Models\Prod
nameFrom: title
toolbar:
buttons: reorder_toolbar
Добавляем собственно вьюшку reorder.htm в туже папку с нашим контроллером /controllers/prod, так как сортировка происходит на отдельной странице.
<?php Block::put('breadcrumb') ?>
<ul>
<li><a href="<?= Backend::url('alex/store/prod/reorder') ?>">Category</a></li>
<li><?= e($this->pageTitle) ?></li>
</ul>
<?php Block::endPut() ?>
<?= $this->reorderRender() ?>
Далее в list tool bar добавляем кнопку на вьюшку.
<a href="<?= Backend::url('alex/store/prod/reorder') ?>" class="btn btn-default oc-icon-list"><?= e(trans('backend::lang.reorder.default_title')) ?></a>
Так отлично. Появилась кнопка а админке.
Собственно этой всей настройки можно было избежать и октобер бы сам сгенерировал как надо, при указании галочки ReorderBehavior, о чем говорил в самом начале.
Кнопка появилась, но при переходе с нее возникает ошибка, говорящая о том, что мы еще не добавили в модель Трейт сортировки.
Добавляем в нашу модель.
use \October\Rain\Database\Traits\Sortable; // Для Sortable
И далее, чтобы этот трейт корректно отрабатывал нашей моделе и соотв таблице нужно поле sort_order. Добавляем его. Тип число, nullable true.
Отлично. Заходим в сортировку. И лично у меня это выглядит так. Есть итемы, но они пустые. Это собственно поле nameFrom, которое указывается в config_reorder.yaml. У меня было написано title, хотя исходя из моей таблицы нужно указать name.
Указал name. Результат
!Есть один нюанс. Он касается поля sort_order. В идеале это все делать на новой сущности. Но если мы редактируем существующую, то у поля sort_order будет стоять 0 или Null в таблице. Как было подмечено в статье https://octoclub.ru/d/21-sortable-simple-tree-nested-tree надо в ручном режиме проставить валидные значения для текущих итемов.
В моем случае все не сложно и выглядит так.
Отлично. Все почти готово. Для примера я хочу выделить классный Сыр и поставить его первым. При стандартном получении из модели, сортировка происходит автоматически.
// это из компонента Prod
public function init()
{
$this->items = ProdModel::get();
}
Результат
Если же вы получаете итемы другими способами, то может указать дополнительно orderBy по полю sort_order.