easyuitabs+yii2.0实现iframe方式打开页面(解决共用静态文件引入加载的问题)

冰狼爱魔      2022-02-10     119

关键词:

  在项目实际开发中,有将打开的各个链接页面隔离的需求(防止静态资源起冲突),这个时候常规思路就是使用iframe来实现!但遇到一个比较棘手的问题,当用easyui Tabs打开一个iframe页面时,怎么解决原有共用静态资源引入的问题。有人建议可以考虑将共用静态资源文件放到一个php文件中,然后每次渲染页面时加载即可,这个时候很多朋友会想到PHP的include()方式,但是每个iframe页面都要include一次,岂不是很麻烦。而且项目的要求是iframe打开和easyui tabs href打开方式要能够自由切换,这就难倒众多小伙伴了!现将实际项目解决该问题的思路和步骤整理如下:

1、在Yii2.0 layouts下新建iframe.php共用视图文件,代码如下:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<?php
use yiihelpersHtml;
use yiiootstrapNav;
use yiiootstrapNavBar;
use yiiwidgetsBreadcrumbs;
use yiihelpersUrl;
use frontendassetsAppAsset; use frontendwidgetsAlert; /* @var $this yiiwebView */ /* @var $content string */ //AppAsset::register($this); $js[‘jquery.min.js‘] = ‘js/jquery.min.js‘; $js[‘easyui.min.js‘] = ‘easyui1.4.1/jquery.easyui.min.js‘; $js[‘easyui.ext.js‘] = ‘easyui1.4.1/jquery.easyui.ext.js‘; $js[‘easyui-lang.js‘] = ‘easyui1.4.1/locale/easyui-lang-zh_CN.js‘; $js[‘global.js‘] = ‘js/global.js‘; foreach ($js as $f){ if (is_file($root.‘/web/‘.$f)) { $t = date(‘ymdHi‘, filemtime($root.‘/web/‘.$f)); echo " <script type="text/javascript" src="{$f}?_t=$t" ></script>"; } } ?> <html lang="<?= Yii::$app->language ?>"> <head> <meta charset="<?= Yii::$app->charset ?>"/> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <link rel="stylesheet" type="text/css" href="easyui1.4.1/themes/insdep/easyui.css" /> <link rel="stylesheet" type="text/css" href="easyui1.4.1/themes/insdep/easyui_animation.css" /> <link rel="stylesheet" type="text/css" href="css/icon.css" /> <link rel="stylesheet" type="text/css" href="css/css.css" /> <script type="text/javascript" src="easyui1.4.1/jquery.edatagrid.js"></script> <script type="text/javascript" src="easyui1.4.1/jquery.easyui.extend.validate.js"></script> <?= Html::csrfMetaTags() ?> </head> <style> * {margin:0px; padding:0px;} html, body {margin:0px; padding:0px; width:100%; height:100%} .test_page_loading{position:absolute; z-index:1000; top:0px; left:0px; margin:0px auto; padding:0px; width:100%; height:100%; filter:alpha(opacity=80); opacity:1.0; background:#F8F8F8; text-align:center} </style> <body> <!--首页遮罩--> <div class="test_page_loading"><div style="margin:20% auto"><image src="css/icons/loading.gif"/><font color="#15428B">页面正在加载中,请稍后···</font></div></div> <?=$content?> </body> </html>

 

 

