分类列表标签`categoryList`如何获取并显示文章、产品分类信息?

在AnQiCMS中管理和展示网站内容,分类信息扮演着至关重要的角色。无论是组织产品目录,还是整理文章专题,清晰的分类结构都能极大提升用户体验和网站的导航效率。而categoryList标签正是AnQiCMS提供的一把利器,帮助我们灵活地获取并展示这些分类信息。

categoryList标签的主要作用是检索并循环显示您网站中的分类数据。它能根据您的需求,获取特定内容模型(如文章或产品)下的顶级分类、子分类,甚至所有分类,并将这些数据呈现在网站页面上。

如何使用categoryList获取分类信息

要使用categoryList标签,您首先需要在模板文件中指定它,并通常会搭配一个循环结构来遍历获取到的分类数据。它的基本结构如下:

{% categoryList 变量名称 with 参数 %}
    {% for item in 变量名称 %}
        {# 在这里显示每个分类的详细信息 #}
    {% endfor %}
{% endcategoryList %}

其中,变量名称是您为获取到的分类列表自定义的一个名字,例如categoriesproductCategories参数则是您用来筛选和控制获取哪些分类的关键。

接下来,我们来看看几个常用的参数,它们将决定您获取到什么样的分类列表:

  1. moduleId:指定内容模型 这是最核心的参数之一。AnQiCMS支持多种内容模型(例如,默认的文章模型和产品模型),您需要明确告诉系统您想获取哪种模型下的分类。

    • 如果您想获取文章分类,通常将moduleId设置为1
    • 如果您想获取产品分类,通常将moduleId设置为2。 例如:moduleId="1"将只获取文章模型下的所有分类。
  2. parentId:控制层级关系 这个参数用来指定您要获取的分类的父级ID,从而实现多级分类的展示。

    • 要获取所有顶级分类,将parentId设置为0。这是构建主导航菜单的常用方式。
    • 要获取某个特定分类下的子分类,您可以将parentId设置为该父分类的Id(例如parentId=item.Id,这通常在循环中用于显示二级或多级菜单)。
    • 如果您想在当前分类页面显示其兄弟分类(即同级别的其他分类),可以设置parentId="parent"
  3. all:获取所有分类 如果您需要获取某个moduleId下的所有分类,无论层级如何,都可以将all参数设置为true。例如:all=true。如果您同时指定了moduleId,它将获取该模型下的所有分类。

  4. limit:控制显示数量 如果您只想显示固定数量的分类,可以使用limit参数来限制。比如limit="5"将只显示前5个分类。它还支持更高级的offset模式,例如limit="2,10"表示从第2个分类开始,获取10个分类。

  5. 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模板开发中不可或缺的一部分,它让您能够以高度灵活的方式展示网站的分类结构。通过合理运用moduleIdparentId等参数,并结合各个分类属性,您可以构建出用户友好且功能强大的导航和内容组织体系。


常见问题 (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)与您在后台设置的“调用字段”名称一致。