jqhph / dcat-admin

🔥 基于 Laravel 的后台系统构建工具 (Laravel Admin),使用很少的代码快速构建一个功能完善的高颜值后台系统,内置丰富的后台常用组件,开箱即用,让开发者告别冗杂的HTML代码
http://www.dcatadmin.com
MIT License
3.87k stars 699 forks source link

请问动作(action)可以不创建工具表单类直接创建表单吗? #183

Closed metanoia1989 closed 4 years ago

metanoia1989 commented 4 years ago

Description:

在laravel-admin中的动作Action中是可以直接重写form()方法,创建弹出表单,非常方便,不用单独创建类。 laravel-admin 弹出表单:https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E5%BC%B9%E5%87%BA%E8%A1%A8%E5%8D%95

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

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

这样使用起来非常便捷,我定义的动作中不少都是需要表单的,=_= 单独创建类,要新建不少文件。

dcat-admin 有什么好的办法吗,一定要创建工具表单类吗。

jqhph commented 4 years ago

不支持laravel-admin的用法,动作和工具表单类是分开的,拆开了更灵活,你可以自己稍微封装下

metanoia1989 commented 4 years ago

不支持laravel-admin的用法,动作和工具表单类是分开的,拆开了更灵活,你可以自己稍微封装下

分开虽然要多写一个文件,但是能解决问题就可以。

我遇到一个问题是工具表单类结合Action使用,在handle方法里使用 $this->success 响应成功提示,页面的垂直滚动条消失了,无法进行滚动。

下面的代码是直接从文档中拿的 http://www.dcatadmin.com/docs/master/widgets-form.html

// 工具表单类方法
    public function handle(array $input)
    {
        // dump($input);

        // return $this->error('Your error message.');

        return $this->success('Processed successfully.');   // 不传递第二个跳转地址参数
    }

在动作action中,handle()方法可以访问到响应对象Response。不仅提示类型有成功、失败、警告,还能进行页面刷新。相比之下,工具表单类的响应方式差好远。

jqhph commented 4 years ago

能贴完整表单以及使用的代码吗?滚动条消失我没遇到过。

另外工具表单的响应是非常强大的,可以刷新页面、失败警告,还可以自定义保存成功后续执行的js代码。

metanoia1989 commented 4 years ago

其实就是从文档中代码拿过来的。

// app\Admin\Forms\TestModelForm.php
namespace App\Admin\Forms;

use Dcat\Admin\Widgets\Form;
use Symfony\Component\HttpFoundation\Response;

class TestModelForm extends Form
{
    /**
     * Handle the form request.
     *
     * @param array $input
     *
     * @return Response
     */
    public function handle(array $input)
    {
        // dump($input);

        // return $this->error('Your error message.');

        return $this->success('Processed successfully.');
    }

    /**
     * Build a form here.
     */
    public function form()
    {
        $this->text('name');
        $this->email('email')->rules('email');
    }

    /**
     * The data of the form.
     *
     * @return array
     */
    public function default()
    {
        return [
            'name'  => 'John Doe',
            'email' => 'John.Doe@gmail.com',
        ];
    }
}

// app\Admin\Actions\Post\TestModal.php
namespace App\Admin\Actions\Post;

use App\Admin\Forms\TestModelForm;
use Dcat\Admin\Admin;
use Dcat\Admin\Grid\RowAction;

class TestModal extends RowAction
{
    /**
     * @return string
     */
    protected $title = '设置密码';

    public function render()
    {
        $id = "reset-pwd-{$this->getKey()}";

        // 模态窗
        $this->modal($id);

        return <<<HTML
<span class="grid-expand" data-toggle="modal" data-target="#{$id}">
   <a href="javascript:void(0)">修改密码</a>
</span>
HTML;
    }

    protected function modal($id)
    {
        // 工具表单
        $form = new TestModelForm($this->getKey());

        // 在弹窗标题处显示当前行的用户名
        $username = "";

        // 刷新页面时移除模态窗遮罩层
        Admin::script('Dcat.onPjaxComplete(function () {
            $(".modal-backdrop").remove();
        }, true)');

