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

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

日志

Discuz功能改进:个人空间里的评论页

热度 3已有 5084 次阅读2014-12-13 11:06 PM |个人分类:Discuz|系统分类:社交网理论与实践| 空间

Discuz功能改进:个人空间里的评论页

在美中网玩了那么久,发现那里有一些网友不爱自己写博文,只喜欢评论别人的博文。俗话说红花还要绿叶配,与那些博主一样,这些网友对网站的兴隆也起了重要的作用。我就不时想要看一下某位用户近来写了哪些新评论或者以往说过哪些话,但苦于没有有效的方法因为这些评论分散在各处不易寻找(除动态页给了一定帮助)。我们知道Discuz提供很方便的办法让读者找到某个作者的所有博文:进入该作者的个人空间,点击导航栏里的日志项,就看到了该作者的日志列表。但是它没提供找到某位评论作者写的所有评论的办法。本文就探讨一下如何添加这个功能。

下面是效果图,它不仅是一个评论列表,还是让用户管理自己的评论的地方,可以在那里修改和删除评论。其它用户也可以在那里的某条评论下跟评。 它还给管理员管制言论带来一定便利。



首先我们建立进入这个新的评论页的通道。

1。将评论项加入个人空间的导航栏



在template/default/home/space_header_personalnv.htm中的下面的代码: <!--{if empty($personalnv['banitems']['blog']) && helper_access::check_module('blog')}--> <li>< a href="home.php?mod=space&uid=$space[uid]&do=blog&view=me&from=space" ><!--{if !empty($personalnv['items']['blog'])}-->$personalnv['items']['blog']<!--{else}-->{lang blog}<!--{/if}--></a></li> <!--{/if}--> 后面添加 <!--{if empty($personalnv['banitems']['comment']) && helper_access::check_module('blog') }--> <li>< a href="home.php?mod=space&uid=$space[uid]&do=comment&view=me&from=space" ><!--{if !empty($personalnv['items']['comment'])}-->$personalnv['items']['comment']<!--{else}-->{lang comment}<!--{/if}--></a></li> <!--{/if}-->

注意一个用户的日志列表页能否为他人所见,取决于1)该网站是否开启了日志功能,2)该用户设置的日志列表页的阅读权限,3)该用户是否将日志加在了个人空间的导航栏里。为简化起见我们把评论功能视做是日志功能的一部分,而不是一个单独的功能。这样我们就不用修改管理前两项的网页了,这就是上面代码里check_module用的参数值是blog的原因。下面我们来修改管理第三项的网页。


2。将评论项加入装饰个人空间页的导航栏里的编辑导航菜单名称对话框并确保能够保存用户的选择:



