如何获取和显示指定Tag关联的所有文档列表?

在安企CMS中管理内容,除了通过分类来组织,灵活运用“标签”(Tag)功能也是提升网站内容聚合能力和用户体验的关键。标签能够将不同分类、不同模型但主题相关的文档串联起来,为访客提供更多发现内容的入口。那么,具体如何获取并展示这些与指定标签关联的所有文档列表呢?接下来,我们将深入探讨这一实用技巧。

理解安企CMS的标签体系

安企CMS的标签设计非常灵活,它不依附于特定的分类或模型,可以跨越内容类型,将相似主题的文档关联起来。例如,一篇关于“SEO优化”的文章和一篇关于“SEO工具”的产品介绍,虽然分属不同内容模型,但都可以打上“SEO”这个标签,方便用户通过“SEO”标签一览所有相关内容。

在安企CMS的模板系统中,有几个与标签密切相关的标签,它们共同构建了标签内容展示的基础:

  • tagList 标签: 用于获取网站中的标签列表,例如显示热门标签或当前文档的相关标签。
  • tagDetail 标签: 用于获取某个具体标签的详细信息,比如标签名称、描述等,非常适合在标签详情页使用。
  • tagDataList 标签: 这正是我们今天的主角,它专门用于获取与指定标签关联的文档列表。

通过这几个标签的组合使用,我们可以轻松实现各种标签内容聚合展示的需求。

核心:如何获取指定Tag关联的文档列表

要获取指定标签关联的所有文档,最直接有效的方式就是使用 tagDataList 标签。这个标签设计得非常直观,只需告诉它你关注的是哪个标签,它就能为你列出所有相关的文档。

tagDataList 标签的基本用法

{% tagDataList archives with tagId="1" type="page" limit="10" %}
    {% for item in archives %}
        <li>
            <a href="{{item.Link}}">
                <h5>{{item.Title}}</h5>
                <p>{{item.Description}}</p>
                <div>
                    <span>分类:{% categoryDetail with name="Title" id=item.CategoryId %}</span>
                    <span>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
                    <span>浏览量:{{item.Views}}</span>
                </div>
            </a>
            {% if item.Thumb %}
            <a href="{{item.Link}}">
                <img alt="{{item.Title}}" src="{{item.Thumb}}">
            </a>
            {% endif %}
        </li>
    {% empty %}
        <li>当前标签下还没有任何文档。</li>
    {% endfor %}
{% endtagDataList %}

在上面的代码片段中:

  • tagDataList archives:我们定义了一个变量 archives 来存储获取到的文档列表。
  • tagId="1":这是最关键的参数,它指定了我们想要获取哪个标签下的文档。你需要将 "1" 替换为目标标签的实际ID。
  • type="page":这个参数表示我们希望以分页的形式来显示文档列表,这样后续可以结合 pagination 标签实现分页导航。如果不需要分页,只想获取固定数量的列表,可以使用 type="list"
  • limit="10":指定每页显示10条文档。
  • {% for item in archives %}:通过 for 循环遍历 archives 变量中的每一篇文档。在循环内部,item 变量就代表了当前正在处理的文档对象,你可以通过 item.Titleitem.Linkitem.Description 等来访问文档的各项属性。
  • {{stampToDate(item.CreatedTime, "2006-01-02")}}:文档的 CreatedTime 是时间戳,我们需要用 stampToDate 过滤器将其格式化成可读的日期格式。
  • {% empty %}:这是一个非常实用的结构,当 archives 列表为空时(即没有找到任何相关文档),它会显示 {% empty %} 块内的内容,避免页面空白。

实战:在Tag详情页显示文档列表

在安企CMS中,通常会为标签专门创建一个页面来展示该标签下的所有文档,比如 /template/default/tag/list.html(或自定义的标签模板)。在这种页面上,获取当前标签关联的文档列表会更加便捷,因为 tagDataList 标签会自动识别当前页面的标签ID。

下面是一个完整的示例,展示如何在标签详情页(假设页面URL中包含tagIdtoken)显示标签信息及其关联的文档列表:

”`twig {% extends ‘base.html’ %} {# 继承基础模板,确保页面结构完整 #}

{% block title %}

<title>{% tdk with name="Title" siteName=true %} - 安企CMS</title>

{% endblock %}

{% block content %}

<div class="tag-header">
    <h1>标签:{% tagDetail with name="Title" %}</h1>
    <p class="tag-description">{% tagDetail with name="Description" %}</p>
    <span class="tag-letter">首字母:{% tagDetail with name="FirstLetter" %}</span>
</div>

<div class="tag-documents">
    <h2>“{% tagDetail with name="Title" %}”相关文档</h2>
    <ul>
        {% tagDataList archives with type="page" limit="10" order="id desc" %} {# 默认获取当前标签文档,并按ID倒序 #}
            {% for item in archives %}
            <li>
                <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
                {% if item.Thumb %}
                    <img src="{{item.Thumb}}" alt="{{item.Title}}" style="float: left; margin-right: 15px; width: 120px; height: 90px; object-fit: cover;">
                {% endif %}
                <p>{{item.Description}}</p>
                <div class="doc-meta">
                    <span>分类:<a href="{% categoryDetail with name='Link' id=item.CategoryId %}">{% categoryDetail with name='Title' id=item.CategoryId %}</a></span>
                    <span>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
                    <span>浏览量:{{item.Views}}</span>
                </div>
                <div style="clear: both;"></div>
            </li>
            {% empty %}
            <li>非常抱歉,当前标签下暂时没有找到任何文档。</li>
            {% endfor %}
        {% endtagDataList %}
    </ul>

    {# 分页导航 #}
    <div class="pagination-wrapper">
        {% pagination pages with show="5" %}
            <ul>
                {% if pages.FirstPage %}
                    <li {% if pages.FirstPage.IsCurrent %}class="active"{% endif %}><a href="{{pages.FirstPage.Link}}">{{pages.FirstPage.Name}}</a></li>
                {% endif %}
                {% if pages.PrevPage %}
                    <li><a href="{{pages.PrevPage.Link}}">{{pages.PrevPage.Name}}</a></li>
                {% endif %}
                {% for p in pages.Pages %}
                    <li {% if p.IsCurrent %}class="active"{% endif %}><a href="{{p.Link}}">{{p.Name}}</a></li>
                {% endfor %}
                {% if pages.NextPage %}
                    <li><a href="{{pages.NextPage.Link}}">{{pages.NextPage.Name}}</a></li>
                {% endif %}
                {% if pages.LastPage %}
                    <li {% if pages.LastPage.IsCurrent %}class="active"{% endif %}><a href="{{pages.LastPage.Link}}">{{pages.LastPage.Name}}</a></li>
                {% endif %}
            </ul>
        {%