ZigZagK的博客
Typecho输出评论骚操作
2019年12月8日 00:07
Typecho
查看标签

可能是没啥用的骚操作QAQ。

突发奇想

在编写日记页面的时候我发现由于$comments->listComments();自身的特性,输出的评论会被<ol class="comment-list"></ol>包起来,导致有些时候会很麻烦。因此我搜了一下能不能去掉这个东西,结果当然是……啥都没搜到。

实在没办法,我就去看了源码,发现listComments()其实是可以加参数的QAQ……

骚操作1

默认参数长这样:

$this->_singleCommentOptions->setDefault(array(
    'before'        =>  '<ol class="comment-list">',
    'after'         =>  '</ol>',
    'beforeAuthor'  =>  '',
    'afterAuthor'   =>  '',
    'beforeDate'    =>  '',
    'afterDate'     =>  '',
    'dateFormat'    =>  $this->options->commentDateFormat,
    'replyWord'     =>  _t('回复'),
    'commentStatus' =>  _t('您的评论正等待审核!'),
    'avatarSize'    =>  32,
    'defaultAvatar' =>  NULL
));

这些参数其实都很熟悉……很明显<ol class="comment-list"></ol>的罪魁祸首就是beforeafter

所以只要这样就可以把外层套着的东西去掉啦:

$comments->listComments(array('before'=>'','after'=>''));

骚操作2

由于想要实现日记按月归档的功能,我需要把所有评论先拿出来再输出。

到网上搜了一下,发现方法千篇一律……都是直接从数据库中拿出评论。然而这样是没法拿到解析之后的评论的(评论是可以支持Markdown的),表情解析就更加不行了。

这时候我忽然想到一个骚操作QAQ,我在评论输出的函数中,不输出评论,而是存到另外的数组里,就可以避免调用数据库,还可以得到解析后的评论了!

Helper::options()->commentsPageBreak=false; //当前页评论不分页,从而获取所有评论
global $total;global $diary;$total=0; //全局变量
function threadedComments($comment,$options){
    $GLOBALS['diary'][$GLOBALS['total']][0]=$comment->date; //用于之后的归档
    $GLOBALS['diary'][$GLOBALS['total']][1]='
    <div class="mdui-col">
        <div id="'.$comment->theId.'" class="mdui-card mdui-m-t-2">
            <div class="mdui-card-header">
                <img class="mdui-card-header-avatar" src="'.GravatarURL($comment->mail,100).'" />
                <div class="mdui-card-header-title">'.$comment->author.'</div>
                <div class="mdui-card-header-subtitle">'.$comment->date->format(Helper::options()->commentDateFormat).'</div>
            </div>
            <div class="mdui-card-content" style="min-height:200px">'.RewriteComment($comment).'</div>
        </div>
    </div>'; //把评论字符串存到数组里而不是直接输出
    $GLOBALS['total']++;
}

为了在函数中调用外部的数组,需要使用全局变量,具体定义和使用方法可以到网上搜一下QAQ(我PHP水平这么菜这个当然是搜的)

结合下骚操作1,调用一下:

$comments->listComments(array('before'=>'','after'=>''));

就可以不留痕迹的获取到评论数组啦。

版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
请不要发毫无意义或内容不文明的评论。与本文无关评论请发留言板!
2020-04-21 18:52:34Ryan
2020-04-21 18:52:34

所有数据库查出来的数据,如果typecho有原生对应类可以直接使用filter函数过滤一下,然后就是处理过的数据什么,比如拼接好的slug,解析完的content

访客
2020-04-21 22:19:16ZigZagK
2020-04-21 22:19:16
@Ryan 

这个我不是很懂唉 倍感压力
主要是typecho官方文档极其不详细,所以我就脑补了一个解决方案出来

博主
2019-12-08 15:12:14ohmyga
2019-12-08 15:12:14

zigzagk nb

访客
2019-12-08 22:28:50ZigZagK
2019-12-08 22:28:50
@ohmyga 

并不啊

博主