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

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

日志

Discuz功能改进:显示最新评论

热度 2已有 8844 次阅读2013-12-29 05:38 PM |个人分类:Discuz|系统分类:社交网理论与实践

HQ给我出了个题目,如何在首页显示最新评论,类似于下面的式样: http://blog.eastday.com/nba2046

我觉得这是一个很有用的功能,因为我在网站上经常找不到当前的热点,即不知道网友们当前去哪篇博文里讨论问题了。


要加上这个功能,用Discuz系统的用词说就是要建造有这样一个功能的DIY模块。在解释如何建造这个模块前,我们先来了解一下有关的基本概念。


Discuz系统提供的很多网页都支持DIY(Do It Yourself),即由各个网站自己决定安排网页上的内容。 特别是门户页没有默认的内容,网站如果不加内容进去的话就是一片空白。网站在网页上可以加入诸如最新日志栏,用户列表之类的东西,这些叫做DIY模块(block)。还有一个个人空间首页,每个用户可以在那里自行安放模块。


上图模块字样下面一行中里的每一个称为一个模块大分类,如论坛类,群组类等。它们每一个对应了source\class\block文件夹里的一个子夹,如空间类对应着source\class\block\space。在每个这样的子夹里,有一个叫blockclass.php的文件,其中定义了该模块大分类的名字。

这个子文件夹里的每个PHP文件都包含一个模块数据类的定义。在类的定义里指明它所属的模块类的名字。如在空间类里就有相册模块,日志模块,记录模块和图片模块。几个模块数据类组成了一个模块类。如在日志模块类里有热门日志,最新日志,指定日志和高级自定义这些模块数据类。 举例而言,热门日志这个模块数据类来自block_bloghot.php文件。


在建造了模块数据类后,我们还应提供一个或几个模板(template)来显示这样的数据,这可以在管理中心的门户页上的模块模板里设置。注意这样的模是和一个模块类联系来一起的。所以虽然在定义模块数据类时,模块类似乎只是一个名字而已,在这里可以看出同一模块类下的各模块数据类应该提供同样类型的数据。一个模块类下有一个或几个模块数据类,和一个或几个模块模板。

注意在添加或修改了模块文件后,要去管理中心的管理中心的工具页上更新DIY 模块分类缓存。这样在定义模板时才能看到新的字段(field)。


当我们将一个模块类放到页面上去的时候,我们需要选择一个模块数据类作为数据来源和一个模板作为它的显示样式。

注意在添加或修改了模板后,界面上有可能并没立刻发生变化。这是因为模板数据是存在缓存里的。所以要去管理中心的工具页去更新模板缓存。


接下来介绍一下最新评论栏的具体做法。首先添加一个模块数据类的文件: source\class\block\space\block_commentnew.php。这文件里定义的类名应该和文件名相同,而且要扩展模块数据类的基类:

