在内容管理系统中,标签(Tag)是一种强大的工具,它能帮助我们更灵活地组织内容,提升用户发现相关信息的效率。AnQiCMS 作为一款高效的企业级内容管理系统,自然也深度集成了强大的标签功能。如果您正希望在网站前台展示文档的标签列表,并允许用户通过字母或分类进行筛选,那么这篇文章将为您提供详尽的指南。
AnQiCMS的标签机制
AnQiCMS将标签视为独立的内容实体,这与传统的“关键词”概念有所不同。在后台,您可以为每个标签设置独特的名称、索引字母,甚至可以定义自定义URL别名和SEO信息,这大大增强了标签的独立性和SEO友好性。更值得一提的是,AnQiCMS的标签是跨模型通用的,这意味着同一个标签可以关联不同内容模型(如文章、产品)下的文档,为内容关联提供了极大的灵活性。这些标签在AnQiCMS V2.1.0版本中就已经全面引入,并持续优化。
在前台页面展示所有标签列表
要展示网站上所有的标签,我们通常会在一个专门的页面,比如网站的“标签首页”来呈现。根据AnQiCMS的模板设计约定,这个页面对应的模板文件通常是位于您当前使用的模板目录下的 tag/index.html。
在这个 tag/index.html 模板文件中,我们可以使用 tagList 标签来获取所有的标签数据。为了更好地管理和展示大量标签,我们通常会配合分页功能一起使用:
{# /template/{你的模板目录}/tag/index.html #}
{# 获取所有标签并分页展示,每页显示20个 #}
{% tagList tags with type="page" limit="20" %}
<div class="tag-list-container">
{% for item in tags %}
<a href="{{item.Link}}" class="tag-item">
{{item.Title}} <span class="tag-count">({{item.ArchiveCount}})</span>
</a>
{% empty %}
<p>目前还没有任何标签。</p>
{% endfor %}
</div>
{# 引入分页组件,显示5个页码按钮 #}
{% pagination pages with show="5" %}
<div class="pagination-nav">
{% if pages.FirstPage %}
<a class="page-link {% if pages.FirstPage.IsCurrent %}active{% endif %}" href="{{pages.FirstPage.Link}}">首页</a>
{% endif %}
{% if pages.PrevPage %}
<a class="page-link" href="{{pages.PrevPage.Link}}">上一页</a>
{% endif %}
{% for pageItem in pages.Pages %}
<a class="page-link {% if pageItem.IsCurrent %}active{% endif %}" href="{{pageItem.Link}}">{{pageItem.Name}}</a>
{% endfor %}
{% if pages.NextPage %}
<a class="page-link" href="{{pages.NextPage.Link}}">下一页</a>
{% endif %}
{% if pages.LastPage %}
<a class="page-link {% if pages.LastPage.IsCurrent %}active{% endif %}" href="{{pages.LastPage.Link}}">尾页</a>
{% endif %}
</div>
{% endpagination %}
{% endtagList %}
在上面的代码中,我们通过 tagList tags with type="page" limit="20" 获取了所有标签并指定了分页模式和每页数量。item.Link 会自动生成标签详情页的URL,item.Title 则是标签的显示名称,而 item.ArchiveCount 能够显示该标签下关联的文档数量。随后的 pagination 标签则负责渲染标准的分页导航。
支持按字母筛选标签
为了方便用户快速定位标签,按字母筛选是一个非常实用的功能。我们可以在 tag/index.html 页面上方添加一个字母导航条。
首先,我们需要生成 A-Z 的字母链接。AnQiCMS的模板引擎支持一些过滤器来辅助我们完成这个任务。我们可以使用 make_list 过滤器将一个字符串拆分成字符数组,然后遍历生成链接:
{# 继续在 /template/{你的模板目录}/tag/index.html 文件中 #}
<div class="alphabet-filter">
<a href="/tags" class="letter-item {% if not urlParams.letter %}active{% endif %}">全部</a>
{% for char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"|make_list %}
<a href="/tags?letter={{char}}" class="letter-item {% if urlParams.letter == char %}active{% endif %}">{{char}}</a>
{% endfor %}
</div>
{# 接着是上面的 tagList 和 pagination 代码 #}
{% tagList tags with type="page" limit="20" letter=urlParams.letter %}
{# ... 标签列表和分页代码 ... #}
{% endtagList %}
这里,我们通过 urlParams.letter 来获取当前URL中 letter 参数的值。如果 urlParams.letter 存在,我们就将它传递给 tagList 标签的 letter 参数,这样 tagList 就会只返回以该字母开头的标签。make_list 过滤器能够将 “ABCDEFGHIJKLMNOPQRSTUVWXYZ” 字符串转换为可迭代的字符列表。
支持按分类筛选标签
除了按字母筛选,我们还可以根据标签所属的分类来筛选。虽然AnQiCMS的标签本身不直接属于某个分类,但文档是属于分类的,标签又是关联文档的。因此,这里的“按分类筛选”通常指的是筛选出与某个分类下的文档相关的标签。
要实现这个功能,我们首先需要获取网站的分类列表,这可以通过 categoryList 标签实现。然后,为每个分类生成一个筛选链接,并将选定的 categoryId 传递给 tagList 标签:
{# 继续在 /template/{你的模板目录}/tag/index.html 文件中 #}
<div class="category-filter">
<a href="/tags" class="category-item {% if not urlParams.categoryId %}active{% endif %}">所有分类</a>
{% categoryList categories with moduleId="1" parentId="0" %} {# 假设这里筛选文章模型的顶级分类 #}
{% for category in categories %}
<a href="/tags?categoryId={{category.Id}}" class="category-item {% if urlParams.categoryId|integer == category.Id %}active{% endif %}">{{category.Title}}</a>
{% endfor %}
{% endcategoryList %}
</div>
{# 接着是上面的 alphabet-filter, tagList 和 pagination 代码 #}
{% tagList tags with type="page" limit="20" letter=urlParams.letter categoryId=urlParams.categoryId|integer %}
{# ... 标签列表和分页代码 ... #}
{% endtagList %}
在这个示例中,我们使用 categoryList 标签获取了文章模型下的顶级分类。urlParams.categoryId 用于获取URL中的分类ID参数。请注意,urlParams.categoryId|integer 过滤器将URL参数转换为整数类型,以确保与 category.Id 进行正确的比较。当用户点击某个分类链接时,tagList 标签会根据 categoryId 参数来显示与该分类下的文档相关联的标签。
Tag详情页:显示某个标签下的文档列表
当用户点击一个标签后,通常会进入该标签的详情页面,显示与这个标签关联的所有文档。根据AnQiCMS的模板设计约定,这个页面对应的模板文件通常是 tag/list.html。
在 tag/list.html 模板中,我们可以使用 tagDetail 标签获取当前标签的详细信息,以及 tagDataList 标签来获取该标签下的所有文档列表。
”`twig {# /template/{你的模板目录}/tag/list.html #}
{# 获取当前标签的详细信息 #} {% tagDetail currentTag with name=“Title” %}
<h1>标签: {{currentTag}}</h1>
<p>{% tagDetail with name="Description" %}</p>
{% endtagDetail %}
{# 获取当前标签下的文档列表并分页展示 #} {% tagDataList archives with type