Closed metanoia1989 closed 4 years ago
不支持laravel-admin的用法,动作和工具表单类是分开的,拆开了更灵活,你可以自己稍微封装下
不支持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。不仅提示类型有成功、失败、警告,还能进行页面刷新。相比之下,工具表单类的响应方式差好远。
能贴完整表单以及使用的代码吗?滚动条消失我没遇到过。
另外工具表单的响应是非常强大的,可以刷新页面、失败警告,还可以自定义保存成功后续执行的js
代码。
其实就是从文档中代码拿过来的。
// 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">×</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());
}
});
完整的 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;
}
找到原因了,确实有点问题,改成这样就好了,我调整下文档
// 刷新页面时移除模态窗遮罩层
Admin::script('Dcat.onPjaxComplete(function () {
$(".modal-backdrop").remove();
$("body").removeClass("modal-open");
}, true)');
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这样使用起来非常便捷,我定义的动作中不少都是需要表单的,=_= 单独创建类,要新建不少文件。
dcat-admin 有什么好的办法吗,一定要创建工具表单类吗。