Поддержка
Ресурсы

Сортировка записей

Ручная сортировка записей с помощью drag and drop

Сортировка позволяет менять порядок записей вручную с помощью перетаскивания. В таблице ресурса появляется кнопка переключения в режим сортировки, где все записи загружаются без пагинации и отображаются в виде списка с drag-handle.

Подключение

Добавьте трейт Reorderable к ресурсу:

app/Frame/Resources/PageResource.php
use Frame\Laravel\Concerns\Reorderable;

class PageResource extends Resource
{
    use Reorderable;

    public static string $model = Page::class;
}

Модель должна иметь колонку для хранения порядка. По умолчанию — sort_order:

php artisan make:migration add_sort_order_to_pages_table
database/migrations/..._add_sort_order_to_pages_table.php
Schema::table('pages', function (Blueprint $table) {
    $table->integer('sort_order')->default(0);
});
После подключения трейта записи автоматически сортируются по sort_order вместо id.

Настройка

$sortColumn
string
Колонка в таблице для хранения порядка. По умолчанию — sort_order.
$reorderLimit
?int
Максимальное количество записей для сортировки. По умолчанию — 500. Установите null для снятия ограничения.
class PageResource extends Resource
{
    use Reorderable;

    public static string $sortColumn = 'position';
    public static ?int $reorderLimit = 1000;
}

Облегчённый формат

По умолчанию в режиме сортировки отображаются те же поля, что и в таблице, с полноценным рендерингом ячеек (relation-поля, select и т.д.).

Если нужен упрощённый вид — добавьте свойство $useSortableRecord и переопределите метод toSortableRecord():

class PageResource extends Resource
{
    use Reorderable;

    public static bool $useSortableRecord = true;

    public function toSortableRecord(Model $model): array
    {
        return [
            'id' => $model->getKey(),
            'title' => $model->title,
            'subtitle' => $model->slug,
        ];
    }
}

В этом случае записи отображаются как компактный список: ID, заголовок и подзаголовок.

Конкурентность

При сохранении порядка используется механизм «traffic cop»: если другой пользователь изменил порядок после загрузки списка, сервер вернёт ошибку 409 Conflict с предложением обновить страницу. Это предотвращает случайную перезапись чужих изменений.

Настройка через Options

Сортировку можно отключить через setUp(), даже если трейт подключён:

protected function setUp(Options $options): void
{
    $options->reordering->enabled(false);
}