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 csv操作类代码
Dec 14 PHP
php cli 方式 在crotab中运行解决
Feb 08 PHP
PHP 文件系统详解
Sep 13 PHP
Codeigniter的dom类用法实例
Jun 26 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
Mar 29 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 PHP
php版微信自动登录并获取昵称的方法
Sep 23 PHP
利用php_imagick实现复古效果的方法
Oct 18 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
在laravel5.2中实现点击用户头像更改头像的方法
Oct 14 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 获取当前访问的url文件名的方法小结
2010/02/08 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
SeaJS入门教程系列之完整示例(三)
2014/03/03 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
jQuery表单验证之密码确认
2017/05/22 jQuery
JQueryMiniUI按照时间进行查询的实现方法
2017/06/07 jQuery
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
python访问类中docstring注释的实现方法
2015/05/04 Python
举例讲解Python中的算数运算符的用法
2015/05/13 Python
python实现按行切分文本文件的方法
2016/04/18 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
学年自我鉴定范文
2013/10/01 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
针对吵架老公保证书
2015/05/08 职场文书
教育教学读书笔记
2015/07/02 职场文书
教师远程研修感悟
2015/11/18 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android
基于redis+lua进行限流的方法
2022/07/23 Redis