Небольшая инструкция для тех, кому нужно разбить сортировку по категориям.
Дано: Есть большой список устройств, нужно их как-то между собой сортировать, чтобы выводить в фронте сначала самые популярные. Что должно получиться в конечном итоге:
Первое: переопределяем страницу сортировки для нашей модели
У вас уже настроена самая простая сортировка (Sortable) в вашей модели
Смотрим официальную инструкцию https://octobercms.com/docs/backend/reorder
Инструкция говорит, чтобы модернизировать страницу сортировки, нужно скопировать файлы в контроллер нашей модели
копируем в папку контроллера вашей модели 2 файла:
__reorder_container.htm
<?php if ($reorderToolbarWidget): ?>
<!-- Reorder Toolbar -->
<div id="<?= $this->getId('reorderToolbar') ?>" class="reorder-toolbar">
<?= $reorderToolbarWidget->render() ?>
</div>
<?php endif ?>
<!-- Reorder List -->
<?= Form::open() ?>
<div
id="reorderTreeList"
class="control-treelist"
data-control="treelist"
<?= $reorderShowTree ? '' : 'data-nested="0"' ?>
data-handle="<?= $reorderShowTree ? 'a.move' : '> li > .record > a.move' ?>"
data-stripe-load-indicator>
<?php if ($reorderRecords): ?>
<ol id="reorderRecords">
<?= $this->reorderMakePartial('records', ['records' => $reorderRecords]) ?>
</ol>
<?php else: ?>
<p><?= Lang::get('backend::lang.reorder.no_records') ?></p>
<?php endif ?>
</div>
<?= Form::close() ?>
<script>
$.oc.reorderBehavior.initSorting('<?= $reorderSortMode ?>')
</script>
_reorder_records.htm
<?php foreach ($records as $record): ?>
<?if ($record->device->slug == $_GET['device']) : ?>
<li data-record-id="<?= $record->getKey() ?>"
<?php if ($reorderSortMode === 'simple') : ?>
data-record-sort-order="<?= $record->{$record->getSortOrderColumn()} ?>"
<?php endif ?>
>
<div class="record">
<a href="javascript:;" class="move"></a>
<span><?= e($this->reorderGetRecordName($record)) ?></span>
<input name="record_ids[]" type="hidden" value="<?= $record->getKey() ?>" />
</div>
<?php if ($reorderShowTree): ?>
<ol>
<?php if ($record->children): ?>
<?= $this->reorderMakePartial('records', ['records' => $record->children]) ?>
<?php endif ?>
</ol>
<?php endif ?>
</li>
<?php endif ?>
<?php endforeach ?>
Теперь немного модернизируем _reorder_records.htm, чтобы выводились только устройства определенной категории (сравнивать будет с GET параметром, который дальше передадим)
<?php foreach ($records as $record): ?>
//выводим только нужную категорию
<?if ($record->device->category == $_GET['category']) : ?>
<li data-record-id="<?= $record->getKey() ?>"
<?php if ($reorderSortMode === 'simple') : ?>
data-record-sort-order="<?= $record->{$record->getSortOrderColumn()} ?>"
<?php endif ?>
>
<div class="record">
<a href="javascript:;" class="move"></a>
<span><?= e($this->reorderGetRecordName($record)) ?></span>
<input name="record_ids[]" type="hidden" value="<?= $record->getKey() ?>" />
</div>
<?php if ($reorderShowTree): ?>
<ol>
<?php if ($record->children): ?>
<?= $this->reorderMakePartial('records', ['records' => $record->children]) ?>
<?php endif ?>
</ol>
<?php endif ?>
</li>
<?php endif ?>
<?php endforeach ?>
Добавляем в list_toolbar.htm кнопочку с выбором категорий. Код кнопочки:
//не забудьте поменять эту строку на свою модель, откуда будут черпаться названия и индификаторы ваших категорий
<? $devices = \Appfix\Uslugi\Models\Device::orderBy('name', 'ASC')->get(); ?>
<div class="dropdown dropdown-fixed">
<button
type="button"
class="btn btn-default oc-icon-list"
data-toggle="dropdown">
Сортировать
</button>
<ul class="dropdown-menu" data-dropdown-title="Assign selected to...">
<?php foreach ($devices as $device): ?>
//и не забудьте поменять тут на адрес своей модели
<li><a href="<?= Backend::url('appfix/uslugi/devicemodels/reorder') ?>?category =<?=$device->category ?>" tabindex="-1" class=""><?=$device->name ?></a></li>
<?php endforeach ?>
</ul>
</div>
Полностью файл _list_toolbar.htm (не забудьте поменять адреса)
<div data-control="toolbar">
<a href="<?= Backend::url('appfix/uslugi/devicemodels/create') ?>" class="btn btn-primary oc-icon-plus"><?= e(trans('backend::lang.form.create')) ?></a>
<? $devices = \Appfix\Uslugi\Models\Device::orderBy('name', 'ASC')->get(); ?>
<div class="dropdown dropdown-fixed">
<button
type="button"
class="btn btn-default oc-icon-list"
data-toggle="dropdown">
Сортировать
</button>
<ul class="dropdown-menu" data-dropdown-title="Assign selected to...">
<?php foreach ($devices as $device): ?>
<li><a href="<?= Backend::url('appfix/uslugi/devicemodels/reorder') ?>?device=<?=$device->category ?>" tabindex="-1" class=""><?=$device->name ?></a></li>
<?php endforeach ?>
</ul>
</div>
<button
class="btn btn-default oc-icon-trash-o"
disabled="disabled"
onclick="$(this).data('request-data', {
checked: $('.control-list').listWidget('getChecked')
})"
data-request="onDelete"
data-request-confirm="<?= e(trans('backend::lang.list.delete_selected_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>
<?= e(trans('backend::lang.list.delete_selected')) ?>
</button>
</div>
Готово, вы великолепны! Надеюсь, что моя инструкция кому-то помогла