2a) 在template/default/home/spacecp_index.htm中的下面的代码: <tr> <th>{lang blog}</th> <td> <input type="text" name="blog" value="{if !isset($personalnv[items][blog])}{lang blog}{else}$personalnv[items][blog]{/if}" class="px" /> <label><input type="radio" name="banblog" value="1"{if !empty($personalnv[banitems][blog])} checked="checked"{/if}>{lang nvhidden}</label> <label><input type="radio" name="banblog" value="0"{if empty($personalnv[banitems][blog])} checked="checked"{/if}>{lang nvshow}</label> </td> </tr> 后面添加 <tr> <th>{lang comment}</th> <td> <input type="text" name="comment" value="{if !isset($personalnv[items][comment])}{lang comment}{else}$personalnv[items][comment]{/if}" class="px" /> <label><input type="radio" name="bancomment" value="1"{if !empty($personalnv[banitems][comment])} checked="checked"{/if}>{lang nvhidden}</label> <label><input type="radio" name="bancomment" value="0"{if empty($personalnv[banitems][comment])} checked="checked"{/if}>{lang nvshow}</label> </td> </tr>
2b) 在source/include/spacecp/spacecp_index.php中的下面的代码中在blog的后面加入了comment一词:  if (submitcheck('editnvsubmit')) { $hidden = intval($_POST['nvhidden']); $nv = array('index', 'feed', 'doing', 'blog', 'comment', 'album', 'topic', 'share', 'friends', 'wall', 'profile', 'follow');
接下来我们来建造这个评论页本身。

3。在source/module/home/home_space.php里添加对评论页的支持,基本上就是在有blog和album连着的地方插入comment一词,有下面三个地方要加:

3a)$dos = array('index', 'doing', 'blog', 'comment', 'album', 'friend', 'wall', 'notice', 'share', 'home', 'pm', 'videophoto', 'favorite', 'thread', 'trade', 'poll', 'activity', 'debate', 'reward', 'profile', 'plugin', 'follow'); 3b)if(!in_array($do, array('home', 'doing', 'blog', 'comment', 'album', 'share', 'wall'))) { $_G['mnid'] = 'mn_common'; } 3c)if(empty($space)) { if(in_array($do, array('doing', 'blog', 'comment', 'album', 'share', 'home', 'trade', 'poll', 'activity', 'debate', 'reward', 'group'))) { $_GET['view'] = 'all'; $space['uid'] = 0; 4。按惯例加一个新的脚本文件source/include/space/space_comment.php: <?php if(!defined('IN_DISCUZ')) { exit('Access Denied'); } $page = empty($_GET['page'])?1:intval($_GET['page']); if($page<1) $page=1; $perpage = 20; $perpage = mob_perpage($perpage); $start = ($page-1)*$perpage; ckstart($start, $perpage); $list = array(); $userlist = array(); $count = $pricount = 0; $uids = array(); $status = null; space_merge($space, 'field_home'); $authorids[] = $space['uid']; if($_GET['from'] == 'space') $diymode = 1; $status = array(0, 1); $count = C::t('home_comment')->fetch_all_search(3, null, $authorids, null, null, null, 'blogid', null, null, null, null, null); $multi = multi($count, $perpage, $page, "home.php?mod=space&uid=$space[uid]&do=$do"); if($count) { $query = C::t('home_comment')->fetch_all_search(1, null, $authorids, null, null, null, 'blogid', null, null, $start, $perpage, null, null, null); $blogs = array(); foreach($query as $value) { $blogs[] = $value['id']; } $data_blog = C::t('home_blog')->fetch_all($blogs); $data_blogfield = C::t('home_blogfield')->fetch_all($blogs); foreach($query as $value) { $blogvalue = $data_blog[$value['id']]; $blogvalue = array_merge($blogvalue, (array)$data_blogfield[$value['id']]); if(ckfriend($blogvalue['uid'], $blogvalue['friend'], $blogvalue['target_ids']) && ( ($blogvalue['status'] == 0 && $blogvalue['friend'] != 4) || $blogvalue['uid'] == $_G['uid'] || $_G['adminid'] == 1)) { $value['username'] = $blogvalue['username']; $value['subject'] = $blogvalue['subject']; $list[] = $value; } else { $pricount++; } } } dsetcookie('home_diymode', $diymode); if($space['username']) { $navtitle = lang('space', 'sb_comment', array('who' => $space['username'])); } $navtitle = helper_seo::get_title_page($navtitle, $_G['page']); space_merge($space, 'field_home'); $_GET['pagedo'] = $_GET['do']; include_once template("diy:home/space_comment_list"); ?> 5。按惯例加一个新的模板文件template/default/home/space_comment_list.htm: <!--{if $_G[setting][homepagestyle]}--> <!--{subtemplate home/space_header}--> <!--{else}--> <!--{template common/header}--> <!--{/if}--> <div id="ct" class="ct2 wp cl"> <div class="mn"> <div class="bm"> <div class="bm_h"> <h1 class="mt">{lang comment}</h1> </div> <div class="bm_c"> <div id="comment_ul" class="xld xlda"> <!--{loop $list $value}--> <!--{template home/space_comment_li}--> <!--{/loop}--> </div> <!--{if $pricount}--> <p class="mtm">{lang hide_comment}</p> <!--{/if}--> </div> <!--{if $multi}--><div class="pgs cl mbm">$multi</div><!--{/if}--> </div> <!--{if $_G[setting][homepagestyle]}--> </div> <div class="sd"> <!--{subtemplate home/space_userabout}--> <!--{/if}--> </div> </div> <!--{template common/footer}--> 6。按惯例要在页面上显示的中文词语集中定义在专门的脚本文件里。
6a) 在source/language/lang_space.php里加: 'sb_comment' => '{who}的评论', 6b) 在source/language/home/lang_template.php里加: 'hide_comment' => '本页有 $pricount 篇评论因日志作者的隐私设置或未通过审核而隐藏',
7。每个评论行是在现有的模板文件template/default/home/space_comment_li.htm里定义的,这是用于日志页里显示评论的,现在我们将它用于评论页,这样评论页上的评论行也能利用现有的编辑,删除,回复等功能。但就需要对该文件做些修改,使之能同时用于这两个网页。注意从下图可见,有关日志标题和作者名及其链接仅出现在评论页里。

