如何在Yajra Laravel Datatables中按条件控制操作按钮显示
在Laravel 10 + Yajra Datatable中根据业务逻辑显示/隐藏操作按钮
针对你的需求,有两种简洁的实现方式,可根据业务复杂度选择:
方法一:直接在Blade视图中添加业务判断
在resources/views/partials/datatablesActions.blade.php的Edit按钮代码块中,在权限判断的基础上增加业务状态校验。假设你的请假模型有status字段,值为approved代表已审批,修改代码如下:
@can($viewGate) <a class="btn btn-xs btn-primary" href="{{ route('admin.' . $crudRoutePart . '.show', $row->id) }}"> {{ trans('global.view') }} </a> @endcan @can($editGate) {{-- 新增业务判断:仅当请假未审批时显示编辑按钮 --}} @if($row->status !== 'approved') <a class="btn btn-xs btn-info" href="{{ route('admin.' . $crudRoutePart . '.edit', $row->id) }}"> {{ trans('global.edit') }} </a> @endif @endcan @can($deleteGate) <form action="{{ route('admin.' . $crudRoutePart . '.destroy', $row->id) }}" method="POST" onsubmit="return confirm('{{ trans('global.areYouSure') }}');" style="display: inline-block;"> <input type="hidden" name="_method" value="DELETE"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <input type="submit" class="btn btn-xs btn-danger" value="{{ trans('global.delete') }}"> </form> @endcan
这种方式直接在视图层完成判断,适合逻辑简单的场景,同时保留了原有的权限控制(@can指令)。
方法二:在控制器中处理逻辑后传递变量到视图
如果业务逻辑较复杂,可将判断逻辑移至控制器,传递处理后的变量到视图,让视图更简洁:
- 修改控制器中的Datatable列定义:
$table->editColumn('actions', function ($row) { $viewGate = 'leave_show'; $editGate = 'leave_edit'; $deleteGate = 'leave_delete'; $crudRoutePart = 'leaves'; // 合并权限与业务逻辑,判断是否允许编辑 $canEdit = auth()->user()->can($editGate) && $row->status !== 'approved'; return view('partials.datatablesActions', compact( 'viewGate', 'editGate', 'deleteGate', 'crudRoutePart', 'row', 'canEdit' // 传递处理后的变量 )); });
- 修改Blade视图中的Edit按钮部分:
@can($viewGate) <a class="btn btn-xs btn-primary" href="{{ route('admin.' . $crudRoutePart . '.show', $row->id) }}"> {{ trans('global.view') }} </a> @endcan {{-- 直接使用控制器传递的变量判断 --}} @if($canEdit) <a class="btn btn-xs btn-info" href="{{ route('admin.' . $crudRoutePart . '.edit', $row->id) }}"> {{ trans('global.edit') }} </a> @endif @can($deleteGate) <form action="{{ route('admin.' . $crudRoutePart . '.destroy', $row->id) }}" method="POST" onsubmit="return confirm('{{ trans('global.areYouSure') }}');" style="display: inline-block;"> <input type="hidden" name="_method" value="DELETE"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <input type="submit" class="btn btn-xs btn-danger" value="{{ trans('global.delete') }}"> </form> @endcan
两种方式都能实现需求,方法一更适合简单逻辑,方法二更适合复杂场景的逻辑复用。
内容的提问来源于stack exchange,提问作者Siddiqui Noor
相关产品推荐
相关产品推荐

