立即注册 登录
彼岸网 返回首页

天香公主的个人空间 http://www.bian-wang.com/discuz/?10005 [收藏] [复制] [分享] [RSS] txgz999@yahoo.com

日志

Discuz功能改进:如何用@来发通知

热度 4已有 1945 次阅读2014-11-20 11:30 PM |个人分类:Discuz|系统分类:社交网理论与实践

在一些论坛里,用户可以在贴子里写上另一个用户的用户名,并加一个@前缀,这样对方就会收到通知来看这个帖子。

下面是虎扑论坛里的一个例子:






下面我们尝试在Discuz系统的记录里加上这个功能。

1。 在source/language/lang_notification.php加入: 'doing_mention' => '{actor} 在 < a href="{url}" target="_blank">记录</a> 中提到了您', 2。 在source/include/spacecp/spacecp_doing.php里下面一段: if($updo['uid'] != $_G['uid']) { notification_add($updo['uid'], 'doing', 'doing_reply', array( 'url'=>"home.php?mod=space&uid=$updo[uid]&do=doing&view=me&doid=$updo[doid]&highlight=$newid", 'from_id'=>$updo['doid'], 'from_idtype'=>'doid')); updatecreditbyaction('comment', 0, array(), 'doing'.$updo['doid']); } 之后加入: if (preg_match_all("/(&nbsp;|\s|^)@(\S+)(&nbsp;|\s|$)/", $message, $matches)) { $result = array_unique($matches[2]); foreach($result as $ausername) { if(($auid = C::t('common_member')->fetch_uid_by_username($ausername))) { if (($auid != $_G['uid']) && ($auid != $updo['uid'])) { notification_add($auid, 'comment', 'doing_mention', array( 'url'=>"home.php?mod=space&uid=$auid&do=doing&view=me&doid=$updo[doid]&highlight=$newid", 'from_id'=>$updo['doid'], 'from_idtype'=>'doid')); } } } } 下面是效果图:





以上只是讨论下做法,不足为据。 类似的可以将这个功能引入日志及其评论中,在这里就不讨论了。

注:本文中的代码里的某些<符号后人为加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。

