laravel-admin 批量操作功能问题

官方手册描述是 新创建一个操作类,如下:


namespace App\Admin\Actions\Post;

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

class Report extends RowAction
{
    public $name = '举报';

    public function handle(Model $model, Request $request)
    {
        // $model ...

        return $this->response()->success('Success message.')->refresh();
    }

    public function form()
    {
        $type = [
            1 => '广告',
            2 => '违法',
        ];
        $this->checkbox('type', '类型')->options($type);
        $this->textarea('reason', '原因');
    }
}

需要弹出框的,在操作类中添加方法:

public function form()
{
    $type = [
        1 => '广告',
        2 => '违法',
        3 => '钓鱼',
    ];

    $this->checkbox('type', '类型')->options($type);
    $this->textarea('reason', '原因')->rules('required');
}

点击操作的时候,就会弹出一个form表单:

laravel-admin 批量操作功能问题

handle方法中,我们要增加第二个参数来获取表单值:

use Illuminate\Http\Request;

public function handle(Model $model, Request $request)
{
    // 获取到表单中的`type`值
    $request->get('type');

    // 获取表单中的`reason`值
    $request->get('reason');

    // 你的举报逻辑...

    return $this->response()->success('举报已提交')->refresh();
}

问题是,这里只能在handle中获取值,而我需要在form()方法中获取我批量选择的id值,这里应该怎么获取呢? 尝试了在form()里加参数,例如 form(Model $model) ,这样的都直接报错:ArgumentCountError Too few arguments to function App\Admin\Actions\Post\CreateBuyList::form(), 0 passed and exactly 1 expected (View: D:\laragon\www\IMSys\vendor\encore\laravel-admin\resources\views\grid\table.blade.php)

请教大神,这个问题应该怎么解决?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

遗憾的是官方未能提供此方法,可以考虑自己做一个按钮,使用 $.admin.grid.getSelection(); 获取选中值,再根据业务逻辑生成表单

2年前 评论
acvc225 (楼主) 2年前
讨论数量: 2

遗憾的是官方未能提供此方法,可以考虑自己做一个按钮,使用 $.admin.grid.getSelection(); 获取选中值,再根据业务逻辑生成表单

2年前 评论
acvc225 (楼主) 2年前

琢磨了一个替代方案:参考官方文档 自定义工具–批量操作,创建一个批量操作工具类,然后再工具类中,添加ajax代码,用户获取自定义视图view,在视图中添加自己需要的form表单。具体如下:

1、参考官方文档创建 ReleasePost() 操作类
file
2、在model-grid中加入这个批量操作功能
file
file
3、修改 ReleasePost() 操作类的 script() 方法,通过ajax将获取的data数据展示在 #pjax-container 容器中。

    public function script()
    {
        return <<<EOT

$('{$this->getElementClass()}').on('click', function() {

    $.ajax({
        method: 'post',
        url: '{$this->resource}/add',
        data: {
            _token:LA.token,
            ids: $.admin.grid.selected(),
            action: {$this->action}
        },
        success: function (data) {
            console.log(data);
            $('#pjax-container').html(data);
            // $.pjax.reload('#pjax-container');
            // toastr.success('操作成功');
        }
    });
});

EOT;

    }

暂时只能想到这个办法勉强可行

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!