作为一位资深的网站运营专家,我深知在不触及核心代码的前提下,如何巧妙地利用CMS系统的现有功能进行扩展,对于维护系统的稳定性、降低升级成本至关重要。安企CMS(AnQiCMS)凭借其灵活的模板引擎和丰富的标签系统,为我们提供了在内容运营层面进行深度定制的强大工具,其中categoryList标签便是我们常常需要进行功能扩展的一个点。

在安企CMS中,categoryList标签用于获取网站的分类列表,它能帮助我们构建导航、展示分类入口,或是聚合特定分类下的内容。然而,在实际运营中,我们可能希望这些分类列表能承载更多信息,或以更智能的方式展现,而非仅仅是简单的分类名称和链接。接下来,我将围绕如何在不修改AnQiCMS核心代码的前提下,扩展categoryList标签的额外功能,为大家详细讲解几种行之有效的策略。

深入理解categoryList标签的基础能力

首先,让我们回顾一下categoryList标签的强大之处。它允许我们通过moduleId指定内容模型(如文章模型、产品模型),通过parentId筛选特定上级分类下的子分类,甚至可以通过all=true获取所有分类。在循环遍历标签结果时,每个分类项(item)都自带了丰富的属性,例如Id(分类ID)、Title(分类标题)、Link(分类链接)、Description(分类描述)、Logo(分类缩略图大图)、Thumb(分类缩略图)、HasChildren(是否有子分类)以及ArchiveCount(分类下的文档数量)等。这些内置属性是我们进行功能扩展的基石。

然而,当内置属性无法满足我们的个性化需求时,我们便需要寻求额外的扩展途径。幸运的是,AnQiCMS为我们预留了充足的发挥空间,让我们能够在不触碰Go语言核心代码的情况下,在模板层面实现功能增强。

安企CMS的扩展哲学:不触及核心代码

AnQiCMS倡导的是一种“解耦”的开发理念,将核心业务逻辑与前端展示逻辑分离。这意味着,即使我们需要定制复杂的功能,也往往可以在模板文件、自定义字段、辅助标签和过滤器等层面上找到解决方案。这种方式不仅保证了系统升级的顺畅,也大大降低了二次开发的门槛和风险。

实战演练:扩展categoryList的几种实用方法

方法一:巧用自定义字段,为分类信息增添维度

在许多情况下,我们希望为每个分类添加一些非标准属性,例如一个独特的图标、一句特色宣传语,或者与该分类相关的额外图片。AnQiCMS的内容模型管理功能允许我们为分类自定义字段,这便是实现此需求的第一步。

操作步骤:

  1. 在后台为分类模型添加自定义字段: 导航至“内容管理” -> “内容模型”,选择你希望扩展的分类所属的模型(例如“文章模型”)。进入模型编辑界面后,你可以找到“内容模型自定义字段”区域。在这里,你可以添加新的字段,比如“分类图标”(icon)、“背景图片”(bannerImage)等。

    • 字段类型选择: 根据需求选择合适的字段类型,例如“单行文本”用于存储图标的URL或CSS类名,“图片”类型用于存储背景图。
    • 调用字段命名: 确保为你的自定义字段设置一个易于识别的“调用字段”名称,例如category_iconcategory_banner
  2. 在分类编辑页面填写自定义字段内容: 在创建或编辑具体分类时,你会看到你刚才添加的自定义字段。为每个分类填入相应的内容。

在模板中调用自定义字段:

一旦自定义字段设置完毕,我们就可以在categoryList的循环中,直接通过item.你的自定义字段名来访问这些新属性。

{% categoryList categories with moduleId="1" parentId="0" %}
    {% for item in categories %}
        <li class="category-item">
            <a href="{{ item.Link }}" title="{{ item.Title }}">
                {# 调用自定义字段:分类图标 #}
                {% if item.category_icon %}
                    <i class="{{ item.category_icon }}"></i>
                {% endif %}
                <h3>{{ item.Title }}</h3>
                <p>{{ item.Description|truncatechars:50 }}</p>
                {# 调用自定义字段:背景图片 #}
                {% if item.category_banner %}
                    <div class="category-banner" style="background-image: url('{{ item.category_banner }}');"></div>
                {% endif %}
            </a>
            {# 还可以根据HasChildren判断是否显示子分类,并调用子分类列表 #}
            {% if item.HasChildren %}
                <ul class="sub-categories">
                    {% categoryList subCats with parentId=item.Id %}
                        {% for subItem in subCats %}
                            <li><a href="{{ subItem.Link }}">{{ subItem.Title }}</a></li>
                        {% endfor %}
                    {% endcategoryList %}
                </ul>
            {% endif %}
        </li>
    {% empty %}
        <p>暂无分类信息。</p>
    {% endfor %}
{% endcategoryList %}

通过这种方式,我们为每个分类增添了独特的视觉元素和额外信息,而无需触碰AnQiCMS的任何Go语言代码。

方法二:利用模板逻辑和过滤器,按需加工列表数据

AnQiCMS的模板引擎支持条件判断(if)、循环遍历(for)以及丰富的过滤器(filters)。这些工具足以让我们在模板层面进行复杂的数据处理和展示逻辑。

1. 条件渲染与筛选: 我们可能需要根据分类的某些属性来决定如何渲染它。例如,只显示有文档的分类,或者对特定ID的分类进行特殊样式处理。

{% categoryList categories with moduleId="1" parentId="0" %}
    {% for item in categories %}
        {# 只显示文档数量大于0的分类 #}
        {% if item.ArchiveCount > 0 %}
            <li class="category-item {% if item.Id == 10 %}highlight{% endif %}">
                <a href="{{ item.Link }}">
                    <h4>{{ item.Title|upper }}</h4> {# 将分类标题转换为大写 #}
                    <p>{{ item.Description|truncatechars:80 }}</p> {# 截取描述文字 #}
                    <span>包含文档:{{ item.ArchiveCount }} 篇</span>
                </a>
            </li>
        {% endif %}
    {% empty %}
        <p>暂无分类信息。</p>
    {% endfor %}
{% endcategoryList %}

这里我们使用了item.ArchiveCount进行条件判断,并结合item.Id添加特定样式。同时,利用upper过滤器将标题转换为大写,truncatechars过滤器截取描述内容,让显示更加精炼。

2. 数据组合与联动:categoryList的循环中,我们可以嵌套其他标签,实现不同数据之间的联动。例如,在每个分类下,展示其最新的几篇文档。

”`twig {% categoryList categories with moduleId=“1” parentId=“0” %}

{% for item in categories %}
    <div class="category-block">
        <h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
        <ul class="latest-archives">
            {# 在每个分类下,调用该分类最新的5篇文档 #}
            {% archiveList archives with type="list" categoryId