5/1/2016补充:经网友sesemule提醒,发现原来的代码只处理了记录里的回复部分,没处理记录本身。要支持记录本身的话,还要做下面的改动:
3。 在source/include/spacecp/spacecp_doing.php里下面一句: C::t('common_member_field_home')->update($_G['uid'], $setarr); 之后加入: if (preg_match_all("/(&nbsp;|\s|^)@(\S+)(&nbsp;|\s|$)/", $message, $matches)) { $result = array_unique($matches[2]); foreach($result as $ausername) { if(($auid = C::t('common_member')->fetch_uid_by_username($ausername))) { if ($auid != $_G['uid']) { notification_add($auid, 'comment', 'doing_mention', array( 'url'=>"home.php?mod=space&uid=$auid&do=doing&view=me&doid=$newdoid&highlightdoing=$newdoid", 'from_id'=>$updo['doid'], 'from_idtype'=>'doid')); } } } } 4。 在source/include/space/space_doing.php里将下面这句 $uids = $_GET['highlight'] ? array() : array($space['uid']); 改成: $uids = ($_GET['highlight'] || $_GET['highlightdoing']) ? array() : array($space['uid']); 5。 在source/include/space/space_doing.php里下面这段: $query = C::t('home_doing')->fetch_all_search($start, $perpage, 1, $uids, '', $searchkey, '', '' ,'', 1, $doid, $f_index); foreach($query as $value) { 之后加入: if($_GET['highlightdoing'] && $value['doid'] == $_GET['highlightdoing']) { $value['style'] .= 'color:#F60;'; } 6。在template/default/home/space_doing.htm里将下面这句 <dd class="{if empty($diymode)}ptm{else}ptw{/if} xs2"> 改成: <dd class="{if empty($diymode)}ptm{else}ptw{/if} xs2" style="$dv[style]">
相关代码下载: http://www.bian-wang.com/upload/txgz_doing_at_notification_160502a.zip

5/16/2016补充:应网友sesemule的要求,把这个功能扩展到日志及其评论:
1)加汉字:在文件 source/language/lang_notification.php 中加入:
'blog_mention' => '{actor} 在 < a href="{url}" target="_blank">日志</a> 中提到了您', 'blogcomment_mention' => '{actor} 在 < a href="{url}" target="_blank">日志评论</a> 中提到了您', 2)日志的通知:在文件 source/include/spacecp/spacecp_blog.php 里的下面这段
if($newblog = blog_post($_POST, $blog)) { if(empty($blog) && $newblog['topicid']) { $url = 'home.php?mod=space&uid='.$_G['uid'].'&do=topic&topicid='.$newblog['topicid'].'&view=blog&quickforward=1'; } else { $url = 'home.php?mod=space&uid='.$newblog['uid'].'&do=blog&quickforward=1&id='.$newblog['blogid']; } 后加入 if (preg_match_all("/(&nbsp;|\s|^)@(\S+)(&nbsp;|\s|$)/", $_POST['message'], $matches)) { $n_url = 'home.php?mod=space&uid='.$newblog['uid'].'&do=blog&id='.$newblog['blogid']; $result = array_unique($matches[2]); foreach($result as $ausername) { if(($auid = C::t('common_member')->fetch_uid_by_username($ausername))) { if ($auid != $_G['uid']) { notification_add($auid, 'comment', 'blog_mention', array('url'=>$n_url)); } } } } 3)日志评论的通知:
3a)新评论:在文件 source/include/spacecp/spacecp_comment.php 里的下面这段
$cidarr = add_comment($message, $id, $idtype, $cid); 后加入 if ($idtype == 'blogid') { if (preg_match_all("/(&nbsp;|\s|^)@(\S+)(&nbsp;|\s|$)/", $message, $matches)) { if($cidarr['cid'] != 0 && $comment = C::t('home_comment')->fetch($cidarr['cid'], $_G['uid'])) { $n_url = "home.php?mod=space&uid=$comment[uid]&do=blog&id=$id&cid=$cidarr[cid]"; $result = array_unique($matches[2]); foreach($result as $ausername) { if(($auid = C::t('common_member')->fetch_uid_by_username($ausername))) { if ($auid != $_G['uid']) { notification_add($auid, 'comment', 'blogcomment_mention', array('url'=>$n_url)); } } } } } } 3b)修改评论: 在文件 source/include/spacecp/spacecp_comment.php 里的下面这段
C::t('home_comment')->update($comment['cid'], array('message'=>$message, 'status'=>$comment_status)); 后加入 if ($comment['idtype'] == 'blogid') { if (preg_match_all("/(&nbsp;|\s|^)@(\S+)(&nbsp;|\s|$)/", $message, $matches)) { $n_url = "home.php?mod=space&uid=$comment[uid]&do=blog&id=$comment[id]&cid=$cid"; $result = array_unique($matches[2]); foreach($result as $ausername) { if(($auid = C::t('common_member')->fetch_uid_by_username($ausername))) { if ($auid != $_G['uid']) { notification_add($auid, 'comment', 'blogcomment_mention', array('url'=>$n_url)); } } } } }

发表评论 评论 (86 个评论)

回复 彼岸网 2016-12-13 12:02 AM
sesemule: 嗯嗯,是的是的,就是这样的效果。不知道这样改过之后,会不会对seo也有好处?因为记录的内容貌似百度是不收录的,但是把记录的内容加到标题里面之后,被收录的 ...
“被收录的可能性应该是大大提升”。。。唉,人怕出名猪怕壮,网站也一样。
回复 sesemule 2016-12-12 06:19 AM
彼岸网: 这位网友,万能的天香这段代码已经加上了。你看看标题是不是你想要的效果?
嗯嗯,是的是的,就是这样的效果。不知道这样改过之后,会不会对seo也有好处?因为记录的内容貌似百度是不收录的,但是把记录的内容加到标题里面之后,被收录的可能性应该是大大提升……
回复 彼岸网 2016-12-10 12:32 AM
sesemule: 欧耶!搞定。感谢万能的天香
这位网友,万能的天香这段代码已经加上了。你看看标题是不是你想要的效果?
回复 天香公主 2016-12-6 08:14 PM
sesemule: 欧耶!搞定。感谢万能的天香
   过奖
