yii2中结合gridview如何使用modal弹窗实例代码详解


Posted in PHP onJune 12, 2016

在上篇文章给大家介绍了Yii2中如何使用modal弹窗(基本使用),即以创建为例。

实际开发中,我们往往还会遇到列表页数据修改要使用modal的情况,如果是一般的循环展示,相信大多数人看了modal的基本使用都会操作,但是结合gridview估计有些人就开始吃不消了,我们看看如何解决这个问题!

1、gridview的操作增加[更新]按钮,并指定data-toggle data-target class以及data-id的值

[
'class' => 'yii\grid\ActionColumn',
'template' => '{update}', 
'buttons' => [
'update' => function ($url, $model, $key) {
return Html::a('更新', '#', [
'data-toggle' => 'modal',
'data-target' => '#update-modal',
'class' => 'data-update',
'data-id' => $key,
]);
},
],
],

2、为更新添加modal

<?php 
use yii\bootstrap\Modal;
// 更新操作
Modal::begin([
'id' => 'update-modal',
'header' => '<h4 class="modal-title">更新</h4>',
'footer' => '<a href="#" class="btn btn-primary" data-dismiss="modal">Close</a>',
]); 
$requestUpdateUrl = Url::toRoute('update');
$updateJs = <<<JS
$('.data-update').on('click', function () {
$.get('{$requestUpdateUrl}', { id: $(this).closest('tr').data('key') },
function (data) {
$('.modal-body').html(data);
} 
);
});

JS;

$this->registerJs($updateJs);
Modal::end();
?>

3、修改我们的update方法

public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['index']);
} else {
return $this->renderAjax('update', [
'model' => $model,
]);
}
}

可以看出整个过程中跟我们之前说的modal基本使用没什么差别。但是到此并没有结束,相信大多数人可能会遇到下面常见的几个难以解决的问题:

yii2 modal中使用了select2 为什么搜索框不可搜索?

yii2 单个页面多个modal 为什么页面会共用一个,等数据加载完了才好?

yii2 单个页面多个modal,以单个页面添加和我们上面的gridview更新均使用modal为例,当使用select2时,为什么更新的select2会失效不起作用?

下面我们看如何一个一个的解决掉这些问题:

首先第一个问题,你只需要在modal使用begin的时候指定options选项的tabindex为false即可,参考如下:

Modal::begin([
// ......
'options' => [
'tabindex' => false 
],
]);

第二个和第三个问题,都是在单个页面中使用多个modal所引起的,为了说明问题,我们在某列表内[创建]按钮和gridview中[更新]按钮中均使用modal。按照我们Yii2中如何使用modal弹窗(基本使用)和本篇文章所述,第一个问题很明显是

$('.modal-body').html(data);

所引起的,多个modal,在我们第一次使用modal之后给所有modal的body赋值了,以至于在后面使用其他modal时,在未请求到数据之前均显示相同内容的bug。解决该问题只需要在每次异步请求之后对各自的modal-body单独赋值即可,代码可参考如下:

$('#create').on('click', function () {
$.get('url', {},
function (data) {
$('#create-modal').find('.modal-body').html(data);
// $('.modal-body').html(data);
} 
);
});
$('.data-update').on('click', function () {
$.get('{$requestUpdateUrl}', { id: $(this).closest('tr').data('key') },
function (data) {
$('#update-modal').find('.modal-body').html(data);
// $('.modal-body').html(data);
} 
);
});

看最后一个问题,使用过select2的同学要注意了!!!

如果说像我们本篇主题所介绍的例子这样,form中带select2的话,就会导致仅仅在[创建]时select2正常,[更新]操作时select2字段“隐藏”的效果!

这其实是同一页面相同select2对应的id导致的,解决该问题只需要在每次异步请求数据之前,移除掉页面上所有已存在的表单项即可。看具体实现:

$('#create').on('click', function () {
// 有效避免multiply modal select2的问题
// 移除异步加载过来的form表单
$('.document-nav-form').remove();
$.get('{$requestUrl}', {},
function (data) {
$('#create-modal').find('.modal-body').html(data);
} 
);
});
$('.data-update').on('click', function () {
// 有效避免multiply modal select2的问题
// 移除异步加载过来的form表单
$('.document-nav-form').remove();
$.get('{$requestUpdateUrl}', { id: $(this).closest('tr').data('key') },
function (data) {
$('#update-modal').find('.modal-body').html(data);
} 
);
});

以上所述是小编给大家介绍的yii2中结合gridview如何使用modal弹窗实例代码详解的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
使用php重新实现PHP脚本引擎内置函数
Mar 06 PHP
php mysql数据库操作类
Jun 04 PHP
php 设计模式之 工厂模式
Dec 19 PHP
PHP企业级应用之常见缓存技术篇
Jan 27 PHP
PHP基础陷阱题(变量赋值)
Sep 12 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP进阶学习之反射基本概念与用法分析
Jun 18 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 #PHP
再谈PHP中单双引号的区别详解
Jun 12 #PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 #PHP
linux下php上传文件注意事项
Jun 11 #PHP
php设计模式之单例模式代码
Jun 11 #PHP
浅谈PHP Cookie处理函数
Jun 10 #PHP
php单例模式的简单实现方法
Jun 10 #PHP
You might like
PHP 批量删除 sql语句
2009/06/05 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
浅谈Javascript变量作用域问题
2014/12/16 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
python配置grpc环境
2019/01/01 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
python滑块验证码的破解实现
2019/11/10 Python
PyTorch中permute的用法详解
2019/12/30 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
一套带答案的C++笔试题
2014/01/10 面试题
大学生学业生涯规划
2014/01/05 职场文书
春季防火方案
2014/05/10 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2019个人半年工作总结
2019/06/21 职场文书
Python中如何处理常见报错
2022/01/18 Python