让discuz X2 支持@通知功能

2013年8月11日 分类: PHP (216 个脚步)

众所周知,从discuz X2.5开始,就支持@通知功能。

而如果论坛是X2.0 并且还不能升级到X2.5的站长来说,这都是个说不出的痛。

经过一段时间的研究,终于找到了discuz X2.5上面的@他人的相关代码,并且将代码顺利的转移到discuz X2.0 上面,虽然说还是有点点不方便的地方,但是总比没有的强,是吧?~~

1. 在发新帖子时发送@通知。

首先,打开source/include/post/下的post_newthread.php文件,找到大概447行处 
也可以查找这句代码

$bbcodeoff = checkbbcodes($message, !empty($_G['gp_bbcodeoff']));

 再他的上面添加如下代码:

if($_G['group']['allowat']) {
	$atlist = $atlist_tmp = array();
	preg_match_all("/@([^\r\n]*?)\s/i", $message, $atlist_tmp);
	$atlist_tmp = array_slice(array_unique($atlist_tmp[1]), 0, $_G['group']['allowat']);
	if(empty($_G['setting']['at_anyone'])) {
		$query = DB::query("SELECT `fuid`,`fusername` from `pre_home_friend` where `uid` = ".$_G['uid']." and `fusername` IN ('".implode("','",$atlist_tmp)."');");
		while($row = DB::fetch($query)) {
	 		$atlist[$row['fuid']] = $row['fusername'];
	 	}
	 } else {
		$query = DB::query("SELECT `uid`,`username` FROM `pre_common_member` WHERE `username` IN ('".implode("','",$atlist_tmp)."')");
		while($row = DB::fetch($query)) {
	 		$atlist[$row['uid']] = $row['username'];				
	 	}
	}
	if($atlist) {
		foreach($atlist as $atuid => $atusername) {
			$atsearch[] = "/@".str_replace('/', '\/', preg_quote($atusername))." /i";
			$atreplace[] = "[url=home.php?mod=space&uid=$atuid]@{$atusername}[/url] ";
		}
		$message = preg_replace($atsearch, $atreplace, $message.' ', 1);
	}
}

再找到大概550行,找到

if($modnewthreads) {

在函数内添加如下代码:

if($_G['group']['allowat'] && $atlist) {
	foreach($atlist as $atuid => $atusername) {
		notification_add($atuid, 'at', 'at_message', array(
			'from_id' => $tid, 
			'from_idtype' => 'at', 
			'buyerid' 	=> $_G['uid'], 
			'buyer' 	=> $_G['username'], 
			'tid' 		=> $tid,
			'pid' 		=> $pid,
			'subject' 	=> $subject,
			'message' => messagecutstr($message, 150),
		));
	}

}

发表新帖子@通知别人就到一段落了。

2. 在回复中添加@通知

打开source/include/post/下的post_newreply.php文件,在大概326行处找到

$bbcodeoff = checkbbcodes($message, !empty($_G['gp_bbcodeoff']));

在代码上面添加如下代码:

if($_G['group']['allowat']) {
	$atlist = $atlist_tmp = array();
	preg_match_all("/@([^\r\n]*?)\s/i", $message, $atlist_tmp);
	$atlist_tmp = array_slice(array_unique($atlist_tmp[1]), 0, $_G['group']['allowat']);
	if(empty($_G['setting']['at_anyone'])) {
		$query = DB::query("SELECT `fuid`,`fusername` from `pre_home_friend` where `uid` = ".$_G['uid']." and `fusername` IN ('".implode("','",$atlist_tmp)."');");
		while($row = DB::fetch($query)) {
	 		$atlist[$row['fuid']] = $row['fusername'];
	 	}
	 } else {
		$query = DB::query("SELECT `uid`,`username` FROM `pre_common_member` WHERE `username` IN ('".implode("','",$atlist_tmp)."')");
		while($row = DB::fetch($query)) {
	 		$atlist[$row['uid']] = $row['username'];				
	 	}
	}
	if($atlist) {
		foreach($atlist as $atuid => $atusername) {
			$atsearch[] = "/@".str_replace('/', '\/', preg_quote($atusername))." /i";
			$atreplace[] = "[url=home.php?mod=space&uid=$atuid]@{$atusername}[/url] ";
		}
		$message = preg_replace($atsearch, $atreplace, $message.' ', 1);
	}
}

然后再找到376行处,找到

useractionlog($_G['uid'], 'pid');

在后面添加如下代码:

if($_G['group']['allowat'] && $atlist) {
	foreach($atlist as $atuid => $atusername) {
		notification_add($atuid, 'at', 'at_message', array(
			'from_id' => $_G['tid'], 
			'from_idtype' => 'at', 
			'buyerid' => $_G['uid'], 
			'buyer' => $_G['username'], 
			'tid' => $_G['tid'], 
			'subject' => $thread['subject'], 
			'pid' => $pid, 
			'message' => messagecutstr($message, 150)
		));
	}
}

修改回帖发送通知就到此为止。

3. 添加@提示语言文字

打开source/language/lang_notification.php 文件,添加如下语句到文档的最后面

'at_message' => '<a href="home.php?mod=space&uid={buyerid}" target="_blank">{buyer}</a> 在主题 <a href="forum.php?mod=redirect&goto=findpost&ptid={tid}&pid={pid}" target="_blank">{subject}</a> 中提到了您<div class="quote"><blockquote>{message}</blockquote></div><a href="forum.php?mod=redirect&goto=findpost&ptid={tid}&pid={pid}" target="_blank">现在去看看</a>。',

到此,添加代码部分就告一段落。

4. 设置参数

修改网站根目录下面的forum.php,添加如下参数

$_G['group']['allowat'] = 5;		//@的条数
$_G['setting']['at_anyone'] = 1;	//@任何人

其中$_G[‘setting’][‘at_anyone’] = 1 为允许@所有用户,设置0为只能@自己的好友。
$_G[‘group’][‘allowat’] = 5 允许用户最多@的人数为5个,超出后系统不解析。

如果想单独设置用户组的某个参数,那就要改1,2点中的代码实现。

5. 温馨提醒:

1. @跟好友名字不能分开
2. 必须在名字后面加一个空格
3. 发表后编辑不会发送@通知信息

6. 结语

经过一番折腾,终于能在discuz X2上面使用@功能了,好高兴啊。
其实有些事情就是非常容易而且非常容易实现的,就看你有没有这个心思去思考这个问题了。

———-Post By 柠之漠然 2013年8月11号 18点17分

让discuz X2 支持@通知功能 【声明】本文 让discuz X2 支持@通知功能 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2013/08/discuz-x2-at/ , 转载请保留本声明!

标签:
3 条评论

3 trackbacks

  1. Discount Louis Vuitton Trackback | 2013-09-11
  2. louis vuitton handbags on sale Trackback | 2013-09-12
  3. louis vuitton outlet bags Trackback | 2013-10-21
你必须要启用 Javascript