在传统的Laravel后台管理页面的开发中,一般都会包含列表页面,新建页面,编辑页面,详情页面,以及相应的对保存,更新,删除等请求的处理。

在类Restful的风格下,我们一般都会这么做:Controller中包含

PHP

public function index(){}

public function create(){}

public function store(Request $request){}

public function edit($id){}

public function update(Request $request, $id){}

public function destroy($id){}

1

2

3

4

5

6

publicfunctionindex(){}

publicfunctioncreate(){}

publicfunctionstore(Request$request){}

publicfunctionedit($id){}

publicfunctionupdate(Request$request,$id){}

publicfunctiondestroy($id){}

然后相应的创建

index.blade.php, show.blade.php, create.blade.php,edit.blade.php。

在实际使用中会遇到如下的问题:

从列表页跳转至编辑页面,保存后返回列表页,无法记住之前列表的查询参数

返回列表页 不能记住滚动条的位置

通过Flash包显示消息后,默认应该只显示一次,但是点击浏览器返回,仍然会显示

页面之间都是通过页面跳转的方式,用户体验不佳

所以我们尝试使用IFrame的方式来改进上述问题,同时避免引入过多js代码,方便于后端开发人员

项目位于:http://git.bulo.cn:3000/lxr/laravel-iframe

主要代码:

弹出层使用layui的layer,对IFrame的支持较好 文档:https://www.layui.com/doc/modules/layer.html

后台的css框架基于AdminLTE https://adminlte.io

用户提示使用laracasts/flash

主要布局分为2个: main.blade.php 和 layer.balde.php 其中main.balde.php和之前的一样 ,layer.blalde.php 用于弹出层

main.blade.php中的关键JS代码如下,用于显示操作完成后的消息通知。

JavaScript

// 在父页面显示通知消息,供IFrame层调用

function layerNotify(params) {

$.notify(params);

}

@foreach (session('flash_notification', collect())->toArray() as $message)

$.notify({

message: '{{ $message['message'] }}'

},{

type: 'success',

delay: 3000,

timer: 500,

placement: {

from: "top",

align: "center"

},

});

@endforeach

{{ session()->forget('flash_notification') }}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 在父页面显示通知消息,供IFrame层调用

functionlayerNotify(params){

$.notify(params);

}

@foreach(session('flash_notification',collect())->toArray()as$message)

$.notify({

message:'{{ $message['message'] }}'

},{

type:'success',

delay:3000,

timer:500,

placement:{

from:"top",

align:"center"

},

});

@endforeach

{{session()->forget('flash_notification')}}

列表页的JS代码,用于打开弹出层,关键代码在yes回调,在点击弹出层的确定按钮后,获取iframe页的表单,然后提交

JavaScript

$('.btn-create, .btn-edit').on('click', function (e) {

e.preventDefault();

var page = $(this).attr('href');

layer.open({

title: $(this).data('title') ? $(this).data('title') : '页面标题',

area: ['500px', '60%'],

type: 2,

btn: ['确定', '取消'],

content: page,

yes: function (index, layero) {

var iframeWin = window[layero.find('iframe')[0]['name']];

iframeWin.submit();

},

});

});

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

$('.btn-create, .btn-edit').on('click',function(e){

e.preventDefault();

varpage=$(this).attr('href');

layer.open({

title:$(this).data('title')?$(this).data('title'):'页面标题',

area:['500px','60%'],

type:2,

btn:['确定','取消'],

content:page,

yes:function(index,layero){

variframeWin=window[layero.find('iframe')[0]['name']];

iframeWin.submit();

},

});

});

控制器的store和update方法的返回需要处理一下,返回一个特殊的view,在该view中关闭当前弹出层,然后刷新父页面

PHP

public function store(PermissionRequest $request)

{

$permission = new Permission();

$permission->name = $request->name;

$permission->display_name = $request->display_name;

$permission->description = $request->description;

$permission->save();

flash('权限新建成功')->success();

return view('common.layer_result');

}

1

2

3

4

5

6

7

8

9

10

publicfunctionstore(PermissionRequest$request)

{

$permission=newPermission();

$permission->name=$request->name;

$permission->display_name=$request->display_name;

$permission->description=$request->description;

$permission->save();

flash('权限新建成功')->success();

returnview('common.layer_result');

}

PHP

@push('scripts')

//假设这是iframe页

var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引

parent.layer.close(index); //再执行关闭

