dcat表格批量操作弹窗表单,将选中的ids传给form

工具表单《Dcat Admin 中文文档》

dcat表格批量操作弹窗表单,将选中的ids传给form

dcat表格批量操作弹窗表单,将选中的ids传给form

文档中通过 Modal 的 onLoad,在里面用 getSelectedKeysScript 获取到 ids,然后 js 赋值给 form 的 ids 隐藏域,此时 form 已经渲染完成了,如果要根据 ids,给 form 填充数据,例如填充订单合计金额,就需要在渲染之前,把 ids 传过去。

dcat表格批量操作弹窗表单,将选中的ids传给form

点击按钮,首先浏览器的网络,会发起 http://xxx.com/admin/dcat-api/render?.... 的请求,响应内容就是表单的 html,它会触发对应的 Renderable 类的 render 方法,也就是 modal->body ($form) 的中 $form 的 render,然后里面再调用 prepareForm,最后再调用我们定义的工具表单类的 form。

想办法在此之前,给这个 render 请求的 url 拼接上 ids 参数,就可以在 form 中获取到选中的 key。

查看 Modal 的 render

  public function render()
    {
        $this->addLoadRenderableScript();
        $this->addScript();

        if ($this->join) {
            return $this->renderButton().parent::render();
        }

        Admin::html(parent::render());

        return $this->renderButton();
    }

跟踪 addScript,里面调用 getRenderableScript

    protected function getRenderableScript()
    {
        if (! $this->getRenderable()) {
            return;
        }

        $url = $this->renderable->getUrl();

        return <<<JS
target.on('{$this->target}:load', function () {
    Dcat.helpers.asyncRender('{$url}', function (html) {
        body.html(html);

        {$this->loadScript}

        target.trigger('{$this->target}:loaded');
    });
});
JS;
    }

其中 $url = $this->renderable->getUrl(); 就是开头说的 render 请求 url,然后我们要用 getSelectedKeysScript 获取到 ids 拼接到后面

    public function getSelectedKeysScript()
    {
        return "Dcat.grid.selected('{$this->parent->getName()}')";
    }

调试时发现,如果页面只有一个 grid 并且没有调用 setName,那么 {$this->parent->getName()} 为空字符串,于是直接调用 Dcat.grid.selected('') 就可以获取到选中的 ids。

最后,创建一个 BatchActionModal 用来重写 getRenderableScript 方法,然后用这个代替原先的 Modal

<?php
/**
 * Desc: 重写modal,以实现获取选中的id数组
 */

namespace App\Admin\Renderable;

use Dcat\Admin\Widgets\Modal;

class BatchActionModal extends Modal {


    protected function getRenderableScript() {
        if (!$this->getRenderable()) {
            return;
        }

        $url = $this->renderable->getUrl();

        return <<<JS


target.on('{$this->target}:load', function () {

    var key = Dcat.grid.selected('')

    Dcat.helpers.asyncRender('{$url}&ids='+key, function (html) {
        body.html(html);

        {$this->loadScript}

        target.trigger('{$this->target}:loaded');
    });
});
JS;
    }
}

使用:

<?php

namespace App\Admin\Actions\Grid\BatchAction;

use App\Admin\Actions\Grid\BatchAction\Forms\BatchEditCompanyForm;
use Dcat\Admin\Admin;
use Dcat\Admin\Grid\BatchAction;
// 注意这里换成修改过的Modal
use App\Admin\Renderable\BatchActionModal as Modal;

class BatchEditCompany extends BatchAction {
    protected $title = '批量修改状态';

    public function render() {

        $form = BatchEditCompanyForm::make();

        return Modal::make($this)
                    ->lg()
                    ->title($this->title)
                    ->body($form)
                    ->button($this->title);
    }

form 中用 request 取出 ids

<?php
namespace App\Admin\Actions\Grid\BatchAction\Forms;

use Dcat\Admin\Contracts\LazyRenderable;
use Dcat\Admin\Traits\LazyWidget;
use Dcat\Admin\Widgets\Form;

class BatchEditCompanyForm extends Form implements LazyRenderable
{
    use LazyWidget;

    public function form() {
        dd(request('ids')); // 1,3,11
        // 这个是用文档中onLoad设置的方法
        // 此时已经提前拿到ids,可以不用onLoad了,用value($ids)就可以在提交时传给handle
        $this->hidden('ids')->attribute('id', 'ids')->value(request('ids')); 
        $this->radio('status', '状态')->options(Company::StatusOptions);
    }


    // 处理请求
    public function handle(array $input) {
        //...
    }


}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。