在AnQiCMS中管理和展示网站内容,分类信息扮演着至关重要的角色。无论是组织产品目录,还是整理文章专题,清晰的分类结构都能极大提升用户体验和网站的导航效率。而categoryList标签正是AnQiCMS提供的一把利器,帮助我们灵活地获取并展示这些分类信息。
categoryList标签的主要作用是检索并循环显示您网站中的分类数据。它能根据您的需求,获取特定内容模型(如文章或产品)下的顶级分类、子分类,甚至所有分类,并将这些数据呈现在网站页面上。
如何使用categoryList获取分类信息
要使用categoryList标签,您首先需要在模板文件中指定它,并通常会搭配一个循环结构来遍历获取到的分类数据。它的基本结构如下:
{% categoryList 变量名称 with 参数 %}
{% for item in 变量名称 %}
{# 在这里显示每个分类的详细信息 #}
{% endfor %}
{% endcategoryList %}
其中,变量名称是您为获取到的分类列表自定义的一个名字,例如categories或productCategories。参数则是您用来筛选和控制获取哪些分类的关键。
接下来,我们来看看几个常用的参数,它们将决定您获取到什么样的分类列表:
moduleId:指定内容模型 这是最核心的参数之一。AnQiCMS支持多种内容模型(例如,默认的文章模型和产品模型),您需要明确告诉系统您想获取哪种模型下的分类。- 如果您想获取文章分类,通常将
moduleId设置为1。 - 如果您想获取产品分类,通常将
moduleId设置为2。 例如:moduleId="1"将只获取文章模型下的所有分类。
- 如果您想获取文章分类,通常将
parentId:控制层级关系 这个参数用来指定您要获取的分类的父级ID,从而实现多级分类的展示。- 要获取所有顶级分类,将
parentId设置为0。这是构建主导航菜单的常用方式。 - 要获取某个特定分类下的子分类,您可以将
parentId设置为该父分类的Id(例如parentId=item.Id,这通常在循环中用于显示二级或多级菜单)。 - 如果您想在当前分类页面显示其兄弟分类(即同级别的其他分类),可以设置
parentId="parent"。
- 要获取所有顶级分类,将
all:获取所有分类 如果您需要获取某个moduleId下的所有分类,无论层级如何,都可以将all参数设置为true。例如:all=true。如果您同时指定了moduleId,它将获取该模型下的所有分类。limit:控制显示数量 如果您只想显示固定数量的分类,可以使用limit参数来限制。比如limit="5"将只显示前5个分类。它还支持更高级的offset模式,例如limit="2,10"表示从第2个分类开始,获取10个分类。siteId:多站点数据调用 在多站点管理场景下,如果您需要调用其他站点的数据,可以通过siteId来指定。一般情况下,无需设置此参数。
您可以显示哪些分类信息?
在循环遍历categoryList获取到的每一个item(即每个分类)时,您可以访问多种属性来展示分类的详细信息,例如:
Id:分类的唯一ID。Title:分类的名称,通常用于显示在导航或列表中。Link:分类的URL链接,直接点击可跳转到该分类页面。Description:分类的简短描述。Content:分类的详细内容,可能包含HTML格式,显示时可能需要|safe过滤器。ParentId:该分类的父级ID。Logo:分类的缩略图大图地址。Thumb:分类的缩略图地址。HasChildren:一个布尔值,表示该分类是否有下级分类,非常适合动态菜单的展开/收起判断。IsCurrent:一个布尔值,表示当前分类是否为当前访问页面所处的分类,常用于高亮显示当前导航项。ArchiveCount:该分类下(包含子分类)的文章或产品数量。
实际应用示例
示例1:获取并显示文章模型的顶级分类列表
假设您想在网站顶部导航显示文章模型的几个主要分类:
<nav>
<ul class="main-nav">
{% categoryList articleCategories with moduleId="1" parentId="0" limit="5" %}
{% for item in articleCategories %}
<li class="nav-item {% if item.IsCurrent %}active{% endif %}">
<a href="{{ item.Link }}">{{ item.Title }}</a>
</li>
{% endfor %}
{% endcategoryList %}
</ul>
</nav>
这段代码会获取文章模型下ID为0(即顶级)的最多5个分类,并为当前页面的分类添加active样式。
示例2:显示产品模型的两级分类菜单
如果您有一个产品中心,需要显示主分类及其下的二级分类:
<div class="product-menu">
{% categoryList mainProductCategories with moduleId="2" parentId="0" %}
{% for mainCat in mainProductCategories %}
<div class="main-category">
<h3><a href="{{ mainCat.Link }}">{{ mainCat.Title }}</a></h3>
{% if mainCat.HasChildren %}
<ul class="sub-categories">
{% categoryList subProductCategories with parentId=mainCat.Id %}
{% for subCat in subProductCategories %}
<li class="sub-item">
<a href="{{ subCat.Link }}">{{ subCat.Title }} ({{ subCat.ArchiveCount }})</a>
</li>
{% endfor %}
{% endcategoryList %}
</ul>
{% endif %}
</div>
{% endfor %}
{% endcategoryList %}
</div>
这里,我们首先获取产品模型下的所有顶级分类。在循环中,通过mainCat.HasChildren判断是否有子分类,如果有,则再次使用categoryList并传入mainCat.Id来获取二级分类,并显示每个子分类下的产品数量。
示例3:在分类页面显示当前分类下的文章列表
在一个文章分类列表页(例如/category/news/),您可能想在页面上方显示当前分类的描述,然后列出该分类下的文章。
<article>
<h1 class="category-title">{% categoryDetail with name="Title" %}</h1>
<div class="category-description">{% categoryDetail with name="Description" %}</div>
<ul class="article-list">
{% archiveList articles with type="page" limit="10" %} {# categoryId参数会智能读取当前页面分类ID #}
{% for article in articles %}
<li>
<a href="{{ article.Link }}">
<h2>{{ article.Title }}</h2>
<p>{{ article.Description }}</p>
<span class="date">{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
</a>
</li>
{% empty %}
<li>当前分类下没有文章。</li>
{% endfor %}
{% endarchiveList %}
</ul>
{# 如果是分页列表,别忘了加上分页标签 #}
{% pagination pages with show="5" %}
{# 分页HTML结构 #}
{% endpagination %}
</article>
在这个例子中,{% categoryDetail with name="Title" %}和{% categoryDetail with name="Description" %}会智能地获取当前页面的分类标题和描述。而archiveList标签在type="page"模式下,会根据当前页面的分类ID自动获取文章列表。
总结
categoryList标签是AnQiCMS模板开发中不可或缺的一部分,它让您能够以高度灵活的方式展示网站的分类结构。通过合理运用moduleId、parentId等参数,并结合各个分类属性,您可以构建出用户友好且功能强大的导航和内容组织体系。
常见问题 (FAQ)
1. 我想在模板中获取所有文章分类和产品分类,不区分层级,应该怎么做?
您可以使用两个独立的categoryList标签,分别指定文章和产品模型的moduleId,并将all参数设置为true。例如:
{# 获取所有文章分类 #}
{% categoryList allArticleCategories with moduleId="1" all=true %}
{% for cat in allArticleCategories %}
<a href="{{ cat.Link }}">{{ cat.Title }}</a>
{% endfor %}
{% endcategoryList %}
{# 获取所有产品分类 #}
{% categoryList allProductCategories with moduleId="2" all=true %}
{% for cat in allProductCategories %}
<a href="{{ cat.Link }}">{{ cat.Title }}</a>
{% endfor %}
{% endcategoryList %}
2. 在一个分类详情页,如何只显示当前分类的子分类,而不是该模型的所有子分类?
在分类详情页面,AnQiCMS会自动识别当前页面的分类ID。您可以使用这个特性,将parentId参数设置为当前分类的ID来获取其直接子分类。
{# 假设当前页面是某个父分类的详情页 #}
<ul class="sub-category-list">
{% categoryList subCategories with parentId=category.Id %} {# 这里的 category.Id 会自动指向当前分类的ID #}
{% for subCat in subCategories %}
<li><a href="{{ subCat.Link }}">{{ subCat.Title }}</a></li>
{% endfor %}
{% empty %}
<li>当前分类没有子分类。</li>
{% endcategoryList %}
</ul>
请注意,当您在categoryList标签外部调用{{category.Id}}时,category通常是指当前页面上下文中的分类对象。如果当前上下文没有明确的category对象,您可能需要先使用categoryDetail来获取当前分类信息。
3. 如何为分类设置自定义字段并在模板中显示?
在AnQiCMS后台,您可以为内容模型(例如文章模型或产品模型)的分类添加自定义字段。一旦添加并填写了数据,这些自定义字段在模板中可以直接通过分类item对象来访问,或者通过categoryDetail标签来获取。
例如,如果您为分类添加了一个名为banner_image的自定义字段:
{# 在 categoryList 循环中直接访问 #}
{% categoryList categories with moduleId="1" parentId="0" %}
{% for item in categories %}
<a href="{{ item.Link }}">
{{ item.Title }}
{% if item.banner_image %}
<img src="{{ item.banner_image }}" alt="{{ item.Title }} Banner">
{% endif %}
</a>
{% endfor %}
{% endcategoryList %}
{# 或者在分类详情页通过 categoryDetail 标签访问 #}
{% categoryDetail currentCategory with name="banner_image" %}
{% if currentCategory %}
<img src="{{ currentCategory }}" alt="Current Category Banner">
{% endif %}
请确保自定义字段的名称(例如banner_image)与您在后台设置的“调用字段”名称一致。