<!--{if $value['subject']}--> < a href="home.php?mod=space&uid=$value[uid]&do=blog&id=$value[id]" target="_blank">$value[subject]</a> &nbsp; (< a href="home.php?mod=space&uid=$value[uid]" c="1">$value[username]</a>) <!--{/if}--> 为此我们需要一个标记在区分两者,我们引进变量pagedo来区分两者。在日志页里它的值为blog,而在评论页里它的值为comment。
< a href="home.php?mod=spacecp&ac=comment&op=edit&cid=$value[cid]&handlekey=editcommenthk_{$value[cid]}&pagedo=$_GET[pagedo]" id="c_$value[cid]_edit" onclick="showWindow(this.id, this.href, 'get', 0);">{lang edit}</a> 上面一行代码里的&pagedo=$_GET[pagedo]是新加的。
下面四个文件的修改也是为了来支持这个变量:
8。template/default/home/spacecp_comment.htm: <form id="editcommentform_{$cid}" name="editcommentform_{$cid}" method="post" autocomplete="off" action="home.php?mod=spacecp&ac=comment&op=edit&cid=$cid{if $_GET[modcommentkey]}&modcommentkey=$_GET[modcommentkey]{/if}&pagedo=$_GET[pagedo]" {if $_G[inajax]} onsubmit="ajaxpost(this.id, 'return_$_GET[handlekey]');"{/if}> 上面一行代码里的&pagedo=$_GET[pagedo]是新加的。 function succeedhandle_$_GET['handlekey'] (url, message, values) { comment_edit(values['cid'], values['pagedo']); } 上面一段代码里的, values['pagedo']是新加的。
9。source/include/spacecp/spacecp_comment.php: showmessage('do_success', dreferer(), array('cid' => $comment['cid'], 'pagedo' => $_GET['pagedo']), array('showdialog' => 1, 'showmsg' => true, 'closetime' => true)); 上面一行代码里的, 'pagedo' => $_GET['pagedo']是新加的。
10。 static/js/home.js: function comment_edit(cid, pagedo) { var obj = $('comment_'+ cid +'_li'); var x = new Ajax(); x.get('home.php?mod=misc&ac=ajax&op=comment&inajax=1&cid='+ cid + '&pagedo=' + pagedo, function(s){ obj.innerHTML = s; var elems = selector('dd[class~=magicflicker]'); for(var i=0; i<elems.length; i++){ magicColor(elems[i]); } }); } 上面一段代码里的, pagedo + '&pagedo=' + pagedo是新加的。
11。 source/include/misc/misc_ajax.php: if($op == 'comment') { $dreferer = dreferer(); $cid = empty($_GET['cid'])?0:intval($_GET['cid']); if($cid) { $ajax_edit = 1; } else { $ajax_edit = 0; } $list = array(); $value = C::t('home_comment')->fetch_latest_by_authorid($_G['uid'], $cid); if ($_GET['pagedo']=='comment') { $blogvalue = array_merge( C::t('home_blog')->fetch($value['id']), C::t('home_blogfield')->fetch($value['id']) ); if(ckfriend($blogvalue['uid'], $blogvalue['friend'], $blogvalue['target_ids']) && (($blogvalue['status'] == 0 && $blogvalue['friend'] != 4) || $blogvalue['uid'] == $_G['uid'] || $_G['adminid'] == 1)) { $value['username'] = $blogvalue['username']; $value['subject'] = $blogvalue['subject']; } } $list[] = $value; 上面一段代码里的$_GET['pagedo']=='comment'条件从句是新加的。

1/30/15补充:
和HQ讨论后感觉可以从三个方面修改来支持评论者拥有评论的权利
1)当博主删掉评论时,在数据库里仍保留该评论,只断掉评论和日志的联系
在文件source/function/function_delete中的函数deletecomments里将下面一段代码 foreach($query as $value) { if($allowmanage || $value['authorid'] == $_G['uid'] || $value['uid'] == $_G['uid']) { $dels[] = $value; $newcids[] = $value['cid']; $deltypes[] = $value['idtype'].'_cid'; if($value['authorid'] != $_G['uid'] && $value['uid'] != $_G['uid']) { $counts[$value['authorid']]['coef'] -= 1; } if($value['idtype'] == 'blogid') { $blognums[$value['id']]++; } } } if(empty($dels)) return array(); C::t('home_comment')->delete($newcids); 改为 foreach($query as $value) { if($allowmanage || $value['authorid'] == $_G['uid'] || $value['uid'] == $_G['uid']) { $dels[] = $value; $newcids[] = $value['cid']; $deltypes[] = $value['idtype'].'_cid'; if($value['authorid'] != $_G['uid'] && $value['uid'] != $_G['uid']) { $counts[$value['authorid']]['coef'] -= 1; } if($value['idtype'] == 'blogid') { $blognums[$value['id']]++; } if($allowmanage || $value['authorid'] == $_G['uid']) { $newcids1[] = $value['cid']; } else { $newcids2[] = $value['cid']; } } } if(empty($dels)) return array(); C::t('home_comment')->delete($newcids1); if(!empty($newcids2)) DB::update("home_comment", array('id' => 0), DB::field('cid', $newcids2)); 2)当日志在页面上被删除(在日志回收站没被启用时)或在日志回收站被清除(如果日志回收站已经启用)时,在数据库里仍保留所有评论,只断掉评论和日志的联系
在文件source/function/function_delete中的函数deleteblogs里将下面一行代码 C::t('home_comment')->delete('', $newblogids, 'blogid'); 改为 DB::update("home_comment", array('id' => 0), DB::field('id', $newblogids)); 3)在评论页上向评论作者本人显示所有他写的评论
在文件source/include/space/space_comment.php里将下面一段代码 foreach($query as $value) { $blogvalue = $data_blog[$value['id']]; $blogvalue = array_merge($blogvalue, (array)$data_blogfield[$value['id']]); if(ckfriend($blogvalue['uid'], $blogvalue['friend'], $blogvalue['target_ids']) && ( ($blogvalue['status'] == 0 && $blogvalue['friend'] != 4) || $blogvalue['uid'] == $_G['uid'] || $_G['adminid'] == 1)) { $value['username'] = $blogvalue['username']; $value['subject'] = $blogvalue['subject']; $list[] = $value; } else { $pricount++; } } 改为 foreach($query as $value) { if ($value['id']) { $blogvalue = $data_blog[$value['id']]; $blogvalue = array_merge($blogvalue, (array)$data_blogfield[$value['id']]); if(ckfriend($blogvalue['uid'], $blogvalue['friend'], $blogvalue['target_ids']) && ( ($blogvalue['status'] == 0 && $blogvalue['friend'] != 4) || $blogvalue['uid'] == $_G['uid'] || $_G['adminid'] == 1)) { $value['username'] = $blogvalue['username']; $value['subject'] = $blogvalue['subject']; $list[] = $value; } elseif ($value['authorid'] == $_G['uid']) { $list[] = $value; } else { $pricount++; } } else { if ($value['authorid'] == $_G['uid'] || $_G['adminid'] == 1) { $list[] = $value; } else { $pricount++; } } }

