发新帖
打印 上一主题 下一主题
开启左侧边栏

Discuz中更好地使用cookie让游客享有更多登录用户才有的功能——切换风格

[复制链接]
Discuz X3在为用户提供多样性的风格和使用方法及其用户灵活定制上做了不少工作,但是大多已做的工作却不能理想的或正确的被投入实用,程序设计上主要有两三个问题:1.很多功能都限定了必须是登录的(login)用户,在程序里加了判别条件(if {$_G[uid]});2. 没有更好的使用cookie来实现那些更大众化的功能,尤其是那些对于特定用户一旦选定,倾向于长久保持的设定,而是使用不具长期性的session变量。3. 有些地方即使使用了cookie与session变量配合,但是一旦用户登出(logout),cookie就被全部清除了。或者程序再启用时,初始化变量阶段时cookie值没有被优先选用。

51haoyou现在的修改方法如下:

用户登出时清除cookie中,把需要保留的cookie排除在外。function clearcookies()改进如下:

function clearcookies() {
        global $_G;
        foreach($_G['cookie'] as $k => $v) {
                if($k != 'widthauto' && $k != 'close_leftinfo' && $k != 'responsive_view' && $k != 'extstyle') {
                        dsetcookie($k);
                }
        }
        $_G['uid'] = $_G['adminid'] = 0;
        $_G['username'] = $_G['member']['password'] = '';
}

其中'close_leftinfo'和'responsive_view'和'extstyle'三个cookie值是到目前为止51haoyou新添加的或修订的cookie值。

51haoyou还在有关程序中的判断语句中去掉if {$_G[uid]}的部分,保证游客不被排除在外。

更难和更多的改进就是在需要的地方增加function setcookie(...)的调用。注意Discuz中有php对setcookie函数的调用,也有javascript对setcookie函数的调用,两者概念相同,使用方法略微区别。因为Discuz给cookie name加了前缀cookiepre,使得php和javascript调用区别更不同了。

现在“收起左侧边栏”和“极简浏览模式”和“切换风格”(在页面的右上角 )都做到了让游客也一键设置,长期有效。

发现IE浏览器因为其它功能的实现,降格为低版本使用,而造成“切换风格”仅对IE失效,所以只好专门为IE浏览器增加了如下代码,这个段代码和方法实际上也可以使用在其它浏览器上。在文件/template/default/common/header.htm中,

<!--{if $_G['uid'] && !empty($_G['style']['extstyle'])}--><a id="sslct" href="javascript:;" onmouseover="delayShow(this, function() {showMenu({'ctrlid':'sslct','pos':'34!'})});">{lang changestyle}</a><!--{/if}-->
改成
<!--{if !empty($_G['style']['extstyle'])}--><a id="sslct" href="javascript:;" onmouseover="if(BROWSER.ie){d=getcookie('extstyle');i=parseInt(d.substr(d.length-1))+1;if(i>5)i=1;d=d.slice(0, -1)+i;extstyle(d);}else{delayShow(this, function() {showMenu({'ctrlid':'sslct','pos':'34!'})});}">{lang changestyle}</a><!--{/if}-->


相关帖子




www.51haoyou.com

GMT-4, 2024-5-17 03:58

© 2005-

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