如何在安企CMS模板中调用特定分类下的文章列表?

在安企CMS中管理和展示内容是其核心优势之一,而灵活调用特定分类下的文章列表更是网站内容运营中不可或缺的功能。无论您是想在首页展示某个专题的最新文章,还是在侧边栏显示当前分类下的热门推荐,安企CMS的模板标签都能帮助您轻松实现。

安企CMS的模板系统采用了类似Django模板引擎的语法,使用起来直观且强大。核心在于几个关键的模板标签及其参数,通过这些标签的组合,我们能够精确地控制需要展示的内容。

核心工具:archiveList 标签初探

要在安企CMS模板中调用文章列表,最主要的标签就是 archiveList。这个标签如同一个智能筛选器,能根据您设定的条件,从海量文章中精准挑选出符合要求的列表。

archiveList 标签支持多种参数,其中与调用特定分类文章列表最密切相关的就是 categoryIdmoduleId

  • categoryId: 这是指定分类的关键参数。您可以传入一个具体的分类ID,或者多个分类ID(用逗号分隔),来获取这些分类下的文章。
  • moduleId: 安企CMS支持灵活的内容模型,如“文章模型”、“产品模型”等。通过 moduleId 参数,您可以指定从哪个内容模型中获取文章。例如,moduleId="1" 通常代表文章模型,moduleId="2" 可能代表产品模型。
  • type: 这个参数决定了文章列表的类型,可以是 list(简单列表),page(带有分页功能的列表),或 related(相关文章)。
  • limit: 控制返回文章的数量。比如 limit="10" 会显示最新的10篇文章。
  • order: 指定文章的排序方式,如按发布时间倒序 (id desc)、浏览量倒序 (views desc) 等。
  • child: 一个非常实用的参数,决定是否包含子分类的文章。child=true(默认)会包含子分类,child=false 则只显示当前分类的文章。

了解了这些基础,我们就可以着手实际操作了。

实际操作:一步步实现特定分类文章列表调用

第一步:确定目标分类的ID

在调用特定分类文章列表之前,我们首先需要知道目标分类的ID。有几种方式可以获取:

  1. 从后台管理界面获取: 登录安企CMS后台,进入“内容管理” -> “文档分类”。在这里,您可以找到所有已创建的分类,并记录下您想要调用的分类的ID。
  2. 通过URL地址获取: 如果您正在浏览某个分类页面,其URL中通常会包含分类的ID(例如:/category/10.html 中的 10 就是分类ID)。
  3. 使用 categoryDetail 标签动态获取: 在模板中,如果您已经在一个分类的上下文中(比如正在渲染一个分类列表页),可以通过 categoryDetail 标签来获取当前分类的ID。例如:{% categoryDetail with name="Id" %} 会返回当前分类的ID。

假设我们已经明确要调用ID为 5 的“公司新闻”分类下的文章。

第二步:使用 archiveList 调用文章列表

现在,我们可以将分类ID传入 archiveList 标签来获取文章列表了。

场景一:获取指定分类的最新10篇文章(不带分页)

如果您只想在一个区域(例如侧边栏)显示某个分类的少量文章,可以使用 type="list"

{# 假设“公司新闻”分类的ID是5,文章模型ID是1 #}
<div class="news-list">
    <h3>公司新闻</h3>
    <ul>
        {% archiveList articles with categoryId="5" moduleId="1" type="list" limit="10" order="id desc" %}
            {% for article in articles %}
                <li>
                    <a href="{{ article.Link }}" title="{{ article.Title }}">
                        {{ article.Title }}
                    </a>
                    <span>发布于:{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
                </li>
            {% empty %}
                <li>暂无公司新闻。</li>
            {% endfor %}
        {% endarchiveList %}
    </ul>
</div>

在这个例子中:

  • archiveList articles:将获取到的文章列表赋值给 articles 变量。
  • categoryId="5":指定了要获取文章的分类ID。
  • moduleId="1":指定从文章模型中获取内容。
  • type="list":表示这是一个简单的文章列表,不涉及分页。
  • limit="10":限制只显示最新的10篇文章。
  • order="id desc":按照文章ID倒序排列,通常意味着最新发布的文章在前。
  • {% for article in articles %}:遍历 articles 变量中的每一篇文章。
  • {{ article.Link }}{{ article.Title }}:分别获取文章的链接和标题。
  • {{ stampToDate(article.CreatedTime, "2006-01-02") }}:将文章的发布时间戳格式化为“年-月-日”的日期格式。
  • {% empty %}:当 articles 列表中没有内容时,会显示 <li>暂无公司新闻。</li>,这是一种非常友好的用户体验。
场景二:在分类列表页动态显示文章,并支持分页

当您处于一个分类的页面时,通常希望显示该分类下的所有文章,并且支持用户进行分页浏览。此时,categoryId 的值可以动态获取,并且 type 需要设置为 page

{# 假设我们正在一个分类的详情页,当前分类ID可以通过 category.Id 获取 #}
<div class="category-articles">
    <h2>{% categoryDetail with name="Title" %}</h2> {# 显示当前分类标题 #}
    <ul>
        {% archiveList articles with categoryId=category.Id moduleId="1" type="page" limit="15" order="views desc" child=false %}
            {% for article in articles %}
                <li>
                    <a href="{{ article.Link }}" title="{{ article.Title }}">
                        {% if article.Thumb %}
                            <img src="{{ article.Thumb }}" alt="{{ article.Title }}" />
                        {% endif %}
                        <h4>{{ article.Title }}</h4>
                        <p>{{ article.Description|truncatechars:100 }}</p> {# 截取描述前100个字符 #}
                    </a>
                    <div class="article-meta">
                        <span>阅读:{{ article.Views }}</span>
                        <span>{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
                    </div>
                </li>
            {% empty %}
                <li>此分类下暂无文章。</li>
            {% endfor %}
        {% endarchiveList %}
    </ul>

    {# 分页导航 #}
    <div class="pagination-area">
        {% pagination pages with show="5" %}
            <a href="{{ pages.FirstPage.Link }}" class="{% if pages.FirstPage.IsCurrent %}active{% endif %}">首页</a>
            {% if pages.PrevPage %}<a href="{{ pages.PrevPage.Link }}">上一页</a>{% endif %}
            {% for item in pages.Pages %}
                <a href="{{ item.Link }}" class="{% if item.IsCurrent %}active{% endif %}">{{ item.Name }}</a>
            {% endfor %}
            {% if pages.NextPage %}<a href="{{ pages.NextPage.Link }}">下一页</a>{% endif %}
            <a href="{{ pages.LastPage.Link }}" class="{% if pages.LastPage.IsCurrent %}active{% endif %}">尾页</a>
        {% endpagination %}
    </div>
</div>

在这个例子中:

  • categoryId=category.Id:动态获取当前分类的ID。category.Id 这个变量通常在访问分类页面时由系统自动提供,或者您可以先使用 {% categoryDetail categoryInfo with name="Id" %} 来获取并赋值给 categoryInfo.Id
  • type="page":开启了分页功能。
  • limit="15":每页显示15篇文章。
  • order="views desc":按照浏览量