注:本文中的代码里的<符号如果后面的字符是a的话,在它们中间加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。

发表评论 评论 (33 个评论)

回复 sesemule 2018-1-5 10:37 AM
天香公主: 这些统计数字都是存在数据库里的,而且是添加这些东西时记录的。我们就简单些,显示这个个人资料页时,算一下评论数。

1)添加"评论数"这三个汉字,在文件so ...
   搞定
回复 天香公主 2018-1-5 01:16 AM
sesemule: 天香,能否在个人资料页显示发表的总评论的数量呢?
这些统计数字都是存在数据库里的,而且是添加这些东西时记录的。我们就简单些,显示这个个人资料页时,算一下评论数。

1)添加"评论数"这三个汉字,在文件source/language/home/lang_template.php里加入
    'comments_num' => '评论数',
2)从数据库里得到评论数,修改文件source/include/space/space_profile.php,在下一行
    getonlinemember(array($space['uid']));
后加入
    $space['comments'] = C::t('home_comment')->fetch_all_search(3, null, array($space['uid']), null, null, null, 'blogid', null, null, null, null, null);
3)显示评论数,修改文件template/default/home/space_profile_body.htm,在下面这行
    <a href="home.php?mod=space&uid=$space[uid]&do=blog&view=me&from=space" target="_blank">{lang blogs_num} $space[blogs]</a>
