标签 个人资料 下的文章

x2个人资料的隐私更新问题分析及解决方法

问题描述:
后台设置某项用户栏目的默认隐私设为公开,这里以QQ为例。
然后注册一个新会员,设置个人资料里的QQ项。
更改后台此项用户栏目QQ的默认隐私为保密,但是此用户的空间里仍显示QQ项。

 

问题原因:
在source\module\forum\forum_viewthread.php文件判断隐私的地方并未对某项资料的全局隐私做判断,代码如下:

if(!empty($post['privacy']['profile'][$field])) {
	continue;
}

这里仅判断了用户此项资料的隐私设置,如果存在就跳出,不予显示,但是这里并未对这项资料的全局隐私做判断,会导致出现开头提到的问题。

修正方法:
在source\module\forum\forum_viewthread.php文件中,搜索下面代码

if(!empty($post['privacy']['profile'][$field])) {
	continue;
}

改为

if(!empty($post['privacy']['profile'][$field]) || $_G['setting']['privacy']['profile'][$field]) {
	continue;
}

此问题在1010版本下发现,其他版本未验证。

帖子内个人资料(如QQ)项不显示的问题分析及解决方法

1116日更新解决方法。

今日有用户反应设置了QQ在帖子里显示,但是帖子仍不显示的问题。
排查后发现为x2的bug,特给出具体的分析。

后台设置QQ项的隐私,如图:

在source\admincp\admincp_setting.php文件中的处理有如下代码:

foreach($settingnew['customauthorinfo'] as $field => $v) {
	if(substr($field, 0, 6) == 'field_' && ($v['menu'] || $v['left'])) {
	//如果$field前6个字符等于field_(即个人资料里的设置),同时此设置在头像菜单里显示($v['menu'])或者在贴内左侧($v['left'])显示
		$showinthreadfields[] = substr($field, 6);
		//substr($field, 6)为field_后面的值,如QQ的key值为field_qq,则substr($field, 6)为qq
		//将满足条件的值添加到数组$showinthreadfields中
	}
}
//中间代码省略
if($showinthreadfields) {
	DB::update('common_member_profile_setting', array('showinthread' => 1), "fieldid IN (".dimplode($showinthreadfields).")");
	//将在$showinthreadfields中的相应项在common_member_profile_setting表中的showinthread字段置为1
}

从这段代码可以看出,QQ选项在common_member_profile_setting表中的showinthread字段被置为了1.

下面分析在家园设置QQ选项时的处理:
找到template\default\home\spacecp_profile.htm文件




 

从这里可以看出,如果$value[showinthread]存在,则此项的隐私类型privacy[$key]直接被置为了3(value="3")。

privacy[$key]值的代表意义:
0:公开
1:好友可见
3:保密

这里会导致存入到common_member_home_field表中的关于此项设置(QQ)的隐私设置为3,即保密。
不明白此处为何有一处这样的判断,不知道当初是如何设计的。
因此处导致该会员关于QQ的隐私设置为保密,进而会导致前台帖子内无法显示。
因为隐私项是不显示的,具体见source\module\forum\forum_viewthread.php文件中的代码:

if(!empty($post['privacy']['profile'][$field])) {
	continue;
}

解决方法:
找到template\default\home\spacecp_profile.htm文件
搜索如下代码:


改为


	


这里的判断改为如果在帖子里显示(贴内左侧或头像菜单),则设置此项的隐私为公开。
对于之前注册的用户,则需要到设置下重新设置一下隐私类型,将对应项的隐私改为公开即可显示,如图以QQ为例。