在AnQiCMS中构建一个充满互动性的网站,评论功能无疑是提升用户参与度的关键。 commentList 标签正是AnQiCMS为此提供的一大利器,它能够帮助网站开发者和运营者灵活地展示评论内容,并清晰地呈现评论者的状态,让访客一眼就能掌握评论区的动态。

核心功能概览:commentList 标签基础用法

commentList 标签主要用于获取指定文档的评论列表,并支持分页显示。它的基础结构通常是这样的:

{% commentList comments with archiveId=archive.Id type="page" limit="10" %}
    {# 评论内容将在这里循环展示 #}
{% endcommentList %}

在这里,comments 是我们为获取到的评论列表数据定义的变量名,你可以根据需要自行命名。archiveId=archive.Id 指定了要获取哪篇文章(或产品)的评论,这里的 archive.Id 通常是在文章详情页自动获取当前文章的ID。type="page" 表明我们希望以分页的形式展示评论,如果不需要分页,可以使用 type="list"limit="10" 则控制了每页显示评论的数量。

通过这样的设置,我们就能从数据库中取出评论数据,为后续的展示做好准备。

评论内容的全面展示:item 变量详解

commentList 标签获取到的 comments 变量是一个数组对象,每一个数组元素代表一条评论,我们通常会在 {% for item in comments %} 循环中遍历这些评论。每个 item 对象都包含了丰富的评论信息,例如:

  • Id: 评论的唯一标识ID。
  • UserName: 评论者的昵称。
  • Content: 评论的实际文本内容。
  • CreatedTime: 评论发布的时间戳,通常需要通过 {{stampToDate(item.CreatedTime, "2006-01-02 15:04")}} 这样的格式化函数转换为可读的日期时间。
  • Status: 评论的审核状态。这是一个非常重要的字段,通常 1 表示审核通过并已显示,0 表示待审核。
  • ParentIdParent 对象:如果当前评论是对另一条评论的回复,ParentId 会记录父评论的ID,而 Parent 对象则会包含父评论的完整信息,方便实现多级评论回复的展示。
  • VoteCount: 评论获得的点赞数量。

掌握这些字段,我们就可以在模板中构建出灵活多样的评论显示效果。

区分评论状态:让用户一目了然

在评论展示中,清晰地告知用户某条评论是否已审核通过,对于网站的运营和用户体验都非常重要。利用 item.Status 字段,我们可以轻松实现这一点。

例如,可以在评论者名称旁边显示“审核中”的提示,或者在评论内容未通过审核时,仅显示部分内容或一个占位符。

<div>
    <span>
        {% if item.Status != 1 %}
            <span style="color: gray;">[审核中]</span> {{item.UserName|truncatechars:6}}
        {% else %}
            {{item.UserName}}
        {% endif %}
    </span>
    <span>于 {{stampToDate(item.CreatedTime, "2006-01-02 15:04")}} 说:</span>
    <div>
        {% if item.Status != 1 %}
            <p style="color: gray;">您的评论正在审核中,请耐心等待。</p>
        {% else %}
            <p>{{item.Content}}</p>
        {% endif %}
    </div>
</div>

通过这样的条件判断,既尊重了评论者的隐私,又明确告知了其他访客当前评论的状态,提升了页面的透明度和互动感。

实现评论回复与点赞互动

评论回复的展示

AnQiCMS的 commentList 标签通过 item.Parent 对象完美支持评论回复功能。当 item.Parent 存在时,意味着当前评论是对另一条评论的回复。我们可以根据这个信息,以嵌套或引用的方式展示父评论的内容,从而构建出清晰的对话结构。

<div>
    {# 当前评论者的信息 #}
    <span>{{item.UserName}}</span>
    <span>于 {{stampToDate(item.CreatedTime, "2006-01-02 15:04")}} 说:</span>

    {# 如果是回复,显示父评论内容 #}
    {% if item.Parent %}
        <blockquote style="background-color: #f0f0f0; padding: 10px; margin-left: 20px; border-left: 3px solid #ccc;">
            <p>回复 @{{ item.Parent.UserName }}:</p>
            {% if item.Parent.Status != 1 %}
                <p style="color: gray;">[原评论正在审核中]</p>
            {% else %}
                <p>{{ item.Parent.Content|truncatechars:100 }}</p> {# 截取父评论内容避免过长 #}
            {% endif %}
        </blockquote>
    {% endif %}

    {# 当前评论内容 #}
    <p>{{item.Content}}</p>
</div>

评论点赞功能的实现

item.VoteCount 字段直接显示了评论的点赞数。要实现点赞功能本身,通常需要在前端通过JavaScript与AnQiCMS提供的 /comment/praise API进行交互。当用户点击点赞按钮时,JS会发送一个POST请求到该API,并带上评论的 id,API处理成功后,前端再更新 VoteCount 的显示。

<div class="comment-actions">
    <a href="javascript:;" class="like-button" data-comment-id="{{item.Id}}">
        赞 (<span class="vote-count">{{item.VoteCount}}</span>)
    </a>
    <a href="javascript:;" class="reply-button" data-comment-id="{{item.Id}}" data-user-name="{{item.UserName}}">回复</a>
</div>

(前端JS代码会监听 .like-button 的点击事件,发送 POST 请求到 /comment/praise,并根据返回结果更新 vote-count 元素。)

评论列表的分页控制

对于评论数量较多的文章,分页显示是必不可少的。当 commentList 标签的 type 参数设置为 page 时,它会配合 pagination 标签提供完整的分页功能。

{# 评论列表循环... #}

{# 分页部分 #}
<div class="pagination-container">
    {% pagination pages with show="5" %}
        <a class="{% if pages.FirstPage.IsCurrent %}active{% endif %}" href="{{pages.FirstPage.Link}}">首页</a>
        {% if pages.PrevPage %}
            <a href="{{pages.PrevPage.Link}}">上一页</a>
        {% endif %}
        {% for pageItem in pages.Pages %}
            <a class="{% if pageItem.IsCurrent %}active{% endif %}" href="{{pageItem.Link}}">{{pageItem.Name}}</a>
        {% endfor %}
        {% if pages.NextPage %}
            <a href="{{pages.NextPage.Link}}">下一页</a>
        {% endif %}
        <a class="{% if pages.LastPage.IsCurrent %}active{% endif %}" href="{{pages.LastPage.Link}}">尾页</a>
    {% endpagination %}
</div>

这样,用户就可以方便地在不同评论页之间跳转,浏览所有评论。

评论表单的集成与提交

最后,要让用户能够发表评论,需要集成一个评论表单。这个表单通常会提交到 AnQiCMS 提供的 /comment/publish 接口。表单中需要包含一些隐藏字段和用户输入字段:

”`twig

<input type="hidden" name="archive_id" value="{% archiveDetail with name="Id" %}"> {# 当前文章ID #}
<input type="hidden" name="parent_id" id="parent-comment-id" value=""> {# 如果是回复,这里会填入父评论ID #}
<input type="hidden" name="return" value="html"> {# 期望后端返回html,也可选json #}

<div class