后加入
    <span class="pipe">|</span>
    <a href="home.php?mod=space&uid=$space[uid]&do=comment&view=me&from=space" target="_blank">{lang comments_num} $space[comments]</a>

以上假定你已经加了本文中说的个人空间里的评论页而且你只要显示日志里的评论数。

如果你要显示日志相册文章里的评论总数,可以将2)里添加的那句改成
    $space['comments'] = C::t('home_comment')->fetch_all_search(3, null, array($space['uid']), null, null, null, null, null, null, null, null, null);

另外如果你没有加个人空间里的评论页或者是要显示日志相册文章里的评论总数,可以将3)里添加的第二句改成
    {lang comments_num} $space[comments]
回复 sesemule 2018-1-4 11:24 AM
天香,能否在个人资料页显示发表的总评论的数量呢?
回复 天香公主 2016-3-21 11:20 PM
忆江南: 哈,原来这么简单 我加上了,不过怎么做到点了链接后,专开一页,列出会员及头像,象城里那样?这样的话,我可以在《关于彼岸》博友后面加一项《会员》。 ...
估计他们加了个专题页(管理中心,门户->专题管理->创建专题),然后在那个专题页上加了个DIY模块
回复 忆江南 2016-3-21 10:57 PM
算了,现在好像也还凑合。
回复 忆江南 2016-3-21 10:45 PM
天香公主: 估计是加个DIY模块,选择会员类里的会员模块,其中可以选择用户排序方式,比如按日志数倒序排列。
哈,原来这么简单 我加上了,不过怎么做到点了链接后,专开一页,列出会员及头像,象城里那样?这样的话,我可以在《关于彼岸》博友后面加一项《会员》。
回复 天香公主 2016-3-21 10:34 PM
忆江南: 关于这个,我又想了一下,更简单的解决办法是象别的网站那样设个会员榜,点击一下找到个人空间那就什么都解决了。不过很惭愧,我不知道怎么设会员榜。 ...
估计是加个DIY模块,选择会员类里的会员模块,其中可以选择用户排序方式,比如按日志数倒序排列。
回复 忆江南 2016-3-21 10:29 PM
天香公主: 好的,我下周试试。是打算在主导航栏(博客/分享/相册/帮助/微博/动态)上加个'评论'链接,还是要从其它地方进入? ...
关于这个,我又想了一下,更简单的解决办法是象别的网站那样设个会员榜,点击一下找到个人空间那就什么都解决了。不过很惭愧,我不知道怎么设会员榜。
回复 忆江南 2016-3-3 09:59 PM
天香公主: 好的,我下周试试。是打算在主导航栏(博客/分享/相册/帮助/微博/动态)上加个'评论'链接,还是要从其它地方进入? ...
本来是打算放在《关于彼岸》《博友》后面,现在觉得你的方案更好,但相比之下实现后者是不是要麻烦些?
回复 天香公主 2016-3-3 11:01 AM
忆江南: 能不能做一个评论的目录,就像这个一样:http://www.bian-wang.com/discuz/home.php?mod=space&uid=10005&do=blog&id=192
点了头像或ID后就可以看到Ta的评论页? ...
好的,我下周试试。是打算在主导航栏(博客/分享/相册/帮助/微博/动态)上加个'评论'链接,还是要从其它地方进入?
回复 忆江南 2016-3-2 11:27 PM
能不能做一个评论的目录,就像这个一样:http://www.bian-wang.com/discuz/home.php?mod=space&uid=10005&do=blog&id=192
点了头像或ID后就可以看到Ta的评论页?
回复 天香公主 2015-2-3 11:43 PM
忆江南: “既有政策问题又有技术问题”,哦,我没想到这么多。看来没有两全其美的办法,那就算了吧。
   同意,没在网站上改的必要