回复 sesemule 2016-12-5 10:48 PM
天香公主: 嗯,你说得对。可以在原来的代码
if($space['username']) {
    $navtitle = lang('space', 'sb_doing', array('who' => $space['username']));
}
后加一句:
if ...
欧耶!搞定。感谢万能的天香
回复 天香公主 2016-12-5 09:47 PM
sesemule: 天香,什么时候有空的话看看这个问题:

DZ的记录页面的title好像默认的全部都是“某某某的记录”,比如这个彼岸网友的单条记录页面:http://www.bian-wang.com/ ...
嗯,你说得对。可以在原来的代码
if($space['username']) {
    $navtitle = lang('space', 'sb_doing', array('who' => $space['username']));
}
后加一句:
if($doid && $dovalue) {
    $navtitle = $dovalue['message'].' - '.$dovalue['username'];
}
回复 sesemule 2016-12-5 05:43 AM
天香,什么时候有空的话看看这个问题:

DZ的记录页面的title好像默认的全部都是“某某某的记录”,比如这个彼岸网友的单条记录页面:http://www.bian-wang.com/discuz/home.php?mod=space&uid=10010&do=doing&doid=126 ,title是“心随风舞的记录 - 彼岸网”,同一网友的记录列表页:http://www.bian-wang.com/discuz/home.php?mod=space&uid=10010&do=doing&view=me ,title 仍然是“心随风舞的记录 - 彼岸网”。
能否修改单条记录页面的title为“记录的内容 - 记录的作者 - 网站名称”?

我猜这个跟/source/include/space/space_doing.php里的$navtitle有关,是不是?
回复 天香公主 2016-12-2 06:27 AM
sesemule: 天香真棒!一下子就能解决困扰我很久的问题。其实我之前已经找对了文件,就是代码改得不对……

然后,天香的这段修改并不准确,正确的应该是将下面这句:
$repl ...
你说的对。我忘了你问的是发布记录,我改的是发布日志
回复 sesemule 2016-12-2 05:25 AM
天香公主: 我试了试,大致应该是这样修改:在文件source/function/function_feed.php的尾部加入两个函数 addhyperlinktoat 和 addhyperlink 的定义。然后在函数 mkfeed 里 ...
天香真棒!一下子就能解决困扰我很久的问题。其实我之前已经找对了文件,就是代码改得不对……

然后,天香的这段修改并不准确,正确的应该是将下面这句:
$replaces[] = $feed['title_data'][$key];
改为
$replaces[] = addhyperlinktoat($feed['title_data'][$key]);

因为动态里的记录对应的是类似“某某某发布了日志”“某某某更新了相册”这样的title而不是日志、照片的缩略那样的body。

感谢天香!
回复 天香公主 2016-12-1 09:38 PM
sesemule: 天香,又来请教:家园动态(feed)里的记录里的 @用户名 ,如何显示链接?
我试了试,大致应该是这样修改:在文件source/function/function_feed.php的尾部加入两个函数 addhyperlinktoat 和 addhyperlink 的定义。然后在函数 mkfeed 里将下面这句
    $replaces[] = $feed['body_data'][$key];
改为
    $replaces[] = addhyperlinktoat($feed['body_data'][$key]);
回复 sesemule 2016-11-30 12:35 AM
天香公主: 嗯,你选的文件不对,spacecp里的大多是编辑状态下的网页,我们的改动要加在显示状态的网页因为我们是在显示时加链接,所以是space里的文件。

