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

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

日志

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

热度 5已有 2654 次阅读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)); } } } } }

发表评论 评论 (140 个评论)

回复 carry0987 2017-3-8 11:26 PM
天香公主: 嗯,之所以问题只出在手机上,而在电脑和iPad上没问题是因为文件source/function/function_blog.php 里的函数 blog_post 里有下面这段:
if($_G['mobile']) {
    ...
在後面多加一個 0 後就解決問題了,我提交到git上吧....
測試結果:https://www.fucknehs.com/home.php?mod=space&uid=1&do=blog&quickforward=1&id=27
回复 carry0987 2017-3-8 11:20 PM
天香公主: 嗯,之所以问题只出在电话上,而在电脑和iPad上没问题是因为文件source/function/function_blog.php 里的函数 blog_post 里有下面这段:
if($_G['mobile']) {
    ...
屬於特殊情況.....
但是,你也知道,Dz的手機版功能實在是太少了,連BBcode都不能用,也因為現在的手機屏幕越來越大,所以在手機上使用電腦版的情況其實不在少數
回复 天香公主 2017-3-8 11:04 PM
carry0987: 官方在Git上表示無法修復,因為編輯器很容易在修正一個錯誤後同時新增更多的錯誤....他們表示當初Dz的js堅持自己寫,所以產生了這個大坑 ...
嗯,之所以问题只出在手机上,而在电脑和iPad上没问题是因为文件source/function/function_blog.php 里的函数 blog_post 里有下面这段:
if($_G['mobile']) {
    $POST['message'] = getstr($POST['message'], 0, 0, 0, 1);
    $POST['message'] = censor($POST['message']);
} else {
    $POST['message'] = getstr($POST['message'], 0, 0, 0, 0, 1);
    $POST['message'] = censor($POST['message']);
    ....
如果在电话上提交日志,$_G['mobile']非空,所以执行的是前一部分代码,而电脑和iPad上提交日志,则执行后半部分的代码。所以结果就不同了。如果把这判断和前半部分去掉,估计就解决了你的问题,但这样做会产生新问题吗?我不敢断言。

估计这个问题只有在手机上用Discuz的电脑版才出现吧。大多数人在手机上应该是用手机版或APP吧?
回复 carry0987 2017-3-8 10:49 PM
天香公主: 哦,qbnehs.com是3.2, 我想在那试下,但上次开的账号不能用了,你可以自己试试。我刚在3.1彼岸网上试了试,也有同样问题。又在我的测试站里把各个版本都试过了, ...
官方在Git上表示無法修復,因為編輯器很容易在修正一個錯誤後同時新增更多的錯誤....他們表示當初Dz的js堅持自己寫,所以產生了這個大坑
回复 天香公主 2017-3-8 10:30 PM
carry0987: 重灌回3.2也可以,www.qbnehs.com這個是測試用的
哦,qbnehs.com是3.2, 我想在那试下,但上次开的账号不能用了,你可以自己试试。我刚在3.1彼岸网上试了试,也有同样问题。又在我的测试站里把各个版本都试过了,可以确信这不是新版带来的新问题。你也可以去那里试试 https://ngcorner.com
回复 carry0987 2017-3-8 01:25 AM
天香公主: 我在安卓手机上做了些测试。觉得这不是个Discuz3.3/PHP7的新问题。Discuz3.2/PHP5.6同样也有这个问题,即发新日志添加相册图片提交后图片显示成代码了。 ...
重灌回3.2也可以,www.qbnehs.com這個是測試用的
回复 天香公主 2017-3-8 12:41 AM
carry0987: 呃.....完了.....
iPhone的模擬器只有Mac有...Mac上的Xcode....
PC只能模擬Android了..
說不定在Android 上也有一樣的問題,用Android模擬器試試吧... ...
我在安卓手机上做了些测试。觉得这不是个Discuz3.3/PHP7的新问题。Discuz3.2/PHP5.6同样也有这个问题,即发新日志添加相册图片提交后图片显示成代码了。你以前没有这问题吗?你还有Discuz3.2的网站可以试一下吗?
回复 carry0987 2017-3-2 12:03 PM
天香公主: 嗯,等我这两天买个hosting service来试试,你知道哪个pc上用的iPhone emulator好用?
呃.....完了.....
iPhone的模擬器只有Mac有...Mac上的Xcode....
PC只能模擬Android了..
說不定在Android 上也有一樣的問題,用Android模擬器試試吧...
回复 天香公主 2017-3-2 08:51 AM
carry0987: 這種情況發生在手機上..怎麼辦?
嗯,等我这两天买个hosting service来试试,你知道哪个pc上用的iPhone emulator好用?
回复 carry0987 2017-3-1 11:24 PM
這種情況發生在手機上..怎麼辦?
回复 carry0987 2017-2-21 12:57 AM
天香公主: 用iPad在你的网站试过了没问题(abc999),等过几天借个iPhone再试试。你自己不妨也再试试看?
這是測試過程:
https://qbnehs.besv.net/video/testvideo1.mov
回复 天香公主 2017-2-21 12:15 AM
carry0987: 電腦沒這個問題,php7.0,是用dz帶的功能加的
https://www.fucknehs.com
用iPad在你的网站试过了没问题(abc999),等过几天借个iPhone再试试。你自己不妨也再试试看?
回复 carry0987 2017-2-20 09:33 PM
天香公主: 不知是哪个网站?我想去试试。在电脑里有同样问题吗?PHP版本?这个图片是用Discuz带着的功能加的,还是用了我添加的一键贴? ...
電腦沒這個問題,php7.0,是用dz帶的功能加的
https://www.fucknehs.com
回复 天香公主 2017-2-20 04:25 PM
carry0987: 天香,X3.3的日至功能貌似有問題...我用iPhone寫了一篇圖片日誌,結果卻沒有圖片,反而出現一堆代碼..
...
不知是哪个网站?我想去试试。在电脑里有同样问题吗?PHP版本?这个图片是用Discuz带着的功能加的,还是用了我添加的一键贴?
回复 carry0987 2017-2-20 02:50 PM
天香,X3.3的日至功能貌似有問題...我用iPhone寫了一篇圖片日誌,結果卻沒有圖片,反而出現一堆代碼..
回复 carry0987 2017-2-19 10:22 PM
天香公主: 我在Chrome里打开Developer Tools。将鼠标放在白条上,右击选择inspect,在Elements tab下看到被选的是一个p。右击选择Hide element后,白条还在,说明白条与它无 ...
太厲害了......原來可以這樣用....謝謝天香
回复 天香公主 2017-2-19 10:20 PM
carry0987: 你怎麼找到的?!我用Firebug也沒看到...只有顯示部分style.css的內容...
我在Chrome里打开Developer Tools。将鼠标放在白条上,右击选择inspect,在Elements tab下看到被选的是一个p。右击选择Hide element后,白条还在,说明白条与它无关。继续点击这个p的parent element,  同样右击选择Hide element后看白条在不在。一层层上去,直到发现一个div,选择Hide element后白条不见了,从右端窗口的filter列表里就看到它有个背景图片。
回复 carry0987 2017-2-19 09:34 PM
天香公主: 哦,这个白色长条是 https://www.fucknehs.com/static/space/t2/images/ct-bottom.png,用在static/space/t2/style.css里的下面这句里
body#space #ft { backgro ...
你怎麼找到的?!我用Firebug也沒看到...只有顯示部分style.css的內容...
回复 天香公主 2017-2-19 08:16 PM
carry0987: 呃,不是,我講清楚一點我的問題好了,我想知道是什麼原因導致footer的部分在個人空間會出現一條白色的東西?而在首頁卻不會出現?
[img]http://i.imgur.com/LxLZP ...
哦,这个白色长条是 https://www.fucknehs.com/static/space/t2/images/ct-bottom.png,用在static/space/t2/style.css里的下面这句里
body#space #ft { background: url(images/ct-bottom.png) no-repeat 0 0; }
回复 carry0987 2017-2-19 02:09 AM
天香公主: 我不太明白你要到达的效果。但估计是要加个overflow: hidden; 至于加在哪里,可以在Firefox里用Firebug或Chrome里用Developer Tools检查下DOM结构就清楚了。 ...
呃,不是,我講清楚一點我的問題好了,我想知道是什麼原因導致footer的部分在個人空間會出現一條白色的東西?而在首頁卻不會出現?

facelist doodle 涂鸦板

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

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2017-3-27 02:39 AM , Processed in 0.064901 second(s), 22 queries.

返回顶部