帖子内个人资料(如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为例。

参加同学婚礼记

第一次正式参加同学的婚礼,一路奔波。

新娘是大学的同学,很早之前就通知了10月1日左右结婚,结婚前又打电话通知的。
大学里关系不错,特意通知的,十一放假前就跟老大请了一天假。
十一来了之后,联系了也在北京的另外一个同学,确定一块去。

周六中午吃完饭,到代售点买的9号下午回北京的票,下午6点下班就赶紧回家收拾东西往北京西站赶。
一开始担心赶不上8点半的动车,就跟同学约好到了车站再买票。
结果从上地到北京西站,坐公交用了1个小时10分钟,大大低于之前的预期时间。
另外一同学本来只需要30分钟车程,结果8点才到。
到了车站就赶紧买票,结果只有10点多的座票了,2点左右到石家庄,站票最早也要12点到石家庄了,就干脆买的10点多的座票。
然后通知石家庄的同学不用等了,先休息,等到了电话联系他。
买完票就进车站里的加州吃饭了,一边吃一边聊,就到了10点,话说我这人有这么能侃啊...

10点多一点开始检票,顺利上车,又是一路侃大山...
到石家庄不到2点,出站居然下雨了,虽说不大,但是搞的身上潮乎乎的...
打的往同学住的地方赶,人还单独给俺租了间房子。
到了住的地方就倒头睡觉,我这人就一优点——倒头就能睡着。
7点多的时候被外面的哀乐吵醒了,悲催的,一直躺倒9点起来洗漱。
洗漱完,跟另外两个同学坐公交往酒店走。

到了酒店,在大堂里等主角们出现。
陆续的有同学过来,有的毕业后就没见过了,一顿寒暄。
之后新郎新娘来了,大家就上6楼入座了。
第一次参加大学同学的婚礼,西式的,挺新奇的。
司仪主持,交换戒指、热吻......
后面就是一顿吃,菜上的桌子都盛不下了...

吃完,大家就陆续的走了。
2点多跟同学一块打的往火车站走,到了才3点。
没事干就到火车站附近逛街了,干逛,3点半左右往车站走,路上买了点吃的。
到了车站不到4点,找了个地歇了会,吃了点东西。
4点进站,之后上车回北京。

晚上7点20分左右到的北京,本来以为晚点半小时呢,到站发现只晚了几分钟,不错唉。
坐公交往家赶,下车后在附近的小饭馆吃了点饭——馄饨+火烧,馄饨真香~

算下来,奔波了一天,真希望接下来是个周末休息一下唉。

北京,哥回来了

今天下午3点的火车,人那个多啊~~~~~~~~!
最终还是挤上去了,临客,要5个半小时到北京,呃,一路无聊...
晚上9点下火车,晚点15分钟,对于临客来说,这个可以忽略不计了吧...
10点到家,打电话给爸妈报了个平安。

假期回顾:
到家发现家里已经掰了一块地的玉米了,而且都要剥完了,我到家啥都没插上手,就昨天帮忙把玉米拔到房上,o(︶︿︶)o
虽说我之前真的不想下地去掰玉米了,不过什么都没干这个总感觉有点内疚啥的...

中间相了次亲,具体情况不做叙述,以免误传。

假期没有上网,到家一上QQ,一堆消息弹出,头大了...

泡面去了,不写了,有事您留言~~

十一假期开始

今天是9月最后一天。

一整天没啥心思工作,上午写了写月报跟周报,下午看了看论坛帖子。
因为是北京首堵,所以公司提前3点就下班了,感谢领导们了~!

接下来就在公司呆着了,我貌似一直在公司呆着了,搞的人都以为我住公司了。。。

明天的计划是先把衣服洗了,然后准备好回家的东西,坐等后天的到来!

x2的回帖奖励功能分析

进入source\include\post\post_newreply.php文件,在438行附近找到如下代码:

if($thread['replycredit'] > 0 && $thread['authorid'] != $_G['uid'] && $_G['uid']) {

如果$thread['replycredit']大于0,同时帖子作者不是当前登录用户,则进入下面的处理流程。
$thread['replycredit']为当前帖子的回帖奖励总积分。

$replycredit_rule = DB::fetch_first("SELECT * FROM ".DB::table('forum_replycredit')." WHERE tid = '$_G[tid]' LIMIT 1");
$have_replycredit = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_credit_log')." WHERE relatedid = '{$_G[tid]}' AND uid = '{$_G[uid]}' AND operation = 'RCA' LIMIT {$replycredit_rule['times']} ");

$replycredit_rule为从forum_replycredit表中查询该帖的回帖奖励设置数组,具体格式为

array(
        'tid' => '帖子tid',
        'extcredits' => '每次回帖的奖励积分',
        'times' => '奖励次数',
        'membertimes' => '每个人最多奖励的次数',
        'random' => '中奖率',
        'extcreditstype' => '奖励的积分类型',
)

$have_replycredit为从common_credit_log表中查询该帖中当前登录用户的已奖励次数。

if($replycredit_rule['membertimes'] - $have_replycredit > 0 && $thread['replycredit'] - $replycredit_rule['extcredits'] >= 0) {

如果该帖的每个人最多奖励次数$replycredit_rule['membertimes']大于该帖中当前登录用户的已奖励次数$have_replycredit,同时该帖的回帖奖励总积分$thread['replycredit']大于或等于该帖每次回帖的奖励积分$replycredit_rule['extcredits']。

$replycredit_rule['extcreditstype'] = $replycredit_rule['extcreditstype'] ? $replycredit_rule['extcreditstype'] : $_G['setting']['creditstransextra'][10];

$replycredit_rule['extcreditstype']为该帖奖励积分的积分类型,如果存在$replycredit_rule['extcreditstype']的话就为$replycredit_rule['extcreditstype'],否则为$_G['setting']['creditstransextra'][10]。
$_G['setting']['creditstransextra'][10]为后台->全局->积分设置下设置的回帖奖励使用的积分。

if($replycredit_rule['random'] > 0) {
                $rand = rand(1, 100);
                $rand_replycredit = $rand <= $replycredit_rule['random'] ? true : false ;
} else {
                $rand_replycredit = true;
}

如果该帖回帖奖励的中奖率$replycredit_rule['random']大于0:
$rand为在1-100中间生成的一个随机数,如果$rand小于或等于$replycredit_rule['random'],则设置$rand_replycredit为true,否则为false。
如果该帖回帖奖励的中奖率$replycredit_rule['random']不大于0:
设置$rand_replycredit为true。

if($rand_replycredit) {
                if(!$posttable) {
                                $posttable = getposttablebytid($_G['tid']);
                }
                updatemembercount($_G['uid'], array($replycredit_rule['extcreditstype'] => $replycredit_rule['extcredits']), 1, 'RCA', $_G[tid]);
                DB::update($posttable, array('replycredit' => $replycredit_rule['extcredits']), array('pid' => $pid));
                DB::update("forum_thread", array('replycredit' => $thread['replycredit'] - $replycredit_rule['extcredits']), array('tid' => $_G[tid]));
}

如果存在$rand_replycredit:

if(!$posttable) {
$posttable = getposttablebytid($_G['tid']);
}

如果不存在回帖表$posttable,则通过tid获取$posttable。

updatemembercount($_G['uid'], array($replycredit_rule['extcreditstype'] => $replycredit_rule['extcredits']), 1, 'RCA', $_G[tid]);

根据回帖奖励的规则,更新当前登录用户的积分:在原有积分基础上+$replycredit_rule['extcredits']。$replycredit_rule['extcreditstype']为积分类型,$replycredit_rule['extcredits']为奖励积分数。

DB::update($posttable, array('replycredit' => $replycredit_rule['extcredits']), array('pid' => $pid));

更新回帖表$posttable中当前用户回复的积分奖励。

DB::update("forum_thread", array('replycredit' => $thread['replycredit'] - $replycredit_rule['extcredits']), array('tid' => $_G[tid]));

$thread['replycredit'] - $replycredit_rule['extcredits']为计算回帖奖励的剩余总积分。
更新主题表forum_thread中当前帖子的回帖奖励总积分replycredit。