在安企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.Title、item.Link、item.Description等来访问文档的各项属性。{{stampToDate(item.CreatedTime, "2006-01-02")}}:文档的CreatedTime是时间戳,我们需要用stampToDate过滤器将其格式化成可读的日期格式。{% empty %}:这是一个非常实用的结构,当archives列表为空时(即没有找到任何相关文档),它会显示{% empty %}块内的内容,避免页面空白。
实战:在Tag详情页显示文档列表
在安企CMS中,通常会为标签专门创建一个页面来展示该标签下的所有文档,比如 /template/default/tag/list.html(或自定义的标签模板)。在这种页面上,获取当前标签关联的文档列表会更加便捷,因为 tagDataList 标签会自动识别当前页面的标签ID。
下面是一个完整的示例,展示如何在标签详情页(假设页面URL中包含tagId或token)显示标签信息及其关联的文档列表:
”`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>
{%