Laravel-Admin 自定义操作按钮大全

施俊明
2023-12-01

Laravel-Admin 自定义操作按钮大全(表格工具区域、行内操作按钮)

一、行内操作按钮

1、单行操作

行内操作按钮-单行操作共需要三步:

  • 生成操作类
  • 编辑操作类
  • 加入到表格

生成操作类

php atisan admin:action Copy --grid-row --name="复制"

编辑操作类

<?php

namespace App\Admin\Actions;

use Encore\Admin\Actions\RowAction;
use Illuminate\Database\Eloquent\Model;

class Copy extends RowAction
{
    public $name = '复制';

    public function handle(Model $model)
    {
        //直接调用模型的方法复制保存即可
        $model->replicate()->save();
        
        return $this->response()->success('复制成功.')->refresh();
    }
    
    //可以增加一个dialog()来进行互动
    public function dialog()
    {
        $this->confirm('确定复制?');
    }

}


如果需要弹出框,可以增加一个form方法来进行弹出框的创建

<?php

namespace App\Admin\Actions;

use Encore\Admin\Actions\RowAction;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;

class AddStock extends RowAction
{
    public $name = '增加库存';

    public function handle(Model $model, Request $request)
    {
        try {
            //使用request 来获取form 提交的数据
            $stock = $request->get('stock');
            
            //$model 是当前行的数据,可以直接进行操作
            $model->stock = $stock;
            $model->save;

            return $this->response()->success('库存增加成功')->refresh();
        } catch (\Exception $e) {   
            return $this->response()->error('产生错误:' . $e->getMessage());
        }
    }
    
    //增加一个弹出框,使得可以进行表单提交
    public function form()
    {
        $this->text('stock', '增加的库存')->rules('required');
    }
    
    //可以增加一个dialog()来进行互动
    public function dialog()
    {
        $this->confirm('确定复制?');
    }

}


添加到表格

<?php

namespace App\Admin\Controllers;

use App\Admin\Actions\Copy;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;

class UsersController extends AdminController
{
    protected function grid()
    {
        $grid = new Grid(new Goods());

        //$grid->column('id', 'id')...
        

        $grid->actions(function ($actions) {
            //use 刚才编辑好的操作类,直接new 出来就可以用了
            $actions->add(new AddStock());
        });
        
        return $grid;
    }

}


2、批量操作

行内操作按钮-单行操作共需要三步:

  • 生成操作类
  • 编辑操作类
  • 加入到表格

生成操作类

php atisan admin:action Copys --grid-batch --name="批量复制"

编辑操作类

<?php

namespace App\Admin\Actions;

use Encore\Admin\Actions\BatchAction;
use Illuminate\Database\Eloquent\Collection;

class Copys extends BatchAction
{
    public $name = '批量复制';

    public function handle(Collection $collection)
    {
        foreach ($collection as $model) {
            $model->replicate()->save();
        }

        return $this->response()->success('批量复制成功')->refresh();
    }

}


添加到表格

<?php

namespace App\Admin\Controllers;

use App\Admin\Actions\Copys;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;

class UsersController extends AdminController
{
    protected function grid()
    {
        $grid = new Grid(new Goods());

        //$grid->column('id', 'id')...
        
        //添加到批量操作中
        $grid->batchActions(function ($batch) {
    		$batch->add(new Copys());
		});
        
        return $grid;
    }

}


也可以将批量操作放到表格工具区域,只需要稍微修改一下即可:
操作类:

<?php

namespace App\Admin\Actions;

use Encore\Admin\Actions\BatchAction;
use Illuminate\Database\Eloquent\Collection;

class Copys extends BatchAction
{
    //$selector 的值对应html()内的CSS选择器
    protected $selector = '.report-posts';

    public function handle(Collection $collection)
    {
        foreach ($collection as $model) {
            $model->replicate()->save();
        }

        return $this->response()->success('批量复制成功')->refresh();
    }
    
    //在表格工具区域添加一个按钮
    public function html()
    {
        return "<a class='report-posts btn btn-sm btn-danger'><i class='fa fa-info-circle'></i>批量复制</a>";
    }

}


列表:

<?php

