Реализация поведения Sortable / Simple Tree / Nested Tree в своей модели.
В документации очень поверхностно описано как внедрить это в свою модель.
Поэтому я опишу каждый шаг, который необходимо сделать чтобы внедрить поведение для каждого трейта.
Для начала, в базу данных модели нужно добавить поля:
Для Nested Tree
$table->integer('parent_id')->nullable();
$table->integer('nest_left')->nullable();
$table->integer('nest_right')->nullable();
$table->integer('nest_depth')->nullable();
Для Simple Tree
$table->integer('parent_id')->nullable();
Для Sortable
$table->integer('sort_order')->nullable();
После в свою модель надо добавить трейт \October\Rain\Database\Traits\Validation
Пример:
namespace OctoClub\Tutorial\Models;
use Model;
class ReorderTutorial extends Model
{
use \October\Rain\Database\Traits\NestedTree; // Для Nested Tree
use \October\Rain\Database\Traits\SimpleTree; // Для Simple Tree
use \October\Rain\Database\Traits\Sortable; // Для Sortable
// [...]
}
Теперь перейдем к контроллеру данной модели. Там будет больше всего работы, но ничего сложного, все для всех одинаково, просто копипаста)
Добавляем в контроллер поведение 'Backend.Behaviors.ReorderController',
и его конфигурационный файл $reorderConfig = 'config_reorder.yaml'
:
Пример:
namespace OctoClub\Tutorial\Controllers;
class ReorderTutorials extends Controller
{
public $implement = [
'Backend.Behaviors.ReorderController',
];
public $reorderConfig = 'config_reorder.yaml';
// [...]
}
После, вам необходимо в папке контроллера, создать файл config_reorder.yaml
, с этими данными:
# ===================================
# Reorder Behavior Config
# ===================================
# Reorder Title
title: Reorder
# Attribute name
nameFrom: title
# Model Class name
modelClass: OctoClub\Tutorials\Models\ReorderTutorial
# Toolbar widget configuration
toolbar:
# Partial for toolbar buttons
buttons: reorder_toolbar
Разберем что у нас тут имеется:
- title – заголовок страницы
- nameFrom – из какого поля будет браться название строчки, которую вы будете перетаскивать для сортировки
- modelClass – Ваша модель, с которой будет происходить взаимодействия по сортировке
- toolbar/buttons – Путь до фрагмента с html кодом, который будет выводится над списком сортировки.
Теперь в этой-же папке где создали config_reorder.yaml
, создайте новый файл reorder.htm
c этим содержимым:
<?= $this->reorderRender() ?>
Теперь создайте файл _reorder_toolbar.htm
в той-же папке, и вставьте туда код:
<div data-control="toolbar">
<a href="<?= Backend::url('OctoClub/Tutorials/ReorderTutorials') ?>" class="btn btn-primary oc-icon-caret-left">Вернутся назад</a>
</div>
Это добавит нам кнопку "вернутся" на странице сортировки.
Мы добавили все необходимые файлы, и структура в папке контроллера имеет примерно такой вид:
Теперь все готово, и вы должны лишь добавить кнопку "сортировка" или с любым другим названием на странице со списком всех записей. Делается это очень просто. Нужно лишь открыть файл _list_toolbar.htm
в папке контроллера. и добавить туда кнопку со ссылкой на раздел /reorder
текущего контроллера.
Пример:
<div data-control="toolbar">
<a href="<?= Backend::url('OctoClub/Tutorials/ReorderTutorials/create') ?>" class="btn btn-primary oc-icon-plus"><?= e(trans('backend::lang.form.create')) ?></a>
<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>
<a href="<?= Backend::url('OctoClub/Tutorials/ReorderTutorials/reorder') ?>" class="btn btn-default oc-icon-sitemap">
Сортировать дерево
</a>
</div>
После выполнения данной цепочки действий. Вы успешно добавите поведение сортировки и других трейтов – Sorting, Simple Tree и Nested Tree.
Решение возникших проблем
Если вы внедряете данное поведение в модель, с уже существующими данными, вы столкнетесь с проблемой того, что ничего не сортируется и не перетягивается.
Это возникает из-за того, в базе данных у существующих записей в полях, которые вы добавили для внедрение трейта, стоят везде 0.
Вы должны в ручную или с помощью скрипта сделать так, чтобы они были различны и не повторялись.