Laravel Backpack中按分类展示文章及按分类重排的实现方法
在Laravel Backpack中按分类分组展示文章及分类重排实现方案
一、按分类分组展示文章
方式1:自定义列表视图实现分组
这种方式灵活性最高,能完全匹配你想要的分组样式:
- 调整列表查询逻辑
在ArticleCrudController的setupListOperation()方法中,确保查询按分类排序并预加载分类关联:
$this->crud->addClause('orderBy', 'category_id'); $this->crud->with(['category']); // 需确保Article模型已定义category关联
- 自定义列表模板
复制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
相关产品推荐
相关产品推荐