2、因为要兼顾easyui href打开方式与iframe打开方式并存,而又不能影响原来的业务流程,故在视图文件main.php中打开的href加上一个是否是iframe的识别标记,如下所示:

     // 添加tabs
        addTab: function(node) {
            href = node.href;
            if (href==‘‘ || href==undefined) {
                return;
            }
            if (node.reload == undefined){
                reload = 0;
            }else{
                reload = parseInt(node.reload);
            }

            // 根据text查tab是否存在,如果存在则判断id是否一致,一致则直接选中,不一致则新建一个tab
            mark = node.mark;
            text = node.text;
            href = node.href;
            icon = node.icon != ‘null‘ ? node.icon : ‘‘;
            outer= parseInt(node.outer);
            
            var loadingHtml = ‘<div class="test_page_loading"><image src="css/icons/loading.gif"/><font color="#15428B">页面正在加载中,请稍后···</font></div>‘;
            var tabsPanel = $(‘#test-main-tabs‘);
            var tabsLength = tabsPanel.tabs(‘tabs‘).length; // 获取选项卡的长度(数量)
            var tabsMaxLength = 10; // 定义选项卡的最大长度
            var tab = $(‘#test-main-tabs‘).tabs(‘getTab‘, text );
            var tabId =  ‘user_menu_‘+mark;
            if (tab && $(tab).attr(‘id‘) == tabId){
                tabsPanel.tabs(‘select‘, text);
                if (reload){
                    if (outer){
                        var tab = tabsPanel.tabs(‘getSelected‘);
                        /*if (tab){
                            var index = tabsPanel.tabs(‘getTabIndex‘, tab);
                            tabsPanel.tabs(‘close‘, index);
                        }*/
                        // 包含?的url链接加上额外参数,解决打开外部链接404问题
                        if (/?/g.test(href)) {
                            href = href + "&isFrame=true"; // 加上iframe打开方式标记
                        }
                        var content = ‘<iframe scrolling="auto" frameborder="0"  src="‘+ href +‘" style="width:100%;height:100%;"></iframe>‘;
                        if(tabsLength > tabsMaxLength){
                            $.messager.alert(‘提示信息‘, ‘为了您的浏览器性能,您最多允许打开‘+tabsMaxLength+‘个tabs窗口,请先关闭无用的窗口!‘, ‘error‘);
                            return false;
                        }
                        tabsPanel.tabs(‘update‘,{
                            tab: tab,
                            options: {
                                id: tabId,
                                title: text,
                                iconCls: icon,
                                content: content,
                                fit:true,
                                closable:true                                
                            }
                        });
                    }else{
                        // 注意,tab中如果有dialog之类的,多次刷新tab会导致内存中有多个同样的dialog
                        tabsPanel.tabs(‘getSelected‘).panel(‘refresh‘, href);
                    }
                }else{

                }
            }else{
                if (outer){
                    // 包含?的url链接加上额外参数,解决打开外部链接404问题
                    if (/?/g.test(href)) {
                        href = href + "&isFrame=true";
                    }                    
                    var content = ‘<iframe scrolling="auto" frameborder="0"  src="‘+ href +‘" style="width:100%;height:100%;"></iframe>‘;
                    if(tabsLength > tabsMaxLength){
                        $.messager.alert(‘提示信息‘, ‘为了您的浏览器性能,您最多允许打开‘+tabsMaxLength+‘个tabs窗口,请先关闭无用的窗口!‘, ‘error‘);
                        return false;
                    }
                    tabsPanel.tabs(‘add‘,{
                        id: tabId,
                        title: text,
                        iconCls: icon,
                        content: content,
                        fit:true,
                        closable:true
                    });
                }else{
                    if(tabsLength > tabsMaxLength){
                        $.messager.alert(‘提示信息‘, ‘为了您的浏览器性能,您最多允许打开‘+tabsMaxLength+‘个tabs窗口,请先关闭无用的窗口!‘, ‘error‘);
                        return false;
                    }
                    tabsPanel.tabs(‘add‘,{
                        id: tabId,
                        title: text,
                        iconCls: icon,
                        href: href,
                        closable:true,
                        onBeforeLoad: function() {
                            $(‘#test-main-tabs‘).find(‘.tabs-panels‘).append(loadingHtml);
                        }
                    });
                }
            }            
        }

 

3、因为根据之前的业务tabs都是通过href直接打开的,现要支持iframe打开而不能影响之前的打开方式,也就是两种方式能够随时切换,那么后台渲染视图也要做相应的调整,如下所示:

    // BaseController.php
    /**
     * 控制器动作执行前事件处理,解决iframe方式打开使用iframe公共视图
     * @author testMe
     * @date 2016-12-04
     */
    public function beforeAction($action)
    {
        // 用iframe方式打开则改变默认的视图布局文件
        $isFrame = Yii::$app->request->get(‘isFrame‘, ‘‘);
        if ($isFrame == ‘true‘) {
            $this->layout = ‘@app/views/layouts/iframe‘;
            self::$_isFrame = true;
        } else {
            self::$_isFrame = false;
        }
        
        return parent::beforeAction($action);
    }
    
    /**
     * 实现页面iframe方式打开时强制渲染公共视图(因为之前的逻辑都是通过renderPartial局部方式渲染的,而通过iframe要启用新的共用视图文件,所以这里强制使用render包含共用视图的渲染方式)
     * @author testMe
     * @date 2016-12-04
     */
    public function renderPartial($view, $params = []) 
    {
        if (self::$_isFrame) {
            return parent::render($view, $params);
        } else {
            return parent::renderPartial($view, $params);
        }
    }

 


yii2.0实现的短信发送

原文地址:http://www.phpxs.com/post/4245/yii2-smserGithub项目主页https://github.com/daixianceng/yii2-smser安装composerrequiredaixianceng/yii2-smser"*"或者在composer.json中添加"daixianceng/yii2-smser":"*"用法return[‘comp 查看详情

yii2.0实现语言包切换功能

在yii2.0高级模板框架中,以前台为例,首先 在前台frontend下面建立 messages/zh-CN 在messages文件夹中创建一个文件: ①common.php               &nb 查看详情

yii2.0实现ajax搜索分页

//1.首先判断搜索的数据是否为空[php]viewplaincopy$username = \\Yii::$app->request->post('username');  //接收搜索的数  //2.定义一个Where条件目的是让Sql语句恒成立[php]viewplaincopy$where = 1;  //3.判断数据是否存在,拼接 查看详情

yii2.0实现ajax搜索分页

//1.首先判断搜索的数据是否为空[php]viewplaincopy$username = \\Yii::$app->request->post('username');  //接收搜索的数  //2.定义一个Where条件目的是让Sql语句恒成立[php]viewplaincopy$where = 1;  //3.判断数据是否存在,拼接... 查看详情

yii系列yii2.0的安装与调试

...主要开发框架,今天,我就和大伙来聊聊如何安装与调试Yii2.0,以及后续会和大伙聊聊如何在Yii2.0上快速撸代码。Yii2.0的安装好的,Composer这个利器我们在【http://www.cnblogs.com/riverdubu/p/6444403.html】这一章节中已经讲了如何安装,... 查看详情

javascript提高:005:asp.net使用easyuitabs标签显示问题

前面使用easyui来实现了一个tabs标签(http://blog.csdn.net/yysyangyangyangshan/article/details/38307477),只是在ASP.NET中使用时发现了一个问题。大家都知道。asp.net页面的控件,当控件的事件不是使用"returnjs函数();"时,或者控件注冊... 查看详情

yii2.0面包屑的使用

yii2中面包屑是yii2自带的小部件,类似本网站的导航栏应该就是采用面包屑来完成的 例子如下,需要引入yiiwidgetsBreadcrumbsechoBreadcrumbs::widget([    ‘homeLink‘=>[‘label‘=>‘首页‘,‘url‘=>[‘site/index‘]],&nbs... 查看详情

yii2框架restfulapi教程-快速入门

...助刚接触Yii2框架RESTful的小伙伴快速入门。一、目录结构实现一个简单地RESTfulAPI只需用到三个文件。目录如下: frontend├─config│└main.php├─controllers│└BookControl 查看详情

yii2.0删除文件夹

/***删除文件缓存*/publicfunctionactionDelfilecache(){$cachePath=Yii::getAlias(‘@app/runtime/cache‘);//文件绝对路径$fileArray=scandir($cachePath);//将文件夹中的文件升序排列foreach($fileArrayas$fileName){if($fileName!="."& 查看详情

yii2.0下的load()方法的使用

一问题最近在使用Yii2.0,遇到一个bug:在/models/OrderDetail.phpadd()方法中调用load()方法加载数据,却加载不了。publicfunctionadd($data){if($this->load($data)&&$this->save()){returntrue;}returnfalse;}二排错2.1将add()方法修改成如下(添加 查看详情

yii2.0增删改查实例讲解

yii2.0增删改查实例讲解一.创建数据库文件.创建表CREATETABLE`resource`(`id`int(10)NOTNULLAUTO_INCREMENT,`texture`varchar(50)NOTNULLCOMMENT‘材质‘,`mark`varchar(50)NOTNULLCOMMENT‘牌号‘,`manufacturers`varchar(100)NOTNULLCOMMENT‘厂 查看详情

easyuitabs

$("#mainAccrdiontablea").click(function(){$("#mainAccrdiontabletd").css("background-image","none");$(this).parent().css("background-image","url(/Content/img/home_index_td_backgroud.bmp)");varurl=$(thi 查看详情

yii2.0用form传值get方法

<!--yii2.0用get方法传值--><formaction="index.php"method="get"> <!--yii2.0用get方法传值必须加入hidden才可以成功--> <inputtype="hidden"name="r"value="控制器名/方法名"> <inputtype="text"name="user"> 查看详情

yii2.0图片上传(摘录)

....com.cn/s/blog_88a65c1b0101izmn.html下面小伙就带领大学学习一下Yii2.0的图片上传类的使用,还是老样子,如果代码样式混乱,我会附上截图供大家学习。1、UserController.php很重要的一步,那就是useyiiwebUploadedFile; publicfunctionactionUpload( 查看详情

yii2.0用html方式生成表单

文本框:textInput();密码框:passwordInput();单选框:radio(),radioList();复选框:checkbox(),checkboxList();下拉框:dropDownList();隐藏域:hiddenInput();文本域:textarea([‘rows‘=>3]);文件上传:fileInput();提交按钮:submitButton();重置按钮:re 查看详情

easyuitab

1.新增tab2.关闭tab3.右键菜单(关闭、关闭所有、关闭其它、关闭右侧、关闭左侧)//双击关闭tab$(document).on("dblclick",".tabs-selected",function(){varindex=$(this).index();$("#mTabs").tabs("close",index);});functionaddTab(title,url,icon){if 查看详情

yii2框架反序列化漏洞复现(代码片段)

1.前言跟着feng师傅再学习一下yii2的反序列化漏洞,提高代码审计能力feng师傅的连接漏洞出现在yii2.0.38之前的版本中,在2.0.38进行了修复,CVE编号是CVE-2020-15148:Yii2(yiisoft/yii2)beforeversion2.0.38isvulnerabletoremotecodeexecutio... 查看详情

yii2框架反序列化漏洞复现(代码片段)

1.前言跟着feng师傅再学习一下yii2的反序列化漏洞,提高代码审计能力feng师傅的连接漏洞出现在yii2.0.38之前的版本中,在2.0.38进行了修复,CVE编号是CVE-2020-15148:Yii2(yiisoft/yii2)beforeversion2.0.38isvulnerabletoremotecodeexecutio... 查看详情