前几天一个站长提出的需求,是系统充值页面,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寻求付费支持
|