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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
PHP4中session登录页面的应用
Jul 25 PHP
php下通过IP获取地理位置的代码(小偷程序)
Jun 09 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
Dec 08 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
PHP不用递归遍历目录下所有文件的代码
Jul 04 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
php实现遍历文件夹的方法汇总
Mar 02 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
PHP生成随机数的方法总结
Mar 01 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php 生成唯一id的几种解决方法
2013/03/08 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
JS面向对象编程浅析
2011/08/28 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
三步实现ionic3点击退出app程序
2019/09/17 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
python开发入门——set的使用
2020/09/03 Python
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
领导四风问题整改措施思想汇报
2014/10/13 职场文书
离婚起诉书范本
2015/05/18 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
Redis的字符串是如何实现的
2021/10/24 Redis
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS