如何在模板中获取并显示文章列表,并控制每页显示的文章数量?

在使用安企CMS(AnQiCMS)管理网站内容时,灵活地在前端页面展示文章列表是运营人员的日常需求。无论是首页的最新动态、分类页下的文章集合,还是带有分页功能的内容聚合页,AnQiCMS都提供了强大且易用的模板标签来帮助我们实现这些功能。今天,我们就来深入了解如何在AnQiCMS模板中高效获取并显示文章列表,并精确控制每页显示的文章数量。

核心:archiveList 标签,内容展示的“调度员”

在AnQiCMS模板中,展示文章列表的核心工具是archiveList标签。这个标签就像一个智能的内容调度员,能够根据我们设定的各种条件,从海量文章中筛选出目标内容,并以我们期望的方式呈现。

我们先从最基础的用法开始。如果你只是想在页面上固定显示一定数量的文章,例如最新的5篇文章,你可以这样使用archiveList标签:

{% archiveList archives with type="list" limit="5" %}
    {% for item in archives %}
    <li>
        <a href="{{item.Link}}">
            <h5>{{item.Title}}</h5>
            <p>{{item.Description}}</p>
            <div>
                <span>发布日期:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
                <span>阅读量:{{item.Views}}</span>
            </div>
        </a>
    </li>
    {% else %}
    <li>暂时没有相关文章。</li>
    {% endfor %}
{% endarchiveList %}

在这段代码中,archiveList标签通过type="list"指定了列表类型为固定列表,而limit="5"则明确告诉系统只获取最新的5篇文章。archives是我们给获取到的文章列表起的变量名,在随后的for循环中,我们可以通过item.Titleitem.Link等方式访问每篇文章的标题、链接等信息。stampToDate标签则用于将文章的时间戳格式化为我们可读的日期格式。

进阶:type="page"pagination 标签,实现分页文章列表

当你的内容量较大,需要用户通过点击页码来浏览更多文章时,archiveList标签与pagination标签的组合就显得尤为重要。

首先,archiveList标签需要将type参数设置为"page"。这会告诉系统,我们期望获取的文章列表是用于分页显示的,系统会自动处理当前页码和总文章数等信息。

接着,我们需要引入pagination标签来生成页码导航。pagination标签会根据archiveList处理后的分页数据,自动生成“首页”、“上一页”、“下一页”以及具体的页码链接。

让我们通过一个完整的例子来理解它们如何协同工作:

{# 假设这是一个文章列表页,通过URL参数可传递分类ID或搜索关键词 #}

<div class="article-list-container">
    {% archiveList archives with type="page" limit="10" moduleId="1" %} {# 获取文章模型下每页10篇文章,准备分页 #}
        {% for item in archives %}
        <article class="article-item">
            <a href="{{item.Link}}">
                {% if item.Thumb %}
                <div class="article-thumb">
                    <img src="{{item.Thumb}}" alt="{{item.Title}}">
                </div>
                {% endif %}
                <div class="article-info">
                    <h3>{{item.Title}}</h3>
                    <p class="article-description">{{item.Description}}</p>
                    <div class="article-meta">
                        <span class="category-name">分类:{% categoryDetail with name="Title" id=item.CategoryId %}</span>
                        <span class="publish-date">发布于:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
                        <span class="views">浏览:{{item.Views}}</span>
                    </div>
                </div>
            </a>
        </article>
        {% else %}
        <p class="no-content">当前分类下没有文章。</p>
        {% endfor %}
    {% endarchiveList %}
</div>

{# 分页导航区域 #}
<div class="pagination-nav">
    {% pagination pages with show="5" %} {# 显示最多5个页码链接 #}
        {% if pages.TotalPages > 1 %} {# 只有当总页数大于1时才显示分页 #}
        <ul>
            {% if pages.FirstPage %}
            <li class="{% if pages.FirstPage.IsCurrent %}active{% endif %}"><a href="{{pages.FirstPage.Link}}">{{pages.FirstPage.Name}}</a></li>
            {% endif %}

            {% if pages.PrevPage %}
            <li><a href="{{pages.PrevPage.Link}}">{{pages.PrevPage.Name}}</a></li>
            {% endif %}

            {% for pageItem in pages.Pages %}
            <li class="{% if pageItem.IsCurrent %}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 %}

            {% if pages.LastPage %}
            <li class="{% if pages.LastPage.IsCurrent %}active{% endif %}"><a href="{{pages.LastPage.Link}}">{{pages.LastPage.Name}}</a></li>
            {% endif %}
        </ul>
        <p>总共 {{pages.TotalItems}} 篇文章,当前第 {{pages.CurrentPage}} / {{pages.TotalPages}} 页。</p>
        {% endif %}
    {% endpagination %}
</div>

在这个例子中:

  • archiveList 标签的 limit="10" 定义了每页显示10篇文章。
  • moduleId="1" 确保我们只获取ID为1(通常是文章模型)的内容。
  • pagination pages with show="5" 指示系统生成页码导航,pages是我们为分页数据定义的变量名,show="5"则表示在中间部分最多显示5个页码链接,超出部分会自动省略。
  • pagination标签内部,我们利用pages.FirstPagepages.PrevPagepages.Pages(这是一个包含中间页码的数组)、pages.NextPagepages.LastPage等属性,灵活地构建出完整的页码导航结构。pageItem.IsCurrent可以帮助我们高亮当前所在的页码。

通过这种组合,我们可以非常方便地创建出功能完善、用户体验良好的文章分页列表。

丰富文章列表:archiveList 标签的常用参数

除了控制显示数量和分页,archiveList标签还支持多种参数来精细化筛选和排序文章,让你的内容展示更加多样和精准:

  • moduleId 当你的AnQiCMS网站拥有文章、产品等多种内容模型时,通过moduleId="1"(文章模型ID)或moduleId="2"(产品模型ID)来指定获取特定模型下的文章列表。
  • categoryId 想要只展示特定分类下的文章,categoryId="10"(分类ID为10)就能派上用场。你也可以用逗号分隔,同时指定多个分类ID,例如categoryId="1,3,5"。如果将categoryId设置为"0",则表示不自动读取当前页面分类ID,这在需要获取全站热门文章时很有用。
  • order 内容的排序方式也能灵活控制。order="id desc"表示按最新发布排序(ID降序),order="views desc"表示按浏览量从高到低排序,而order="sort desc"则根据后台手动设置的排序值进行排序。
  • flag 配合后台文章的推荐属性(如头条[h]、推荐[c]),你可以通过flag="h"来获取具有头条属性的文章列表。
  • q 在搜索结果页中,q参数