class block_commentnew extends discuz_block { 在类的定义里要指明该模块数据类的名字: function name() { return '最新评论'; } 和所属模块类的名字。这里第一个参数是该模块类的识别符,在不同的大分类里的模块类中不能有同样的识别符, 第二个参数是模块的名字。注意模块所属的模块大分类是由该文件的位置决定的。 function blockclass() { return array('comment', '评论模块'); }
接下来我们要定义该模块数据类输出的数据样式,也就是要输出哪些字段(field)。
function fields() { return array( 'id' => array('name' => '评论ID', 'formtype' => 'text', 'datatype' => 'int'), 'title' => array('name' => '评论标题', 'formtype' => 'title', 'datatype' => 'title'), 'blogurl' => array('name' => '日志链接', 'formtype' => 'text', 'datatype' => 'string'), 'authorurl' => array('name' => '作者链接', 'formtype' => 'text', 'datatype' => 'string'), 'author' => array('name' => '作者', 'formtype' => 'text', 'datatype' => 'string'), 'time' => array('name' => '发布时间', 'formtype' => 'text', 'datatype' => 'string'), ); } 一个模块应该是能反复使用的,所以应该提供一些能让使用者决定的设置。这里为说明概念起见,我们只提供一项设置:就是显示评论的前多少个字。 function getsetting() { return array( 'titlelength' => array('title' => '显示长度', 'type' => 'text', 'default' => 40), ); } 最后就是如何从数据库里找到评论。所有的日志都存在home_blog表里,其中的friend列值为0意味着它是公开的日志,status列值为0意味着它通过了审核。所有的评论都存在home_comment表里,status列值为0意味着评论通过了审核。 function getdata($style, $parameter) { $titlelength = $parameter['titlelength'] ? intval($parameter['titlelength']) : 40; $items = isset($parameter['items']) ? intval($parameter['items']) : 10; $list = array(); $sql = "SELECT c.cid, c.author, c.authorid, FROM_UNIXTIME(c.dateline, '%m/%d %H:%i') as time, c.message, b.uid, b.blogid FROM ".DB::table('home_comment')." c"; $sql = $sql." INNER JOIN ".DB::table('home_blog')." b ON c.id=b.blogid and b.friend = '0' and b.status = '0' "; $sql = $sql." WHERE c.status = '0'"; $sql = $sql." ORDER BY c.dateline DESC LIMIT 0, $items"; $query = DB::query($sql); while($data = DB::fetch($query)) { $list[] = array( 'id' => $data['cid'], 'title' => cutstr($data['message'], $titlelength, ''), 'fields' => array( 'blogurl' => 'home.php?mod=space&uid='.$data['uid'].'&do=blog&id='.$data['blogid'], 'authorurl' => 'home.php?mod=space&uid='.$data['authorid'], 'author' => $data['author'], 'time' => $data['time'], ) ); } return array('html' => '', 'data' => $list); } 注意虽然我们前面只定义了一项设置,就是显示长度。但有一些设置是所有模块数据类共有的。如显示条数(items)。所以上面的代码里也检查了这项设置。

另外很重要的是,除个别字段外大多数字段要加在fields里面。据Discuz技术文库介绍“除 id,idtype, title, url, pic, picflag, summary 几个字段外,其它字段需要放到 fields 数组里”,不然这些字段的数值在将模块放入页面的设置完成后会消失。这样做的一个原因是前面那几个字段是所有模块都有的,在储存时他们的值也在数表 common_block 里各占据一个表列,而其余字段是各模块自己按需要定义的,他们的值合在一起储存在一个名叫 param 的表列里。

在管理中心的管理中心的工具页上更新DIY 模块分类缓存后,就可以在管理中心的门户页中的模块模板里为新的模块设置一个模块模板。

下面是我写的模板的具体内容: <div class="module cl"> <table style="border: solid lightgrey 1px; border-collapse: collapse;"> [loop] <tr><td style="border: dashed lightgrey 1px;"> <div>< a href="{authorurl}" target="_blank">{author}</a> <span style="margin-left: 10px;">{time}</span></div> <div>< a href="{blogurl}" target="_blank">{title}</a></div> </td></tr> [/loop] </table> </div> 在管理中心的工具页更新模板缓存后,我们就可以去门户页将新的模块加入页面了。


这样我们就在门户页上添加了一个最新评论栏。点击某条评论就能进到包含该评论的日志里了。



参考资料: Discuz! 技术文库, 第三方DIY模块拓展类的开发



注:在本文中的代码中,在<符号和a字符相连的地方在两者之间加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (32 个评论)

回复 彼岸网 2014-9-20 11:11 PM
天香公主: 对,除了backup,还可以有个类似restore的功能,让网友随时可以将在一个Discuz网站里的所有博文在另一个Discuz网站里重建。

我刚发现N岸N地今日看点里加了瀚山 ...
咦,我怎么没看到这个回复,是不是你把原来的回复修改过。
对,我加了酷网。小网站按拼音排列,大网站按内容排列。
回复 天香公主 2014-9-18 06:32 AM
彼岸网: 那里的博客没有摘要,看起来不太方便。个人博客备份是个好东西,可惜Discuz没这功能。
对,除了backup,还可以有个类似restore的功能,让网友随时可以将在一个Discuz网站里的所有博文在另一个Discuz网站里重建。

我刚发现N岸N地今日看点里加了瀚山酷网,是你加的吗?
回复 彼岸网 2014-9-15 05:37 PM
天香公主: 我以前以为WordPress指wordpress.com里造博客的软件,最近听朋友介绍才知道还有个wordpress.org, 它里面的工具可以很方便的用来造页面。有很多第三方免费或收费 ...
那里的博客没有摘要,看起来不太方便。个人博客备份是个好东西,可惜Discuz没这功能。
回复 天香公主 2014-9-15 12:12 AM
彼岸网: 我印象中一直是个人博客用WordPress比较多,服务商也提供了WP套件,装Discuz还是因为在美中网用惯了。你这评论功能也挺好啊,反正“马甲十几副,活人七八个”(Z ...
我以前以为WordPress指wordpress.com里造博客的软件,最近听朋友介绍才知道还有个wordpress.org, 它里面的工具可以很方便的用来造页面。有很多第三方免费或收费的插件可用。我是在翰山的新网站上看到人在议论华博网的,据华博网的站主白凡说这个网站是在他的个人博客基础上建立的,所以估计那里的功能比较简单。

刚注意到华博网上有个博客备份的按钮,应该是WordPress提供的一个很有用的功能。好像在N岸N地的几个网站上没看到有这样的功能。
回复 彼岸网 2014-9-14 11:51 PM
天香公主: 刚才看到华博网的门户页也有类似的最新评论栏。那里用的是WordPress,在美国很多人用。
我印象中一直是个人博客用WordPress比较多,服务商也提供了WP套件,装Discuz还是因为在美中网用惯了。你这评论功能也挺好啊,反正“马甲十几副,活人七八个”(ZT)。华博网第一次听说,看起来不错,但界面不太习惯。他们的评论功能应该是现成的第三方插件吧。
回复 天香公主 2014-9-14 11:17 PM
刚才看到华博网的门户页也有类似的最新评论栏。那里用的是WordPress,在美国很多人用。
回复 彼岸网 2014-2-1 09:44 PM
如果要实现最新评论实时更新(目前是1分钟),你觉得哪个更靠谱些?http://www.discuz.net/thread-1806481-1-1.html
http://hi.baidu.com/ah_hyy/item/c295cfe84b3459a5cf2d4fcf
回复 彼岸网 2014-1-15 08:37 PM
天香公主: 如果你想显示博主对他人评论的回复,但不显示博主自己的评论的话,可以比较一下home_comment里authorid和uid。
明白了,不过现在就这样了。
回复 天香公主 2014-1-15 07:32 AM
彼岸网: 我把最新评论中作者的评论又恢复了,等以后这样做有问题的时候再说。现在反正捞干的没几个。
如果你想显示博主对他人评论的回复,但不显示博主自己的评论的话,可以比较一下home_comment里authorid和uid。
回复 彼岸网 2014-1-14 08:04 PM
我把最新评论中作者的评论又恢复了,等以后这样做有问题的时候再说。现在反正捞干的没几个。
回复 彼岸网 2014-1-9 09:00 PM
天香公主: 这个系统不算复杂,管理软件说到底也就是CRUD。但它的扩展功能好象很强大的,值得了解。有些事通过修改源码不难实现(如我的一个推荐博文目录的讨论),但这样做 ...
你了解Google App Engine吗?我很想把Discuz装到那上面去,这样就不用担心挂机了,而且免费。
回复 天香公主 2014-1-9 11:59 AM
彼岸网: 又研究新课题了
这个系统不算复杂,管理软件说到底也就是CRUD。但它的扩展功能好象很强大的,值得了解。有些事通过修改源码不难实现(如我的一个推荐博文目录的讨论),但这样做会给升级带来很大麻烦,如果能做成插件就好了。这是我接下来想学习的。
回复 彼岸网 2014-1-8 01:05 PM
天香公主: 模块能很方便的插入网页,而且有多个内在支持的选项,如显示条目,更新频率等给了用户很大的灵活性。但感觉少了一个分页功能。与其点击"更多"去一个新网页看分 ...
又研究新课题了
回复 天香公主 2014-1-8 01:02 AM
Discuz! X2.5模块列表与数据调用的特点与区别
http://www.cnit618.com/html/kyxt/discuz/2690.htm
回复 天香公主 2014-1-7 10:28 PM
模块能很方便的插入网页,而且有多个内在支持的选项,如显示条目,更新频率等给了用户很大的灵活性。但感觉少了一个分页功能。与其点击"更多"去一个新网页看分页的内容,不如就在模块里就分页。这样既能看到很多内容,又不需离开当前页。见下面的文章:
Discuz 用专题与DIY实现调用指定内容并且自动按要求分页的单页
http://www.cnit618.com/html/kyxt/discuz/3093.htm
回复 天香公主 2014-1-2 11:01 PM
彼岸网: 下面就有:
“从网页上看 li 和 em 之间有个 b”
“随你,我也就是随手写一个试试过程”
我把重复的两条删了,大概是我点击了两次?我会继续观察下
回复 彼岸网 2014-1-2 10:42 PM
天香公主: 是说在博文页里有重复评论(我试了试没发现重复),还是在这个最新评论栏里有重复(没看到有完全相同的两条啊)? ...
下面就有:
“从网页上看 li 和 em 之间有个 b”
“随你,我也就是随手写一个试试过程”
回复 天香公主 2014-1-2 10:41 PM
彼岸网: 好像有个bug,下面你有的回复重复了两次。我一开始以为只是你的问题,但刚才我在999文的留言也出现了重复。不知道和block_commentnew.php有没有关系。 ...
是说在博文页里有重复评论(我试了试没发现重复),还是在这个最新评论栏里有重复(没看到有完全相同的两条啊)?
回复 彼岸网 2014-1-2 09:44 PM
好像有个bug,下面你有的回复重复了两次。我一开始以为只是你的问题,但刚才我在999文的留言也出现了重复。不知道和block_commentnew.php有没有关系。
回复 彼岸网 2014-1-2 03:21 PM
天香公主: 行,等我晚上加个选项。

另外你觉得在显示回复时需要省略引用的话吗?觉得各有利弊。
不觉得有必要,现在这样至少可以让人一下就知道是给谁的回复。
12下一页

facelist doodle 涂鸦板

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

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2026-6-8 10:12 PM , Processed in 0.035857 second(s), 22 queries.

返回顶部