在安企CMS中,网站分类列表是构建清晰导航、提升用户体验和优化搜索引擎排名的基石。无论是为文章、产品或其他内容模型建立分类体系,AnQiCMS 都提供了灵活而强大的工具来轻松获取并展示这些分类。
AnQiCMS 的核心理念之一就是让内容管理变得高效。它将内容组织成不同的“内容模型”,比如常见的文章模型和产品模型。每个内容模型都可以拥有独立的分类体系。理解这一点是获取分类列表的第一步,因为它决定了你想要展示的是哪类内容的分类。
核心利器:categoryList 标签详解
要在网站前端页面获取并展示分类列表,我们主要依赖 AnQiCMS 模板系统中的 categoryList 标签。这个标签设计得非常直观,让你能够根据不同的需求灵活地筛选和呈现分类数据。
categoryList 标签的基本用法通常是这样:
{% categoryList categories with 参数 %}
{# 在这里循环展示分类数据 #}
{% endcategoryList %}
其中,categories 是你为这个分类列表指定的一个变量名,你可以在标签内部通过这个变量来访问和操作分类数据。参数部分则是用来精确控制你想要获取哪些分类的关键。
让我们来详细了解一下 categoryList 标签常用的参数:
moduleId:这是最重要的参数之一。它用来指定你想要获取哪个内容模型的分类。比如,网站默认的文章模型通常对应的moduleId是1,而产品模型可能对应2。你需要根据你网站的实际内容模型来设置这个值。parentId:这个参数用于控制分类的层级关系。- 如果你想获取所有顶级分类(也就是没有上级分类的分类),可以将
parentId设置为0。 - 如果你在某个分类页面,想获取当前分类的子分类,通常可以省略
parentId参数,系统会自动识别当前分类并获取其直接子级。 - 如果想获取当前分类的兄弟分类(即与当前分类同属一个上级分类的其它分类),可以将
parentId设置为parent。
- 如果你想获取所有顶级分类(也就是没有上级分类的分类),可以将
all:如果将其设置为true,all=true,则会获取指定moduleId下的所有分类,不论层级。limit:用于限制返回的分类数量。比如limit="10"会只显示 10 个分类。它还支持offset模式,如limit="2,10"表示从第 2 个分类开始,获取 10 个分类。siteId:在多站点管理的环境下,如果你需要获取其他站点的分类数据,可以通过这个参数指定站点 ID。一般情况下无需设置。
categoryList 标签会返回一个分类对象的数据集合(或者称为数组)。在标签内部,你可以通过 for 循环来遍历这个集合,并访问每个分类的详细信息。每个分类对象都包含以下常用字段:
Id:分类的唯一标识符。Title:分类的名称。Link:分类页面的 URL 地址。Description:分类的描述信息。ParentId:上级分类的 ID。Logo:分类的大图或主图地址。Thumb:分类的缩略图地址。HasChildren:一个布尔值(true或false),指示该分类是否有子分类。IsCurrent:一个布尔值,指示当前分类是否是当前页面所在的分类。ArchiveCount:该分类下包含的文档(文章或产品等)数量。
实战演练:多种分类列表的展示方法
掌握了 categoryList 标签及其参数,我们就可以着手在网站上实现各种分类列表的展示了。
一、获取并展示所有顶级分类
这是最基础的用法,常用于网站主导航或首页分类入口。
<nav class="main-nav">
<ul>
{% categoryList topCategories with moduleId="1" parentId="0" %}
{% for item in topCategories %}
<li class="nav-item">
<a href="{{ item.Link }}" title="{{ item.Title }}">{{ item.Title }}</a>
</li>
{% empty %}
<li class="nav-item">当前内容模型下没有顶级分类。</li>
{% endfor %}
{% endcategoryList %}
</ul>
</nav>
这段代码会获取 moduleId 为 1(通常是文章模型)的所有顶级分类,并以无序列表的形式展示出来。如果没有任何分类,它会显示一条提示信息。
二、展示多级分类(嵌套结构)
对于层级较多的分类体系,我们通常需要以嵌套列表的形式来展示,以便用户更清晰地了解分类结构。AnQiCMS 允许你在 categoryList 内部再次调用 categoryList 来实现多级嵌套。
<div class="category-sidebar">
{% categoryList level1Categories with moduleId="1" parentId="0" %}
<ul class="level-1">
{% for category1 in level1Categories %}
<li>
<a href="{{ category1.Link }}">{{ category1.Title }}</a>
{% if category1.HasChildren %} {# 判断当前分类是否有子分类 #}
{% categoryList level2Categories with parentId=category1.Id %} {# 获取当前分类的子分类 #}
<ul class="level-2">
{% for category2 in level2Categories %}
<li>
<a href="{{ category2.Link }}">{{ category2.Title }}</a>
{% if category2.HasChildren %}
{% categoryList level3Categories with parentId=category2.Id %} {# 更多层级可以继续嵌套 #}
<ul class="level-3">
{% for category3 in level3Categories %}
<li><a href="{{ category3.Link }}">{{ category3.Title }}</a></li>
{% endfor %}
</ul>
{% endcategoryList %}
{% endif %}
</li>
{% endfor %}
</ul>
{% endcategoryList %}
{% endif %}
</li>
{% endfor %}
</ul>
{% endcategoryList %}
</div>
通过检查 item.HasChildren 字段,我们能够智能地判断是否需要渲染下一级分类列表,从而构建出清晰的树形结构。
三、动态展示当前分类的子分类或兄弟分类
在分类详情页或内容详情页的侧边栏,你可能希望根据当前页面的分类来动态显示其子分类或同级分类。
<div class="related-categories">
<h3>当前分类的子分类</h3>
<ul>
{% categoryList subCategories %} {# 默认获取当前页面的子分类 #}
{% for item in subCategories %}
<li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
{% empty %}
<li>暂无子分类。</li>
{% endfor %}
{% endcategoryList %}
</ul>
<h3>同级分类</h3>
<ul>
{% categoryList siblingCategories with parentId="parent" %} {# 获取当前分类的兄弟分类 #}
{% for item in siblingCategories %}
<li {% if item.IsCurrent %}class="active"{% endif %}><a href="{{ item.Link }}">{{ item.Title }}</a></li>
{% empty %}
<li>暂无同级分类。</li>
{% endfor %}
{% endcategoryList %}
</ul>
</div>
这里 parentId="parent" 的用法使得在分类页面中获取兄弟