namespace App\Admin\Controllers;

use App\Admin\Actions\Copys;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;

class UsersController extends AdminController
{
    protected function grid()
    {
        $grid = new Grid(new Goods());

        //$grid->column('id', 'id')...
        
        //注意需要添加到表格工具条中,不是之前的行内操作了
        $grid->tools(function (Grid\Tools $tools) {
    		$tools->append(new Copys());
		});
        
        return $grid;
    }

}


3、跳转到其他页面

行内操作按钮-单行操作共需要三步:

  • 生成操作类
  • 编辑操作类
  • 加入到表格

生成操作类

php atisan admin:action JumpInfo --grid-row --name="用户信息"

编辑操作类

<?php

namespace App\Admin\Actions;

use Encore\Admin\Actions\RowAction;
use Illuminate\Database\Eloquent\Model;

class JumpInfo extends RowAction
{
    public $name = '用户信息';

    //直接用href()即可,$this->getResource(),获取当前的资源根路径,可以用$this->getKey()获取当前行的主键值
    public function href()
    {
       return "/admin/info?user_id=".$this->getKey();
    }

}


添加到表格

<?php

namespace App\Admin\Controllers;

use App\Admin\Actions\JumpInfo;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;

class UsersController extends AdminController
{
    protected function grid()
    {
        $grid = new Grid(new Goods());

        //$grid->column('id', 'id')...
        

        $grid->actions(function ($actions) {
            //use 刚才编辑好的操作类,直接new 出来就可以用了
            $actions->add(new JumpInfo());
        });
        
        return $grid;
    }

}


二、表格工具区域

表格工具区域自定义工具共需要三步:

  • 生成操作类
  • 编辑操作类
  • 加入到表格

生成操作类

php atisan admin:action Import --name="导入数据"

编辑操作类

<?php

namespace App\Admin\Actions;

use Encore\Admin\Actions\RowAction;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Database\Eloquent\Model;

class Import extends RowAction
{
    protected $selector = '.import';

    public function handle(Request $request)
    {
        //用request 获取到上传的文件        
        $data = Excel::toCollection(new ImportOrders(), $request->file('file'));
        //单行处理
        $data = $data->first();
        //过滤掉不需要的值
        $data = $data->filter(function ($item, $key) {
            return [$item[0], $item[1]];
        });

        foreach ($data as $item) {
            
            //处理数据...
            
        }

        return $this->response()->success('导入完成!')->refresh();
    }
    
    public function form()
    {
        $this->file('file', '请选择文件');
    }

    public function html()
    {
        return <<<HTML
        <a class="btn btn-sm btn-default import">导入数据</a>
HTML;
    }

}


添加到表格

<?php

namespace App\Admin\Controllers;

use App\Admin\Actions\Import;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;

class UsersController extends AdminController
{
    protected function grid()
    {
        $grid = new Grid(new Goods());

        //$grid->column('id', 'id')...
        

        $grid->tools(function (Grid\Tools $tools) {
    		$tools->append(new Import());
		});
        
        return $grid;
    }

}


三、返回数据

当处理完逻辑之后,需要返回提示或者下载文件:

返回成功提示:

return $this->response()->success('成功...');

返回失败提示 :

return $this->response()->error('错误...');

返回提示信息:

return $this->response()->info('提示信息...');

返回警告信息:

return $this->response()->warning('警告信息...');

返回之后刷新页面:

return $this->response()->success('Success!')->refresh();

返回之后跳转到其它页面:

return $this->response()->success('Success!')->redirect('/admin/users');

返回之后下载文件:

return $this->response()->success('Success!')->download('http://www.xxx.com/file.zip');

控制提示信息的显示位置、时间:
显示位置的控制方法有topCenter, topLeft, topRight, bottomLeft, bottomCenter, bottomRight, topFullWidth, bottomFullWidth。

// 显示在顶部右边,更换显示位置按照下面的格式即可
return $this->response()->topRight()->success('Success!')->refresh();

提示信息默认显示5秒后自动消失,可以通过timeout方法控制消失时间:

// 3秒之后消失,单位是毫秒
return $this->response()->success('Success!')->timeout(3000)->refresh();

 类似资料: