2

我正在使用带有 HTML 构建器的 yajra datatebles 来显示服务器端。在这里,我必须对特定角色隐藏操作列中的删除按钮。

我正在使用 spatie 权限包并添加@can()以隐藏删除按钮。我的代码如下。

用户数据表.php

namespace App\DataTables;

use App\User;
use DB;
use Builder;
use Auth;
use Yajra\DataTables\Services\DataTable;
use Yajra\DataTables\Html\Column;

class UsersDataTable extends DataTable
{
    /**
     * Build DataTable class.
     *
     * @param mixed $query Results from query() method.
     * @return \Yajra\DataTables\DataTableAbstract
     */
    public function dataTable($query)
    {
        return datatables($query)
            ->addIndexColumn()
            ->editColumn('status', function(User $user){
                if($user->status == 1)
                return '<label class="label label-success">Active</label>';
                else return '<label class="label label-danger">Deactive</label>';
            })
            ->editColumn('created_at', function(User $user){
                return date('d-m-Y H:i:s',strtotime($user->created_at));
            })
            ->editColumn('checkbox', function(User $user){
                return '<input type="checkbox" data-id="'.$user->id.'" class="sub_chk" name="ids[]" />';
            })
     
            ->addColumn('action', function(User $user) {
                return view('backend.users.usersaction', compact('user'))->render();
            })
            ->rawColumns(['checkbox','status','action']);
    }

    /**
     * Get query source of dataTable.
     *
     * @param \App\User $model
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function query(User $model)
    {

        $users = User::select('id','name','email','status', 'created_at', 'updated_at');
        if($this->request()->get('startDate')) {
            $st = $this->request()->get('startDate');
            $dt = ($this->request()->get('endDate') == '') ? date('Y-m-d') : $this->request()->get('endDate');
            $users->whereDate('created_at','<=', "$dt");
            $users->whereDate('created_at','>=', "$st");
        }
        if($this->request()->get('status') == '0' || $this->request()->get('status') == '1') {
            $users->where('status', $this->request()->get('status'));
        }
       // $users->orderBy('created_at','DESC')             
       $users->get();

       return $this->applyScopes($users);

    }

    /**
     * Optional method if you want to use html builder.
     *
     * @return \Yajra\DataTables\Html\Builder
     */
    public function html()
    {
        return $this->builder()
                
                    ->columns($this->getColumns())
                    ->minifiedAjax()
                    ->addAction(['width' => '10%'])
                    ->addCheckbox(['width'=> '10px'],true)
                    ->parameters($this->getBuilderParameters())
                    ->parameters([
                        'order' => [
                            5, // here is the column number
                            'desc'
                        ],
                        'scrollX' => true,
                        'extend'  => 'collection',
                        'text'    => 'Export',
                        'dom'     => 'Bfrtipl',
                        // 'buttons' =>  ['csv', 'excel', 'pdf' , 'print'],
                        'initComplete' => "function () {
                            this.api().columns().every(function () {
                                var column = this;
                                var input = document.createElement(\"input\");
                                $(input).appendTo($(column.footer()).empty())
                                .on('change', function () {
                                    column.search($(this).val(), false, false, true).draw();
                                });
                            });
                        }",
                    ]);
    }

    /**
     * Get columns.
     *
     * @return array
     */
    protected function getColumns()
    {
        return [
            'DT_RowIndex'=>['width'=>'10px','title'=>'S.No','searchable'=>false,'orderable'=>false],
            'name',
            'email',
            'status',
            'created_at'
        ];
    }

    /**
     * Get filename for export.
     *
     * @return string
     */
    protected function filename()
    {
        return 'Users_' . date('YmdHis');
    }
}

下面是我添加条件的操作视图。

usersaction.blade.php

@can('View User')
  <a href="javascript:void(0);" data-user_id="{{ encrypt($user->id) }}" class="btn btn-sm btn-default viewUser"><i class="fa fa-eye"></i></a>
@endcan

@can('Edit User')
  <a href="{!! url('admin/editUser/'.encrypt($user->id)) !!}" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i></a>
@endcan

@can('Delete User')
  <a href="javascript:void(0);" data-user_id="{{ encrypt($user->id) }}" class="btn btn-sm btn-danger deleteUser"><i class="fa fa-trash"></i></a>
@endcan

这里的View User , Edit User , Delete User是 laravel spatie 权限包创建的权限。它工作正常,但问题是在数据表视图中,操作列向左移动,右侧留下了太多空白:

在此处输入图像描述

我尝试了另一种方式,如下所示

->addColumn('action', function(User $user){
                $actionBtn='';
                if(Auth::user()->can('View User')){
                    $actionBtn .= '<a href="javascript:void(0);" data-user_id="'.encrypt($user->id).'" class="btn btn-sm btn-default viewUser"><i class="fa fa-eye"></i></a>';
                }
                if(Auth::user()->can('Edit User')){
                    $actionBtn .= '<a href="'.url('admin/editUser/'.encrypt($user->id)).'" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i></a>';
                }
                if(Auth::user()->can('Delete User')){
                    $actionBtn .= '<a href="javascript:void(0);" data-user_id="'.encrypt($user->id).'" class="btn btn-sm btn-danger deleteUser"><i class="fa fa-trash"></i></a>';
                }  
                return $actionBtn;
            })

但我得到相同的结果。我怎样才能解决这个问题?

4

1 回答 1

0
$action = "";
if(Auth::user()->can('floor-edit')){
        $action .= '<a class="btn btn-info  btn-sm" href="'.route("floor.edit",Crypt::encrypt($floor->id)).'"><i class="fa fa-edit"></i></a>';
}

if(Auth::user()->can('floor-delete')){
    $action .= '  <button type="button" name="delete" id="'.Crypt::encrypt($floor->id).'" class="delete btn btn-danger btn-sm"><i class="fa fa-trash"></i></button>';
}

它对我有用

于 2020-01-29T04:32:30.737 回答