在安企CMS的模板开发中,分类列表 (categoryList) 标签是网站内容组织和导航构建的核心工具之一。它能帮助我们轻松地展示文章、产品等内容的分类结构。然而,在实际应用中,我们可能不仅需要展示分类本身,还需要根据分类的数量来灵活调整页面布局,或者决定是否显示一个“全部”选项,以便用户可以浏览所有分类下的内容。

那么,我们如何在 categoryList 返回的分类列表中获取分类的总数,并以此来控制页面的显示逻辑呢?接下来,我们将深入探讨这一实用技巧。

理解 categoryList 标签及其返回数据

首先,让我们回顾一下 categoryList 标签的基本用法。这个标签的主要功能是获取网站的分类列表,我们可以通过 moduleId 参数指定要获取哪种内容模型的分类(例如文章模型ID为1,产品模型ID为2),通过 parentId 参数来获取某个父级分类下的子分类,或者通过 parentId="0" 获取顶级分类。

当我们使用 {% categoryList categories with moduleId="1" parentId="0" %} 这样的方式调用标签时,它会返回一个名为 categories 的数组对象。这个数组包含了所有符合条件的分类信息,例如每个分类的ID、标题、链接等。获取分类总数的关键,就在于如何操作这个 categories 数组。

获取分类列表总数的方法

在安企CMS的模板引擎中,有几种方式可以轻松获取 categoryList 标签返回的分类列表的总数:

  1. 利用 for 循环中的 forloop.Length 属性 当我们在 for 循环中遍历 categories 数组时,forloop 这个内置对象会自动提供当前循环的一些信息,其中就包括 forloop.Length,它表示了当前正在循环的数组的总长度。

    {% categoryList categories with moduleId="1" parentId="0" %}
        {% if categories %} {# 首先判断列表是否为空 #}
            {% for item in categories %}
                {# 这里的 forloop.Length 就是分类列表的总数 #}
                <p>当前分类总数:{{ forloop.Length }}</p>
                <p>分类名称:{{ item.Title }}</p>
            {% endfor %}
        {% endif %}
    {% endcategoryList %}
    

    这种方法非常直观,尤其适用于你已经在循环分类列表,并且需要在循环内部使用总数的情况。

  2. 使用 length 过滤器 length 过滤器是安企CMS模板引擎提供的一个通用过滤器,它可以用于获取字符串、数组或键值对的长度。对于 categoryList 返回的 categories 数组,我们可以直接对它使用 length 过滤器来获取总数,而无需进入循环。

    {% categoryList categories with moduleId="1" parentId="0" %}
        {% set categoryCount = categories|length %}
        <p>分类列表总数:{{ categoryCount }}</p>
    {% endcategoryList %}
    

    这种方法更加灵活,因为它可以在 for 循环之外直接获取总数,非常适合在布局控制等需要提前知道总数的情况下使用。为了保持代码整洁,我们通常会将其赋值给一个临时变量(例如 categoryCount),方便后续使用。

实际应用:控制页面布局与“全部”选项

了解了如何获取分类总数后,我们就可以将其应用到实际的页面设计中。

场景一:根据分类数量动态调整页面布局

假设我们有一个分类导航区域,如果分类数量少于5个,我们希望它们横向平铺显示;如果多于5个,则可能需要显示一个“更多”按钮或者采用两列甚至更多列的布局。

{% categoryList categories with moduleId="1" parentId="0" %}
    {% set categoryCount = categories|length %}

    {% if categoryCount > 5 %}
        <div class="category-nav-complex">
            {# 复杂的布局,例如多列或者带滚动条的布局 #}
            <p>当前有 {{ categoryCount }} 个分类,采用复杂布局。</p>
            <ul>
                {% for item in categories %}
                    <li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
                {% endfor %}
            </ul>
        </div>
    {% else %}
        <div class="category-nav-simple">
            {# 简单的布局,例如横向平铺 #}
            <p>当前有 {{ categoryCount }} 个分类,采用简洁布局。</p>
            <ul>
                {% for item in categories %}
                    <li><a href="{{ item.Link }}">{{ item.Title }}</a></li>
                {% endfor %}
            </ul>
        </div>
    {% endif %}
{% endcategoryList %}

场景二:动态显示“全部”选项

在很多分类列表中,我们希望在所有具体分类之前,提供一个“全部”选项,点击后可以查看所有分类下的内容。但如果网站本身只有一个分类,或者根本没有分类,那么“全部”选项可能就显得多余了。通过获取分类总数,我们可以智能地控制“全部”选项的显示。

<div class="category-filter-bar">
    {% categoryList categories with moduleId="1" parentId="0" %}
        {% set categoryCount = categories|length %}

        {# 只有当存在多个分类时,才显示“全部”选项。或者即使只有一个分类,也希望显示“全部” #}
        {% if categoryCount > 1 or categoryCount == 1 %} {# 可以根据实际需求调整这里的条件 #}
            <a href="/archive/list.html" class="{% if currentCategoryId == 0 %}active{% endif %}">全部</a>
        {% endif %}

        {% for item in categories %}
            <a href="{{ item.Link }}" class="{% if currentCategoryId == item.Id %}active{% endif %}">{{ item.Title }}</a>
        {% endfor %}
    {% endcategoryList %}
</div>

在这个示例中,currentCategoryId 假设是当前页面所在的分类ID,当它是0时,表示当前正在浏览“全部”内容。通过 categoryCount 的判断,我们可以让“全部”选项在有意义的时候才显示出来,避免页面冗余。

获取 categoryList 返回的分类列表总数是一个简单却非常有用的技巧。无论是为了更好地控制页面布局,还是为了提供更智能的用户交互,掌握 forloop.Lengthlength 过滤器都能让您的安企CMS网站模板更具灵活性和适应性。通过这些方法,您可以让网站内容展示更加贴合用户需求,提供更流畅的浏览体验。

常见问题 (FAQ)

  1. forloop.Length|length 过滤器有什么区别? forloop.Length 是在 for 循环内部使用的特殊变量,它只能在每次循环迭代时获取当前循环列表的总长度。而 |length 过滤器可以应用于任何数组、字符串或键值对对象,无论是否在 for 循环内部,它都可以直接获取该对象的长度。简而言之,forloop.Length 带有上下文限制,|length 过滤器则更通用。

  2. 如何判断 categoryList 返回的列表是否为空? 您可以使用 if 标签直接判断 categories 变量是否存在或者其长度是否大于0。例如:

    {% categoryList categories with moduleId="1" parentId="0" %}
        {% if categories %} {# 判断categories是否存在且不为空 #}
            {# 列表不为空时的处理逻辑 #}
        {% else %}
            {# 列表为空时的处理逻辑 #}
        {% endif %}
    {% endcategoryList %}
    

    或者使用 |length 过滤器:

    {% categoryList categories with moduleId="1" parentId="0" %}
        {% if categories|length > 0 %}
            {# 列表不为空时的处理逻辑 #}
        {% else %}
            {# 列表为空时的处理逻辑 #}
        {% endif %}
    {% endcategoryList %}
    
  3. 除了总数,categoryList 还能提供哪些有用的信息来控制页面显示? categoryList 标签返回的每个分类对象 (item) 包含许多有用的属性,例如 item.Id (分类ID), item.Title (分类标题), item.Link (分类链接), item.Description (分类描述), item.HasChildren (是否有子分类), item.IsCurrent (是否当前分类) 等。您可以根据这些属性进一步细化页面显示逻辑,例如判断 item.HasChildren 来决定是否显示二级菜单,或者判断 item.IsCurrent 来为当前分类添加激活样式。