安企CMS如何在分类页面嵌套显示该分类下的文章列表?

在网站运营中,内容分类页面承载着组织信息、引导用户浏览的重要职责。一个设计合理、内容丰富的分类页面不仅能提升用户体验,还能优化搜索引擎抓取效率。对于安企CMS(AnQiCMS)的用户来说,在分类页面中嵌套显示该分类下的文章列表,是一个非常基础且常用的功能。本篇文章将详细为您介绍如何利用安企CMS强大的模板标签,轻松实现这一目标。

理解分类页面与内容模型

在开始之前,我们先来简单回顾一下安企CMS中内容组织的两大核心概念:内容模型分类

  • 内容模型: 它是您网站上内容的骨架,例如“文章模型”、“产品模型”等。每个模型可以定义自己的字段(如文章有“作者”、“来源”,产品有“价格”、“库存”等)。您发布的所有内容都必须归属于一个特定的内容模型。这在后续调用文章列表时,通过moduleId参数来指定模型,显得尤为重要。
  • 分类: 则是对内容进行归类整理的方式。您可以为每个内容模型创建独立的分类体系,例如“文章”模型下有“新闻动态”、“行业资讯”,而“产品”模型下可能有“手机产品”、“电脑产品”等。

当用户访问一个分类页面时,他们期待看到的是该分类下所有相关的文章或产品列表。安企CMS提供了灵活的模板机制,允许我们自定义分类页面的展示方式。

准备您的分类列表模板文件

安企CMS的模板系统非常灵活。通常,分类列表页面的模板文件会存放在/template/您的模板目录/{模型table}/下。

  • 默认分类列表模板: 通常是{模型table}/list.html。例如,如果您的分类属于“文章”模型,那么默认模板可能是article/list.html
  • 自定义分类模板: 如果您希望某个特定的分类(比如“公司新闻”)拥有独特的布局,可以在后台为该分类指定一个自定义模板,例如article/list-news.htmlarticle/list-10.html(其中10是分类ID)。

无论您使用哪种模板文件,接下来的步骤都将在此文件中进行操作。

核心实现:在分类页面显示文章列表

要在分类页面中嵌套显示该分类下的文章列表,我们将主要使用到以下几个安企CMS的模板标签:

  1. categoryDetail 标签: 用于获取当前分类页面的详细信息,最重要的是获取当前分类的ID。
  2. archiveList 标签: 这是获取文章列表的核心标签,它能根据多种条件(包括分类ID、模型ID等)筛选并列出文章。
  3. pagination 标签: 如果文章数量较多,分页是必不可少的,这个标签可以帮助我们快速生成分页导航。

下面我们通过一个详细的代码示例来演示如何将这些标签组合使用。假设我们要在一个文章分类页面(例如article/list.html)中显示该分类下的文章列表,并支持分页。

实战代码示例:

{# 假设这是您的文章分类列表页面模板文件:/template/default/article/list.html #}

{% extends 'base.html' %} {# 继承基础布局,如包含头部、底部等公共部分 #}

{# 获取当前分类的详细信息,这里将分类信息存储在名为 'category' 的变量中 #}
{% categoryDetail category %}
    {% set currentCategoryId = category.Id %} {# 提取当前分类的ID,方便后续使用 #}
    {% set currentModuleId = category.ModuleId %} {# 提取当前分类所属的模型ID #}

    {% block title %}
        <title>{{ category.Title }} - 文章列表</title> {# 设置页面标题为分类名称 #}
    {% endblock %}

    {% block content %}
        <div class="category-header">
            <h1>{{ category.Title }}</h1> {# 显示分类名称 #}
            <p>{{ category.Description }}</p> {# 显示分类描述 #}
            {# 您也可以在此处显示分类的Banner图或缩略图 #}
            {% if category.Logo %}
                <img src="{{ category.Logo }}" alt="{{ category.Title }}">
            {% endif %}
        </div>

        <div class="article-list-section">
            <h2>最新文章</h2>
            {# 使用 archiveList 标签获取当前分类下的文章列表 #}
            {# type="page" 表示启用分页,limit="10" 表示每页显示10篇文章 #}
            {# categoryId 使用我们之前获取到的 currentCategoryId #}
            {# moduleId 使用我们之前获取到的 currentModuleId #}
            {% archiveList archives with type="page" categoryId=currentCategoryId moduleId=currentModuleId limit="10" %}

                {% if archives %} {# 判断是否有文章 #}
                    <ul class="article-list">
                        {% for item in archives %}
                            <li class="article-item">
                                <a href="{{ item.Link }}">
                                    <h3>{{ item.Title }}</h3>
                                    {% if item.Thumb %}
                                        <img src="{{ item.Thumb }}" alt="{{ item.Title }}" class="article-thumb">
                                    {% endif %}
                                    <p class="article-description">{{ item.Description }}</p>
                                    <div class="article-meta">
                                        <span>发布日期: {{ stampToDate(item.CreatedTime, "2006-01-02") }}</span>
                                        <span>阅读量: {{ item.Views }}</span>
                                    </div>
                                </a>
                            </li>
                        {% endfor %}
                    </ul>

                    {# 插入分页导航 #}
                    <div class="pagination-area">
                        {% pagination pages with show="5" %} {# 最多显示5个页码按钮 #}
                        <ul>
                            {# 首页链接 #}
                            <li {% if pages.FirstPage.IsCurrent %}class="active"{% endif %}><a href="{{ pages.FirstPage.Link }}">{{ pages.FirstPage.Name }}</a></li>
                            {# 上一页链接 #}
                            {% if pages.PrevPage %}
                                <li><a href="{{ pages.PrevPage.Link }}">{{ pages.PrevPage.Name }}</a></li>
                            {% endif %}
                            {# 中间页码 #}
                            {% for pageItem in pages.Pages %}
                                <li {% if pageItem.IsCurrent %}class="active"{% endif %}><a href="{{ pageItem.Link }}">{{ pageItem.Name }}</a></li>
                            {% endfor %}
                            {# 下一页链接 #}
                            {% if pages.NextPage %}
                                <li><a href="{{ pages.NextPage.Link }}">{{ pages.NextPage.Name }}</a></li>
                            {% endif %}
                            {# 尾页链接 #}
                            <li {% if pages.LastPage.IsCurrent %}class="active"{% endif %}><a href="{{ pages.LastPage.Link }}">{{ pages.LastPage.Name }}</a></li>
                        </ul>
                        {% endpagination %}
                    </div>

                {% else %}
                    <p class="no-content">当前分类下暂无文章。</p> {# 没有文章时显示提示信息 #}
                {% endif %}

            {% endarchiveList %}
        </div>
    {% endblock %}
{% endcategoryDetail %}

代码解析:

  • {% categoryDetail category %} 这个标签获取当前URL对应的分类信息,并将其赋值给category变量。这样,我们就能在模板中通过category.Titlecategory.Description等访问分类的各种属性。
  • {% set currentCategoryId = category.Id %} 这里我们提取了分类的Id,因为archiveList标签需要这个ID来精确筛选文章。同时,category.ModuleId也提供了当前分类所属的内容模型ID。
  • {% archiveList archives with ... %}
    • archives:这是我们给文章列表数据起的名字,您可以在循环中用item来代表每一篇文章。
    • type="page"非常重要! 只有设置为"page"archiveList才会返回分页所需的所有数据,并允许pagination标签正常工作。如果只是想简单列出几篇文章,不带分页,可以使用type="list"
    • categoryId=currentCategoryId:将之前获取的当前分类ID传递给文章列表标签,确保只显示本分类的文章。
    • moduleId=currentModuleId:指定文章所属的内容模型ID。在多内容模型网站中,这是确保正确内容被调用的关键。
    • limit="10":设定每页显示10篇文章。您可以根据需要调整这个数字。
  • {% for item in archives %} 循环遍历archiveList返回的文章数组,item代表每一篇文章对象。
  • **{{ item.Link }}{{ item.Title }}、`{{ item.