回复 忆江南 2015-2-3 11:35 PM
天香公主: 上面3)里的 $value['authorid'] == $_G['uid'] 条件决定了只有评论者(其实还有管理员)才能看到这些评论。

假如要让其他人看到这些评论,既有政策问题又有技 ...
“既有政策问题又有技术问题”,哦,我没想到这么多。看来没有两全其美的办法,那就算了吧。
回复 天香公主 2015-2-3 11:23 PM
忆江南: 我有点不清楚:“改了3)后,评论者才能在评论页上看到这些评论”,那么别人能看到吗?如果只有评论者才能看到,那么保存了似乎也没有太大意义。 ...
上面3)里的 $value['authorid'] == $_G['uid'] 条件决定了只有评论者(其实还有管理员)才能看到这些评论。

假如要让其他人看到这些评论,既有政策问题又有技术问题。从技术上讲,当那篇日志从数据库里被删除后,我们就没法知道那篇日志当初的隐私设置是仅自己可见还是好友可见还是指定好友可见还是密码可见还是公开。所以也没法知道应该让哪些人看到这些评论。我想如果一篇仅好友可见的日志如果删除后里面的评论变成大家都可以看到了好像不妥吧
回复 忆江南 2015-2-3 11:01 PM
天香公主: 对,不过我改了下2)里的话,旨在说明这个断掉评论和日志关系的改动发生在日志被从数据库里删除时,而不是在页面上被删除时(如果系统启用了回收站)。因为不然 ...
我有点不清楚:“改了3)后,评论者才能在评论页上看到这些评论”,那么别人能看到吗?如果只有评论者才能看到,那么保存了似乎也没有太大意义。
回复 天香公主 2015-2-3 12:35 AM
忆江南: 2),只要改一句就行了吗?
对,不过我改了下2)里的话,旨在说明这个断掉评论和日志关系的改动发生在日志被从数据库里删除时,而不是在页面上被删除时(如果系统启用了回收站)。因为不然的话要是日志在回收站里被恢复,就没法恢复评论和日志的联系了。

不过只改2)不改3)的话,被删掉的日志的评论虽然还在,却没在评论页上显示出来。只有改了3)后,评论者才能在评论页上看到这些评论。
回复 忆江南 2015-2-2 11:58 PM
天香公主: 我将代码加在了文末,你检查下
2),只要改一句就行了吗?
回复 天香公主 2015-2-2 07:22 PM
忆江南: 怎么谢我呢 谢谢你才对。但我倒想起一个问题,你说“让评论在博文被删后继续存在”,这个功能怎么实现? ...
我将代码加在了文末,你检查下
回复 忆江南 2015-1-31 11:30 PM
你补充中的2)是一个比较好的折衷。
回复 忆江南 2015-1-29 12:06 AM
天香公主: 对,现在这个功能里一位读者能否看到一个评论的标准是基于现有Discuz系统的标准,也就是如果该读者能看到评论所在的日志。所以如果日志作者隐藏了日志,那日志里 ...
对,如果说博主对博文有所有权,那评论者就对评论有所有权,最好可以独立于博文继续存在。
12下一页

facelist doodle 涂鸦板

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

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2024-3-29 11:01 AM , Processed in 0.029575 second(s), 11 queries. ,ApcOn

返回顶部