在构建一个有活力的网站时,文章评论功能无疑是增强用户互动、促进内容社区发展的核心要素。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 动态地将被回复评论的 Id 和 UserName 填充到评论提交表单的隐藏字段中。
”`twig {% archiveDetail currentArchiveId with name=“Id” %}
{# 评论提交表单 #}
document.querySelectorAll('.reply-btn').forEach(button => {
button.addEventListener('click', function() {
const commentId = this.dataset.commentId;
const userName = this.dataset.userName;
document.getElementById('parent-comment-id').value = commentId;
document.getElementById('reply-target-text').innerText = `@${userName} `;
document.getElementById('comment-content-field').focus();
document.getElementById('cancel-reply-btn').style.display = 'inline-block';
});
});
document.getElementById('cancel-reply-btn').addEventListener('click', function() {
document.getElementById('parent-comment-id').value = '';
document.getElementById('reply-target