一、需求

使用 typecho 进行模板开发的时候,默认评论样式很难看。

因此需要评论需要重新输出或进行样式设定。

默认的评论模板文件路径是:comments.php

关于评论模板开发的官方文档地址是:

主要使用的相关变量:

<?php $comments->gravatar('40', ''); ?> //头像,有两个参数,大小、默认头像?
<?php $comments->author(); ?> //评论作者
<?php $comments->permalink(); ?> //当前评论的连接地址
<?php $comments->date('Y-m-d H:i'); ?>//评论时间,可在括号里设置格式
<?php $comments->reply(); ?> //回复按钮,可在括号里自定义评论按钮的文字
<?php $comments->content(); ?> //评论内容

二、自定义评论输出

1、threadedComments 方法

如果要自定义评论输出内容,则需要重写 threadedComments($comments, $options) 方法,这个方法需要放在模板文件中 <?php $this->comments()->to($comments); ?> 的前面,因为实际上 $this->comments()->to($comments); 会调用 threadedComment 模板。

下面的方法代码是我在 基于Bootstrap4的 响应式 typecho 博客主题 使用的自定义评论模板。

最终的效果是:

d111.jpg

<?php function threadedComments($comments, $options) {
    $commentClass = '';
    $commentLevelClass = $comments->levels > 0 ? ' comment-child' : ' comment-parent';
    ?>
    <li id="li-<?php $comments->theId(); ?>" class="comment-body<?php
    if ($comments->levels > 0) {
        echo ' comment-child';
        $comments->levelsAlt(' comment-level-odd', ' comment-level-even');
    } else {
        echo ' comment-parent';
    }
    $comments->alt(' comment-odd', ' comment-even');
    echo $commentClass;
    ?>">
        <div id="<?php $comments->theId(); ?>" class="comment-item">
            <div class="comment-author">
                <?php $comments->gravatar('40', ''); ?>
                <span class="fn">
            <?php $comments->author(); ?>
            <?php if ($comments->authorId) {
                if ($comments->authorId == $comments->ownerId) {
                    echo "<span class='author-after-text'>[作者]</span>";
                }?>
            <?php }?>
        </span>
            </div>
            <div class="comment-meta">
                <a href="<?php $comments->permalink(); ?>"><?php $comments->date('Y-m-d H:i'); ?></a>
            </div>
            <span class="comment-reply"><?php $comments->reply(); ?></span>
            <div class="comment-content">
                <?php $comments->content(); ?>
            </div>
        </div>
        <?php if ($comments->children) { ?>
            <div class="comment-children">
                <?php $comments->threadedComments($options); ?>
            </div>
        <?php } ?>
    </li>
<?php } ?>

2、css样式设置

使用上面代码输出的样式仍旧是默认的样式,因此需要对上面的 class 进行 css 处理。

/*评论样式 start*/
.comments-wrapper {
    border-top: 1px dashed #cccccc;
    padding-top: 1rem;
    margin-top: 3rem;
}

.comments-wrapper img.avatar {
    text-align: center;
    margin-right: 10px;
}

.comments-wrapper .comment-content p {
    font-size: 14px;
}

.comment-list, .comment-list li {
    list-style: none;
}

.comments-wrapper .comment-author {
    display: inline-block;
    font-weight: 600;
}

.comments-wrapper .comment-meta {
    display: inline-block;
}

.comments-wrapper .comment-meta a {
    color: #cccccc;
    font-size: 12px;
}

.comments-wrapper .comment-content {
    padding-left: 52px;
}

.comments-wrapper .comment-reply {
    display: inline-block;
    float: right;
    font-size: 12px;
}

.comments-wrapper .comment-item {
    border-top: 1px solid #dfdfdf;
    padding-top: 10px;
}

.comment-list, .comment-list li {
    list-style: none;
}

.comment-children {
    padding-left: 40px;
}

.comment-list {
    padding-left: 0;
}

.comments-wrapper .cancel-comment-reply {
    margin: 10px 0;
}

.comment-author .author-after-text {
    font-size: 12px;
    color: #0c5;
}

.add-comments {
    margin-top: 1rem;
}

#response {
    margin: 1rem 0;
}

三、判断是否是作者本人的评论或者回复

如果要如上面示意图显示是否是本人发表的评论,则需要进行一次判断。

typecho 官方文档给的方式通过设置 class 的方式,如下:

$commentClass = '';
    if ($comments->authorId) {
        if ($comments->authorId == $comments->ownerId) {
            $commentClass .= ' comment-by-author';
        } else {
            $commentClass .= ' comment-by-user';
        }
    }

但是我在使用的时候,并不是很好用,反而会经常出现问题,样式控制也不好控制,于是我直接在作者名字上进行判断:

判断的代码放在作者输出之前或者之后都可以。

首先判断是否有 authorId 属性,如果有,则判断 authorIdownerId 是否一致即可。

<?php $comments->author(); ?>
<?php if ($comments->authorId) {
    if ($comments->authorId == $comments->ownerId) {
        echo "<span class='author-after-text'>[作者]</span>";
    }?>
<?php }?>