主题用的是7TEC,作者在2月份时做了一次更新,并表示后续会逐步停止对主题的更新,那我想要的时光机功能只能自己动手制作了。
由于是第一次DIY Typecho的主题,先是要对Typecho主题体系有一个基本了解,这个在官网上有介绍,虽然已经过时但还能将就看看。
先说说时光机(简称微语)功能的实现方案,用一个自定义页面作为微语的主页面,用评论作为内容载体。在管理员登录的状态下显示评论框(微语发表框),可以发表微语,否则只显示微语列表。
我本身CSS技能偏弱,在页面调整方面耗时较多。为了页面美观,我还设计了一个气泡样式,每条微语一个气泡框,最终实现的效果如下:

关于气泡样式的实现过程我前一篇日志已经详细记录了。

在处理这个页面的过程中,我还遇到一个排序的问题,也是调试了好久。Typecho评论列表默认是正序排列的,时光机功能肯定要倒序,但是我在官方文档中没有找到关于指定列表排序的相关说明。虽然可以通过硬编码实现我的需求,但这样一来后期Typecho有升级或者需要调整的时候肯定更加麻烦,最好的做法是找到一个不用修改Typecho框架代码的方式。

打开断点一番查找后,我在 Archive.php 类的 execute() 方法中看到了这段代码:

/** 评论排序 */
if ('DESC' == $this->options->commentsOrder) {
    $this->stack = array_reverse($this->stack, true);
    $this->_threadedComments = array_map('array_reverse', $this->_threadedComments);
}

关键就在这个 commentsOrder 参数,默认为空,如果他的值为 DESC 那么就会将评论列表翻转实现倒序。看到这里我不禁奇怪,Typecho在这里居然使用内存翻页,若后期评论数量特别多的时候,肯定会发生OOM的。其实仔细想想Typecho的受众是个人博客,评论应该不会轻易到达那个量级,真有那个体量那站长也会换平台了。

那么现在就是怎么修改这个 commentsOrder 的值为 DESC 了。接着我就在网上翻看别人的主题,看看有什么主题的评论是倒序排列的,陆续找了几个之后我下载了他们的源码,断点调试之后我找到了关键所在。在主题的 functions.php 这个文件中,每次页面初始化加载主题的时候,都会调用一个 themeInit() 的方法,可以在这个方法中,通过 Helper 类的静态方法 Widget_Options 的实例之后,修改默认参数。

function themeInit() {
    Helper::options()->commentsOrder = 'DESC'; // 将评论设置为倒序
}

这里添加代码将评论设置为倒序,再次查看,倒序实现,大功告成。后面接着DIY主题的时候,在Theme生命周期里还能做其他调整,果然还是要多看多做,别人的代码可能给你提供思路。

Last modification:June 8th, 2020 at 06:56 pm
If you think my article is useful to you, please feel free to appreciate