parent.location.reload();

@endpush

1

2

3

4

5

6

7

8

@push('scripts')

//假设这是iframe页

varindex=parent.layer.getFrameIndex(window.name);//先得到当前iframe层的索引

parent.layer.close(index);//再执行关闭

parent.location.reload();

@endpush

本文由

陆, 向荣创作,除注明转载/出处外,均为本站原创,转载前请务必署名

最后编辑时间为: 2019-07-08 12:00 星期一

php隐式提交iframe,Laravel中通过IFrame来模拟页面异步提交相关推荐

  1. laravel ajax ip,怎么在Laravel中利用AJAX动态刷新部分页面

    怎么在Laravel中利用AJAX动态刷新部分页面 发布时间:2021-02-17 13:12:43 来源:亿速云 阅读:119 作者:Leah 怎么在Laravel中利用AJAX动态刷新部分页面?很 ...

  2. php 隐式路由,关于Laravel 7 的简单隐式路由模型绑定

    搜索热词 Laravel 的下一个主要发行版本 ,你可以直接在路由定义中自定义隐式路由模型绑定: Route::get('/posts/{post:slug}',function (Post $pos ...

  3. sql隐式转换_SQL Server中的隐式转换

    sql隐式转换 This article will provide an overview of SQL Server implicit conversion including data type ...

  4. mysql 隐式主键_MySQL中复合主键性能的缺点

    我们有一个表,该表具有由三个字段组成的复合主键(在MySQL 5.1中是这样). 该表上每秒有近200个插入和200个选择,并且表的大小约为100万行,并且还在不断增加. 我的问题是:"复合 ...

  5. c# 无法将类型隐式转换_C#中的隐式类型数组

    c# 无法将类型隐式转换 C#隐式类型数组 (C# Implicitly Typed Arrays) Like implicitly typed variables, we can also decl ...

  6. oracle date 隐式转换,PL/SQL中的数据类型隐式转换规则

    1) During INSERT and UPDATE operations, Oracle converts the value to the datatype of the affected co ...

  7. 隐式类型转换——C语言中的整型提升

    整型提升概念: C语言中的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升. 整型提升的意义 三点说明 ...

  8. mysql savepoint是什么_Mysql中的隐式COMMIT以及Savepoints的作用

    Mysql默认是自动提交的,如果要开启使用事务,首先要关闭自动提交后START TRANSACTION 或者 BEGIN 来开始一个事务,使用ROLLBACK/COMMIT来结束一个事务.但即使如此, ...

  9. mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...

    致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...

最新文章

  1. DIV+CSS 命名规范
  2. 执行上下文(Exection Contexts)
  3. 各大计算机公司 笔试及面试 题目 - 人民搜索
  4. oracle数据库主键自增序列_Oracle数据库序列详解
  5. c语言程序停止正常工作,C语言 由于出现问题,程序停止正常工作。如果帮我解决这个问题即可获得悬赏...
  6. 信息学奥赛C++语言:杨辉三角形
  7. 【自动驾驶】一文读懂自动驾驶汽车产业链上下游
  8. 初识ProtoBuf(3.18.1)
  9. 嘻哈 软件技术知识与项目管理知识
  10. 【优化算法】鸽群优化算法(PIO)【含Matlab源码 1077期】
  11. skyline软件_正射影像、倾斜摄影测量相关软件汇总
  12. 国外最顶级的人工智能网站资源
  13. python输出两个元素空格隔开_python实现将一串字符每两个一组,中间用空格隔开...
  14. 服装ERP软件首要的好处都有哪些?
  15. Eterm协议中文汉字编码
  16. SVPWM空间矢量脉冲宽度调制技术控制电机
  17. 请你详细说说类加载流程,类加载机制及自定义类加载器
  18. 1688商品详情api接口
  19. 开放科研:数据科学场景下如何让研究更加开放?
  20. 如何面对困难的经典语录

热门文章

  1. Spring Boot 2.0正式发布,升还是不升呢?
  2. 微信小程序隐藏标题栏navigationBar的方法
  3. win10 tensorrt安装 踩坑记录
  4. Yolov5 face训练手册
  5. 统计模型参数量与FLOPs
  6. youtube-dl
  7. 高精度人脸表情识别 开源代码
  8. Git tag 打标签
  9. Python Multiprocessing with PyCUDA
  10. caffe 编译中出现的错误——fatal error: hdf5.h: 没有那个文件或目录