        // 通过 Admin::html 方法设置模态窗HTML
        Admin::html(
            <<<HTML
<div class="modal fade" id="{$id}">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title">修改密码 - {$username}</h4>
         <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      </div>
      <div class="modal-body">
        {$form->render()}
      </div>
    </div>
  </div>
</div>
HTML
        );
    }
}

下面是控制器的代码

// app\Admin\Controllers\StudentController.php
        $grid->tools(function (Grid\Tools $tools) {
            if(Admin::user()->isRole('academic teacher')){
                $tools->append(new SummaryPost()); // 批量更新按钮
            }
            if (Admin::user()->isRole('enrolment teacher') || Admin::user()->isRole('academic teacher') || Admin::user()->isRole('administrator')){
                $tools->append(new StudentPost()); // 初始化导入模板下载以及初始化批量导入
                $tools->append(new TestModal());
            }
        });
metanoia1989 commented 4 years ago

完整的 grid 代码如下:

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(Student::with(['clazz', 'lecturer', 'invoice', 'examtest']));

        // if (Admin::user()->isRole('Teaching teache')){
        //     $grid->fixColumns(6,0);
        // }else{
        //     $grid->fixColumns(6,-1);
        // }
        if(Admin::user()->isRole('enrolment teacher')){
            $grid->model()->where('recruiter',Admin::user()->name);
        }elseif (Admin::user()->isRole('Teaching teache')){
            $clazz = new  Clazz();
            $data = $clazz->where('lecturer',Admin::user()->name)->pluck('id');
            $grid->model()->whereIn('clazz_id', $data);
        }
        $grid->model()->orderBy('created_at', 'desc');
        $xz[0] = ['未收齐' => '未收齐', '收齐' => '收齐'];
        $xz[1] = ['未收齐' => '未收齐', '需制作' => '需制作','已制作' => '已制作', '收齐' => '收齐'];
        $xz[2] = ['未制作' => '未制作','已制作' => '已制作', '未寄' => '未寄', '已寄' => '已寄'];
        $xz[3] = ['否' => '否', '是' => '是'];
        $grid->column('id', __('Id'));
        $grid->column('lecturer.lecturer', __('lecturer'));
        $grid->column('clazz.name', __('Clazz Name'));
        $grid->column('recruiter', __('Recruiter'));
        $grid->column('student_name', __('Student name'));
        $grid->column('sex', __('Sex'));
        if (!Admin::user()->isRole('Teaching teache')) {
            $grid->column('identity_card', __('Identity card'));
        }
        $grid->column('culture', __('Culture'));
        if (!Admin::user()->isRole('Teaching teache')) {
            $grid->column('student_phone', __('Student phone'));
        }
        $grid->column('company_name', __('Company name'));
        if (!Admin::user()->isRole('Teaching teache')) {
            $grid->column('birthday', __('Birthday'));
            $grid->column('cjgzsj', __('Cjgzsj'));
            $grid->column('grgzjl', __('Grgzjl'));
        }
        $grid->column('xzgrade', __('Xzgrade'));
        if (!Admin::user()->isRole('Teaching teache')) {
            $grid->column('position', __('Position'));
            $grid->column('company_contact_name', __('Company contact name'));
        }
        if(Admin::user()->isRole('academic teacher')){
            $grid->column('examtest.ticket_number', __('Ticket number'))->editable();
            $grid->column('examtest.supplementary_number', __('Supplementary number'))->editable();

            $grid->column('examtest.payment_details', __('Payment details'))->help('属于补考缴费情况')->editable();
            $grid->column('examtest.examination_date', __('Examination date'))->help('属于补考缴费情况')->editable();
            $grid->column('examtest.supplementary_payment', __('Supplementary payment'))->help('属于补考缴费情况')->editable();
            $grid->column('examtest.supplementary_plan', __('Supplementary plan'))->help('属于补考缴费情况')->editable();
            $grid->column('examtest.remark', __('Remark'))->editable();
            $grid->column('examtest.capplicants', __('Capplicants'))->editable();

            $grid->column('examtest.ll_score', __('Ll score'))->editable();
            $grid->column('examtest.ll_status', __('Ll status'))->editable();
            $grid->column('examtest.ll_time', __('Ll time'))->editable();
            // $grid->column('examtest.llbk_cost', __('Llbk cost'))->editable(); // 理论补考费用
            $grid->column('examtest.llbk_score', __('Llbk score'))->editable();
            $grid->column('examtest.llbk_status', __('Llbk status'))->editable();
            $grid->column('examtest.llbk_time', __('Llbk time'))->editable();
            $grid->column('examtest.sc_score', __('Sc score'))->editable();
            $grid->column('examtest.sc_status', __('Sc status'))->editable();
            $grid->column('examtest.sc_time', __('Sc time'))->editable();
            $grid->column('examtest.a_ets', __('A ets'))->editable();
            $grid->column('examtest.the_ets', __('The ets'))->editable();
            $grid->column('examtest.three_ets', __('Three ets'))->editable();
            $grid->column('examtest.four_ets', __('Four ets'))->editable();

            // $grid->column('examtest.scbk_cost', __('Scbk cost'))->editable(); // 实操补考费用
            $grid->column('examtest.scbk_score', __('Scbk score'))->editable();
            $grid->column('examtest.scbk_status', __('Scbk status'))->editable();
            $grid->column('examtest.scbk_time', __('Scbk time'))->editable();
            $grid->column('examtest.scbk_sbrq', __('Scbk sbrq'))->editable();

            $grid->column('graduation_bh', __('Graduation bh'))->editable();
            $grid->column('test_hgpc', __('Test hgpc'))->editable();
            $grid->column('zyzsbh', __('Zyzsbh'))->editable();
        }else{
            $grid->column('examtest.ticket_number', __('Ticket number'));
            $grid->column('examtest.supplementary_number', __('Supplementary number'));

            $grid->column('examtest.payment_details', __('Payment details'))->help('属于补考缴费情况');
            $grid->column('examtest.examination_date', __('Examination date'))->help('属于补考缴费情况');
            $grid->column('examtest.supplementary_payment', __('Supplementary payment'))->help('属于补考缴费情况');
            $grid->column('examtest.supplementary_plan', __('Supplementary plan'))->help('属于补考缴费情况');
            $grid->column('examtest.remark', __('Remark'));
            $grid->column('examtest.capplicants', __('Capplicants'));

            $grid->column('examtest.ll_score', __('Ll score'));
            $grid->column('examtest.ll_status', __('Ll status'));
            $grid->column('examtest.ll_time', __('Ll time'));
            // $grid->column('examtest.llbk_cost', __('Llbk cost')); // 理论补考费费用
            $grid->column('examtest.llbk_score', __('Llbk score'));
            $grid->column('examtest.llbk_status', __('Llbk status'));
            $grid->column('examtest.llbk_time', __('Llbk time'));
            $grid->column('examtest.sc_score', __('Sc score'));
            $grid->column('examtest.sc_status', __('Sc status'));
            $grid->column('examtest.sc_time', __('Sc time'));
            $grid->column('examtest.a_ets', __('A ets'));
            $grid->column('examtest.the_ets', __('The ets'));
            $grid->column('examtest.three_ets', __('Three ets'));
            $grid->column('examtest.four_ets', __('Four ets'));

            // $grid->column('examtest.scbk_cost', __('Scbk cost')); // 实操补考费用
            $grid->column('examtest.scbk_score', __('Scbk score'));
            $grid->column('examtest.scbk_status', __('Scbk status'));
            $grid->column('examtest.scbk_time', __('Scbk time'));
            $grid->column('examtest.scbk_sbrq', __('Scbk sbrq'));

            $grid->column('graduation_bh', __('Graduation bh'));
            $grid->column('test_hgpc', __('Test hgpc'));
            $grid->column('zyzsbh', __('Zyzsbh'));
        }

        $grid->column('project', __('Project'))->hide();
        $grid->column('recipients_phone', __('Recipients phone'))->hide();
        $grid->column('consignee_address', __('Consignee address'))->hide();

        $grid->column('created_by', __('Created by'))->hide();
        $grid->column('updated_by', __('Updated by'))->hide();
        $grid->column('created_at', __('Created at'))->hide();
        $grid->column('updated_at', __('Updated at'))->hide();

        //禁用查询过滤器
        $grid->disableFilter(false);
        //行选择checkbox
        $grid->disableRowSelector(false);
        //行选择器
        // $grid->disableColumnSelector(false);
        //查询过滤器
        // $grid->disableTools(false);
        //默认展开搜索
        $grid->filter(function($filter) use ($xz){
            //软删除的回收站数据
            $filter->scope('trashed', '回收站')->onlyTrashed();
            //删除默认id筛选
            $filter->disableIdFilter();
            $filter->equal('clazz_id',__('Clazz Name'))->select(\App\Clazz::all()->pluck('name', 'id'));
            $filter->equal('data_sent',__('Data sent'))->radio($xz[3]);
            $filter->equal('paper_photo', __('Paper photo'))->radio($xz[0]);
            $filter->equal('work_proof', __('Work proof'))->radio($xz[1]);
            $filter->equal('education', __('Education'))->radio($xz[0]);
            $filter->equal('electronic_photo', __('Electronic photo'))->radio($xz[0]);
            $filter->equal('social_data', __('Social data'))->radio($xz[1]);
            $filter->where('id_card_and_name', function ($query) {
                $query->where('student_name', 'like', "%{$this->input}%")
                    ->orWhere('student_phone', 'like', "%{$this->input}%")
                    ->orWhere('identity_card', 'like', "%{$this->input}%");
            }, '姓名、电话、身份证号码');
            $grades = ClazzGrade::all()->pluck('name', 'name');
            $filter->equal('xzgrade','等级')->select($grades);
            $filter->equal('graduation_status', __('Graduation status'))->radio($xz[2]);
            $filter->equal('billing_type', __('Billing type'))->radio(['普票' => '普票', '专票' => '专票']);
            $filter->equal('review', __('Review'))->radio(['未收款' => '未收款', '已收款' => '已收款']);
            $filter->equal('invoice_information', __('Invoice information'))->radio(['未提供' => '未提供', '已提供' => '已提供']);
            $filter->equal('invoicing_situation', __('Invoicing situation'))->radio(['未开' => '未开', '已开' => '已开']);
        });

        if (Admin::user()->isRole('Teaching teache')){
            $grid->disableCreateButton();
            $grid->disableRowSelector();
            $grid->disableActions();
        }
        //导入
        $grid->tools(function (Grid\Tools $tools) {
            if(Admin::user()->isRole('academic teacher')){
                $tools->append(new SummaryPost()); // 批量更新按钮
            }
            if (Admin::user()->isRole('enrolment teacher') || Admin::user()->isRole('academic teacher') || Admin::user()->isRole('administrator')){
                $tools->append(new StudentPost()); // 初始化导入模板下载以及初始化批量导入
                $tools->append(new TestModal());
                // $tools->append(new StudentRecordsPost()); // 历史学员数据导入
            }
        });

        //导出数据按钮
        $grid->export(new StudentExportcs());
        if (\request('_scope_') == 'trashed') {
            //回收站恢复
            $grid->actions([new Restore()]);
        }else{
            //数据开通
            $grid->actions([new Operation()]);
        }
        // $grid->actions(function (Grid\Displayers\Actions $actions) {
        //     if (\request('_scope_') == 'trashed') {
        //         //回收站恢复
        //         $actions->append(new Restore());
        //     }else{
        //         //数据开通
        //         $actions->append(new Operation);
        //     }
        // });

        //回收站批量恢复
        $grid->batchActions(function ($batch) {
            if (\request('_scope_') == 'trashed') {
                $batch->add(new BatchRestore("批量恢复"));
            }
            $batch->add(new Studentedit("批量编辑"));

            // 超级管理员开启删除功能
            if (Admin::user()->isRole('administrator')) {
                $batch->disableDelete(false);
            }
        });

        // 右键显示下拉菜单
        $grid->setActionClass(ContextMenuActions::class);

        // 快捷搜索
        $grid->quickSearch('student_name', 'company_name', 'student_phone', 'identity_card');

        return $grid;
    }
jqhph commented 4 years ago

找到原因了,确实有点问题,改成这样就好了,我调整下文档

// 刷新页面时移除模态窗遮罩层
Admin::script('Dcat.onPjaxComplete(function () {
    $(".modal-backdrop").remove();
    $("body").removeClass("modal-open");
 }, true)');