1)修改 source/ ...
天香,又来请教:家园动态(feed)里的记录里的 @用户名 ,如何显示链接?
回复 夙興夜寐罔徒勞 2016-6-13 11:24 AM
天香公主:    哦,才发现论坛里已经有这功能,我其实在Discuz网站里只用过日志和记录,所以就对它们比较熟悉。如果写本文时知道论坛和广播里有这功能的话,可以借鉴下 ...
嗯嗯,公主原创写出来,很腻害哈~

其实关于消息提醒,我稍后也想模仿官方的试试写出来,网上有个玫瑰花的插件【目前实现了虚拟币和玫瑰花的联动,还有玫瑰花的排行版】,但木有实现收花者的消息提示_(:зゝ∠)_
回复 sesemule 2016-6-13 08:14 AM
天香公主:    哦,才发现论坛里已经有这功能,我其实在Discuz网站里只用过日志和记录,所以就对它们比较熟悉。如果写本文时知道论坛和广播里有这功能的话,可以借鉴下 ...
我觉得已经非常精致了

如果可以借鉴的话,有两个功能挺有用:一个是根据后台的相关设置(可以@几个人、是否可以@非好友等)确定能否@,一个是被某会员拉入黑名单的人无法@该会员。
回复 天香公主 2016-6-13 12:19 AM
夙興夜寐罔徒勞:    那明白了。。。是木有的,我所在的论坛一般是用帖子【thread】,是那里头有艾特功能
   哦,才发现论坛里已经有这功能,我其实在Discuz网站里只用过日志和记录,所以就对它们比较熟悉。如果写本文时知道论坛和广播里有这功能的话,可以借鉴下写得和它们更一致些
回复 夙興夜寐罔徒勞 2016-6-12 03:52 PM
天香公主: 愿闻其详。我查了下好像广播里有类似的功能,但日志和记录里应该没有吧?
   那明白了。。。是木有的,我所在的论坛一般是用帖子【thread】,是那里头有艾特功能
回复 天香公主 2016-6-12 03:23 PM
夙興夜寐罔徒勞: 貌似discuz有自带的艾特功能了,和日志里介绍的区别是什么
愿闻其详。我查了下好像广播里有类似的功能,但日志和记录里应该没有吧?
回复 夙興夜寐罔徒勞 2016-6-11 06:33 PM
貌似discuz有自带的艾特功能了,和日志里介绍的区别是什么
回复 sesemule 2016-6-11 12:43 AM
天香公主: 我不熟悉这些功能也没看过有关代码,所以我也说不上会有多麻烦。不过也不可能有多复杂,无非存取数据显示数据之类的常规的工作,就象我前面说的是体力活。改天我 ...
我想再提一个改进:现在的DZ记录只能被好友看到,加好友很明显不如加关注方便,而DZ自带的是有关注功能的——只不过这个关注功能相当鸡肋,是隶属于广播功能的,而广播功能跟记录功能是部分重复的,而且天香修改过的记录在功能上完爆广播。

所以我的建议就是:把关注功能引入记录、日志、相册、动态,例如能在记录页面查看到“我和好友的记录”“我的记录”“随便看看”和“关注的记录”,即使没有加好友,只要关注了谁,就可以在“关注的记录”里看到他的更新;日志、相册、动态页面同理。
回复 天香公主 2016-5-24 11:13 AM
sesemule: 哇,听上去好麻烦,还是算了吧,不好意思再耽误您的时间了……伸手党面壁思过中
没关系,你的新问题容我有空时想想。基本上我希望每月一篇和网友分享自己的Discuz学习心得
回复 sesemule 2016-5-24 12:07 AM
天香公主: 是啊,上个周末几乎都贡献给你了,也只能偶一为之啦。你的最后一个要求我还在测试,今晚或明天贴出来。

也不是不可以,首先要改数据库在储存记录的数表里加个表 ...
哇,听上去好麻烦,还是算了吧,不好意思再耽误您的时间了……伸手党面壁思过中
12345下一页

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2017-1-24 09:21 PM , Processed in 0.063887 second(s), 22 queries.

返回顶部