You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Backpack中按分类展示文章及按分类重排的实现方法

在Laravel Backpack中按分类分组展示文章及分类重排实现方案

一、按分类分组展示文章

方式1:自定义列表视图实现分组

这种方式灵活性最高,能完全匹配你想要的分组样式:

  1. 调整列表查询逻辑
    在ArticleCrudController的setupListOperation()方法中,确保查询按分类排序并预加载分类关联:
$this->crud->addClause('orderBy', 'category_id');
$this->crud->with(['category']); // 需确保Article模型已定义category关联
  1. 自定义列表模板
    复制Backpack默认列表模板到resources/views/vendor/backpack/crud/list.blade.php,找到循环条目部分,添加分组判断:
@php
$currentCategoryId = null;
@endphp

@foreach ($entries as $entry)
    {{-- 当分类变化时显示分类标题 --}}
    @if ($entry->category->id != $currentCategoryId)
        @php $currentCategoryId = $entry->category->id; @endphp
        <tr class="table-group-header bg-light">
            <td colspan="{{ count($crud->columns) }}">
                <h6 class="mb-0">{{ $entry->category->name }}</h6>
            </td>
        </tr>
    @endif
    {{-- 原有文章条目渲染 --}}
    <tr>
        @foreach ($crud->columns as $column)
            <td>{!! $column->render($entry) !!}</td>
        @endforeach
    </tr>
@endforeach

方式2:使用Backpack内置分组(部分版本支持)

如果你的Backpack版本支持,可直接在setupListOperation()中设置:

$this->crud->groupBy('category.name');

这种方式样式由Backpack控制,若需自定义样式仍需调整模板。


二、按分类重排文章+自定义路由

默认Reorder操作是全表范围,需自定义操作实现分类筛选:

1. 创建自定义分类重排操作类

新建app/Http/Controllers/Admin/Operations/CategoryReorderOperation.php:

<?php

namespace App\Http\Controllers\Admin\Operations;

use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
use Backpack\CRUD\app\Operations\ReorderOperation as OriginalReorder;

class CategoryReorderOperation extends OriginalReorder
{
    public function setup()
    {
        parent::setup();
        // 从路由获取分类ID,筛选对应文章
        $catId = request()->route('cat_id');
        CRUD::query()->where('category_id', $catId);
    }

    // 注册自定义路由
    public static function routes($segment, $routeName, $controller)
    {
        parent::routes($segment, $routeName, $controller);
        // 添加分类重排路由
        \Route::get($segment.'/reorder/{cat_id}', [
            'as'        => $routeName.'.reorder.category',
            'uses'      => $controller.'@reorder',
            'operation' => 'reorder',
        ]);
    }
}

2. 在文章CRUD控制器中替换操作

修改ArticleCrudController,替换原Reorder操作并添加分类重排入口:

use App\Http\Controllers\Admin\Operations\CategoryReorderOperation;

class ArticleCrudController extends CrudController
{
    use CategoryReorderOperation; // 替换原ReorderOperation

    public function setup()
    {
        parent::setup();
        $this->crud->setModel(\App\Models\Article::class);
        $this->crud->setRoute(config('backpack.base.route_prefix').'/article');
        $this->crud->setEntityNameStrings('文章', '文章');
    }

    protected function setupListOperation()
    {
        // 添加分类列
        $this->crud->addColumn([
            'name' => 'category.name',
            'label' => '分类',
        ]);

        // 添加分类重排按钮
        $this->crud->addColumn([
            'name' => 'category_id',
            'label' => '操作',
            'type' => 'closure',
            'function' => function($entry) {
                return '<a href="'.backpack_url('article/reorder/'.$entry->category_id).'" class="btn btn-sm btn-primary">重排该分类</a>';
            }
        ]);

        // 其他列表配置...
    }
}

3. 可选:修改重排页面显示分类名称

复制Backpack重排模板到resources/views/vendor/backpack/crud/reorder.blade.php,添加分类标题:

<div class="card-header">
    <h4>重排分类:{{ \App\Models\Category::find(request()->route('cat_id'))->name }}</h4>
</div>

现在访问/admin/article/reorder/{cat_id}即可针对单个分类的文章进行拖拽重排,重排逻辑沿用Backpack原生的排序机制(需确保模型有lft/rgt/depth字段,或自定义order字段并调整操作类逻辑)。

内容的提问来源于stack exchange,提问作者Liju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:19:55