在构建一个有活力的网站时,文章评论功能无疑是增强用户互动、促进内容社区发展的核心要素。AnQiCMS 作为一个高效灵活的内容管理系统,为我们提供了强大的模板标签,让集成和展示评论变得简单而直观。今天,我们就来一起深入了解 AnQiCMS 中 commentList 标签如何助力我们展示文章评论,并巧妙地融入回复与点赞功能。

commentList 标签:评论展示的基石

想象一下,我们希望在每篇文章的底部,呈现读者们的热情评论。AnQiCMS 的 commentList 标签就是实现这一目标的关键。它能够方便地获取与特定文章关联的评论数据,并以我们期望的方式进行展示。

要使用 commentList,我们首先需要指定评论所关联的文章 ID。这通常通过获取当前文章的 ID 来实现,例如,在文章详情页中,我们可以使用 {% archiveDetail with name="Id" %} 来获取当前文章的 Id

下面是 commentList 标签的基本结构,我们通常会将其命名为 comments 变量,以便在后续的模板代码中引用:

{% archiveDetail currentArchiveId with name="Id" %}
{% commentList comments with archiveId=currentArchiveId type="list" limit="6" %}
    {# 在这里循环展示评论 #}
{% endcommentList %}

这里,archiveId 参数确保了我们获取的是当前文章的评论。type="list" 表示我们希望获取一个简单的评论列表,而 limit="6" 则限制了首次加载的评论数量。

comments 变量实际上是一个评论对象的数组,我们可以通过 for 循环遍历它,展示每一条评论的详细信息。每条评论(我们称之为 item)包含了丰富的字段,比如:

  • Id:评论的唯一标识符。
  • UserName:评论者的昵称。
  • Content:评论的具体内容。
  • CreatedTime:评论的发表时间,这是一个时间戳,需要通过 stampToDate 标签进行格式化。
  • VoteCount:该评论获得的点赞数量。
  • Parent:一个非常重要的字段,如果这条评论是对其他评论的回复,Parent 就会包含被回复评论的完整信息。
  • Status:评论的审核状态,例如 1 表示审核通过,0 表示审核中。

有了这些字段,我们就可以构建一个基础的评论列表了:

{% archiveDetail currentArchiveId with name="Id" %}
<div class="comments-section">
    <h3>读者评论</h3>
    {% commentList comments with archiveId=currentArchiveId type="list" limit="6" %}
        {% for item in comments %}
        <div class="comment-item">
            <div class="comment-meta">
                <span>{{ item.UserName }}</span>
                <span>发表于 {{ stampToDate(item.CreatedTime, "2006-01-02 15:04") }}</span>
            </div>
            <div class="comment-content">
                {% if item.Status != 1 %}
                    <p>(此评论正在审核中...)</p>
                {% else %}
                    <p>{{ item.Content }}</p>
                {% endif %}
            </div>
        </div>
        {% empty %}
        <p>还没有评论,快来发表您的看法吧!</p>
        {% endfor %}
    {% endcommentList %}
</div>

在这个例子中,我们还加入了对 item.Status 的判断,确保只显示已审核通过的评论,或者给审核中的评论一个友好的提示,这对于维护网站内容质量至关重要。

集成回复功能:让对话更深入

评论的价值在于互动,而回复功能则是互动深度的体现。AnQiCMS 在 commentList 标签中通过 item.Parent 字段,为我们提供了实现回复功能的便利。

如果 item.Parent 存在,则说明当前 item 是一条回复。我们可以利用 item.Parent.UserName 获取被回复者的昵称,并通过 item.Parent.Content 简要引用被回复的内容,让用户清晰地看到对话的上下文。

为了让用户能够发起回复,我们需要在每条评论下方添加一个“回复”按钮。点击这个按钮时,通过 JavaScript 动态地将被回复评论的 IdUserName 填充到评论提交表单的隐藏字段中。

”`twig {% archiveDetail currentArchiveId with name=“Id” %}

<h3>读者评论</h3>
{% commentList comments with archiveId=currentArchiveId type="list" limit="6" %}
    {% for item in comments %}
    <div class="comment-item" id="comment-{{ item.Id }}">
        <div class="comment-meta">
            <span>{{ item.UserName }}</span>
            <span>发表于 {{ stampToDate(item.CreatedTime, "2006-01-02 15:04") }}</span>
            {% if item.Parent %}
            <span class="reply-to">回复 <a href="#comment-{{ item.Parent.Id }}">@{{ item.Parent.UserName }}</a></span>
            {% endif %}
        </div>
        <div class="comment-content">
            {% if item.Parent and item.Parent.Status == 1 %}
            <blockquote class="reply-quote">
                <p>@{{ item.Parent.UserName }}:{{ item.Parent.Content|truncatechars:100 }}</p>
            </blockquote>
            {% endif %}

            {% if item.Status != 1 %}
                <p>(此评论正在审核中...)</p>
            {% else %}
                <p>{{ item.Content }}</p>
            {% endif %}
        </div>
        <div class="comment-actions">
            <a href="javascript:;" class="reply-btn" data-comment-id="{{ item.Id }}" data-user-name="{{ item.UserName }}">回复</a>
            {# 点赞功能稍后添加 #}
        </div>
    </div>
    {% empty %}
    <p>还没有评论,快来发表您的看法吧!</p>
    {% endfor %}
{% endcommentList %}

{# 评论提交表单 #}

<input type="hidden" name="return" value="html">
<input type="hidden" name="archive_id" value="{{ currentArchiveId }}">
<input type="hidden" name="parent_id" id="parent-comment-id" value="">
<p>
    <label for="user-name-field">您的昵称:</label>
    <input type="text" name="user_name" id="user-name-field" required placeholder="请填写您的昵称" autocomplete="off">
</p>
<p>
    <label for="comment-content-field">评论内容:<span id="reply-target-text"></span></label>
    <textarea name="content" id="comment-content-field" rows="5" required placeholder="输入您的评论..."></textarea>
</p>
<p>
    <button type="submit">提交评论</button>
    <button type="reset" id="cancel-reply-btn">取消回复</button>
</p>