安企CMS模板中如何灵活运用 {% for ... in ... %} 标签遍历数据列表?

作为一名资深的网站运营专家,我深知一个高效、灵活的模板系统对于内容管理的重要性。AnQiCMS,作为一个基于Go语言的企业级内容管理系统,在模板设计上汲取了Django模板引擎的精髓,其强大的数据遍历能力,尤其是{% for ... in ... %}标签,是构建动态页面内容的核心工具之一。今天,我们就来深入探讨如何充分利用这一标签,让您的网站内容展示更加生动、高效。

在内容运营的日常工作中,我们经常需要将一系列数据展示在网站上,比如最新的文章列表、热门产品推荐、网站分类导航或是友情链接等。手动逐一添加这些内容显然是不可取的,且难以维护。此时,{% for ... in ... %}循环标签就如同魔法一般,能够帮助我们自动化地遍历并渲染数据集合,大幅提升模板的复用性和维护效率。

理解 {% for ... in ... %} 的基本结构

AnQiCMS的模板标签语法非常直观。当您需要遍历一个数据列表时,基本结构是这样的:

{% for item in collection %}
    {# 在这里处理当前 item 的数据 #}
{% endfor %}

在这里,collection代表您想要遍历的数据列表或数组(例如,通过archiveListcategoryList等标签获取到的数据集合),而item则是在每一次循环中,代表collection中的当前元素。循环体内的代码会针对collection中的每一个item执行一次,直到所有元素都被处理完毕。

例如,如果您想展示最近发布的5篇文章的标题和链接,可以这样来组织您的模板:

{% archiveList articles with type="list" limit="5" %}
    {% for article in articles %}
        <div class="article-item">
            <h3><a href="{{ article.Link }}">{{ article.Title }}</a></h3>
            <p>{{ article.Description }}</p>
        </div>
    {% endfor %}
{% endarchiveList %}

在上面的例子中,articles就是我们通过archiveList标签获取到的文章集合,每一次循环,article变量都会代表当前文章的各项数据,如标题、链接和描述,从而动态生成内容。

优雅处理空列表:{% empty %}

在实际应用中,数据列表并非总是充满内容的。例如,某个分类下暂时没有文章,或者友情链接还未添加。如果简单地使用{% for %}标签,当列表为空时,页面上将不会显示任何内容,这可能会让用户感到困惑。

AnQiCMS为我们提供了{% empty %}块来优雅地处理这种情况。这个块允许您在数据集合为空时显示一段备用内容,而不是空白。

{% for item in collection %}
    {# 列表不为空时显示的内容 #}
{% empty %}
    <p>抱歉,目前没有相关内容可供显示。</p>
{% endfor %}

继续我们上面的文章列表示例,如果articles列表为空,我们可以友善地提示用户:

{% archiveList articles with type="list" limit="5" %}
    {% for article in articles %}
        <div class="article-item">
            <h3><a href="{{ article.Link }}">{{ article.Title }}</a></h3>
            <p>{{ article.Description }}</p>
        </div>
    {% empty %}
        <p>暂时没有最新文章发布,敬请期待!</p>
    {% endfor %}
{% endarchiveList %}

这样,即使数据库中没有数据,您的网站页面也能保持友好的用户体验。

深入控制循环:特殊变量与修饰符的巧妙运用

{% for %}标签的强大之处不仅限于遍历和空列表处理,它还提供了一些内置的特殊变量和修饰符,让循环控制更加精细。

1. 循环计数器:forloop.Counterforloop.Revcounter

有时我们需要知道当前是第几次循环,或者还剩下多少次循环。forloop对象提供了这些信息:

  • forloop.Counter: 当前循环的序号,从1开始计数。
  • forloop.Revcounter: 当前循环的剩余次数,倒序计数。

这在需要为列表中的第一个或最后一个元素添加特殊样式时非常有用,例如:

{% categoryList categories with moduleId="1" parentId="0" %}
    <ul>
    {% for category in categories %}
        <li {% if forloop.Counter == 1 %}class="first-category"{% endif %}>
            <a href="{{ category.Link }}">{{ category.Title }} (第{{ forloop.Counter }}个,剩余{{ forloop.Revcounter }}个)</a>
        </li>
    {% endfor %}
    </ul>
{% endcategoryList %}

2. 数据排序与反转:reversedsorted

AnQiCMS的for标签还提供了便捷的数据处理能力,无需后端额外操作,就能在模板层面对数据进行排序或反转。

  • reversed: 将数据列表按相反的顺序遍历。
  • sorted: 对数据列表进行排序(通常是按ID或默认排序字段)。

您可以将它们与for标签一同使用:

{# 倒序显示文章列表 #}
{% archiveList articles with type="list" limit="5" %}
    {% for article in articles reversed %}
        <div class="article-item-reversed">
            <h3><a href="{{ article.Link }}">{{ article.Title }}</a></h3>
        </div>
    {% endfor %}
{% endarchiveList %}

{# 排序后显示文章列表 #}
{% archiveList articles with type="list" limit="5" %}
    {% for article in articles sorted %}
        <div class="article-item-sorted">
            <h3><a href="{{ article.Link }}">{{ article.Title }}</a></h3>
        </div>
    {% endfor %}
{% endarchiveList %}

3. 交替显示内容:cycle 标签

为了实现更丰富的视觉效果,比如表格行的斑马线效果,或者内容区域的交替布局,cycle标签就显得尤为实用。它可以在一系列预定义的值之间循环输出。

{% for item in list %}
    <div class="{% cycle 'odd-row' 'even-row' %}">
        {# 内容 #}
    </div>
{% endfor %}

这里,cycle会轮流输出odd-roweven-row,为列表项添加交替的CSS类。

实战演练:常见场景下的灵活应用

掌握了基础,我们来看看如何在AnQiCMS中将{% for %}标签应用于更多实际场景:

1. 动态生成网站导航

导航菜单通常有多级结构,navList标签结合{% for %}可以轻松构建:

{% navList navItems %}
    <ul class="main-nav">
    {% for item in navItems %}
        <li class="{% if item.IsCurrent %}active{% endif %}">
            <a href="{{ item.Link }}">{{ item.Title }}</a>
            {% if item.NavList %} {# 判断是否有子导航 #}
                <ul class="sub-nav">
                {% for subItem in item.NavList %} {# 嵌套循环子导航 #}
                    <li class="{% if subItem.IsCurrent %}active{% endif %}">
                        <a href="{{ subItem.Link }}">{{ subItem.Title }}</a>
                    </li>
                {% endfor %}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
    </ul>
{% endnavList %}

这个例子完美地展示了for循环的嵌套使用,能够处理多级导航的复杂结构。

2. 展示网站分类及其下属文档

假设您希望在首页展示几个主要的文章分类,并且每个分类下都列出最新的几篇文章:

{% categoryList categories with moduleId="1" parentId="0" limit="3" %}
    {% for category in categories %}
        <section class="category-block">
            <h2><a href="{{ category.Link }}">{{ category.Title }}</a></h2>
            <ul class="article-list">
                {% archiveList articlesInCategory with type="list" categoryId=category.Id limit="5" %}
                    {% for article in articlesInCategory %}
                        <li><a href="{{ article.Link }}">{{ article.Title }}</a></li>
                    {% empty %}
                        <li>此分类下暂无文章。</li>
                    {% endfor %}
                {% endarchiveList %}
            </ul>
        </section>
    {% endfor %}
{% endcategoryList %}

这里外层循环遍历分类,内层循环则根据当前分类ID获取并遍历其下的文章。

3. 批量展示友情链接

简单的友情链接列表也可以通过{% for %}高效展示