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();
|