硬汉工作室

 找回密码
 立即注册

QQ登录

只需一步,快速开始

+
搜索
热搜: 活动 交友 discuz

[开发技术] Discuz如何在手机模板某个页面强制显示PC模板

[复制链接]
发表于 2020-3-16 14:19:57 | 显示全部楼层 |阅读模式
前几天一个站长提出的需求,是系统充值页面,pc版上有充值功能,但是同样url在手机端却没有,所以站长希望在手机端访问这个url的时候直接跳转到PC页面上。

如果url里加上mobile=no,那么就不访问手机模板了,但是这是全局的,无法做到某个页面不访问手机模板。

逻辑处理部分代码应该是不区分手机和PC端的,只是在显示的时候,应该会根据手机和PC加载不同的模板,于是我重点研究了template函数。

这里面有两段判断是否是手机端的代码,如下:
if(defined('IN_MOBILE') && !defined('TPL_DEFAULT') && strpos($file, $_G['mobiletpl'][IN_MOBILE].'/') === false || (isset($_G['forcemobilemessage']) && $_G['forcemobilemessage'])) {
        if(IN_MOBILE == 2) {
                $oldfile .= !empty($_G['inajax']) && ($oldfile == 'common/header' || $oldfile == 'common/footer') ? '_ajax' : '';
        }
        $file = $_G['mobiletpl'][IN_MOBILE].'/'.$oldfile;
}

/////////////////////////////
if(defined('IN_MOBILE') && !defined('TPL_DEFAULT')) {
        if(strpos($tpldir, 'plugin')) {
                if(!file_exists(DISCUZ_ROOT.$tpldir.'/'.$file.'.htm') && !file_exists(DISCUZ_ROOT.$tpldir.'/'.$file.'.php')) {
                        $url = $_SERVER['REQUEST_URI'].(strexists($_SERVER['REQUEST_URI'], '?') ? '&' : '?').'mobile=no';
                        showmessage('mobile_template_no_found', '', array('url' => $url));
                } else {
                        $mobiletplfile = $tpldir.'/'.$file.'.htm';
                }
        }
        !$mobiletplfile && $mobiletplfile = $file.'.htm';
        if(strpos($tpldir, 'plugin') && (file_exists(DISCUZ_ROOT.$mobiletplfile) || file_exists(substr(DISCUZ_ROOT.$mobiletplfile, 0, -4).'.php'))) {
                $tplfile = $mobiletplfile;
        } elseif(!file_exists(DISCUZ_ROOT.TPLDIR.'/'.$mobiletplfile) && !file_exists(substr(DISCUZ_ROOT.TPLDIR.'/'.$mobiletplfile, 0, -4).'.php')) {
                $mobiletplfile = './template/default/'.$file.'.htm';
                if(!file_exists(DISCUZ_ROOT.$mobiletplfile) && !$_G['forcemobilemessage']) {
                        $tplfile = str_replace($_G['mobiletpl'][IN_MOBILE].'/', '', $tplfile);
                        $file = str_replace($_G['mobiletpl'][IN_MOBILE].'/', '', $file);
                        define('TPL_DEFAULT', true);
                } else {
                        $tplfile = $mobiletplfile;
                }
        } else {
                $tplfile = TPLDIR.'/'.$mobiletplfile;
        }
}


尽管看不太懂,不过我还是尝试先屏蔽掉这两段代码,然后用手机访问,确实出来了pc端的页面,但是好像缺少某些css样式,还得继续分析。

分析之后发现,是常量STYLEID的问题,手机端访问的话STYLEID的值为2,然后某些样式就出现问题,如果STYLEID=1的话,那么就一切正常了。这个STYLEID常量是定义在discuz_application文件里的_init_style方法里。第一行就是判断是否是手机端的代码:
if(defined('IN_MOBILE')) {
        $mobile = max(1, intval(IN_MOBILE));
        if($mobile && $this->var['setting']['styleid'.$mobile]) {
                $styleid = $this->var['setting']['styleid'.$mobile];
                $styleid = 1; // 这里更改为1,那么手机端显示pc模板就正常了。
        }
} else {
        $styleid = !empty($this->var['cookie']['styleid']) ? $this->var['cookie']['styleid'] : 0;

        if(intval(!empty($this->var['forum']['styleid']))) {
                $this->var['cache']['style_default']['styleid'] = $styleid = $this->var['forum']['styleid'];
        } elseif(intval(!empty($this->var['category']['styleid']))) {
                $this->var['cache']['style_default']['styleid'] = $styleid = $this->var['category']['styleid'];
        }
}


上面代码我没有判断是哪个URL访问的,只是单纯的让手机端访问全部显示PC模板,如果你只是想某个URL访问显示PC模板,可以判断URL,然后再做这些处理。
有关PHP系统、Discuz或网站等各种问题,可以联系QQ1069971363寻求付费支持
Discuz插件商店:http://addon.dismall.com/?@56030.developer
回复

使用道具 举报

QQ|Archiver|手机版|小黑屋|硬汉工作室 ( 冀ICP备13021567号-9 )

GMT+8, 2025-2-5 22:15 , Processed in 0.049926 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表