在AnQiCMS模板中如何使用`if`和`for`标签实现内容的条件显示和循环展示?

在安企CMS的模板世界里,灵活地控制内容的显示方式是创建引人入胜网站的关键。无论是根据特定条件展示不同信息,还是高效地循环展示大量数据,iffor 这两个标签都是我们不可或缺的工具。AnQiCMS的模板引擎借鉴了Django的语法,使得这些操作既直观又强大。

理解 if 标签:实现内容的条件显示

if 标签的核心作用是根据您设定的条件来决定是否显示某部分内容。这就像为您的网站内容设置了一个“门卫”,只有满足特定条件的访客才能进入。

它的基本语法结构非常简洁,通常是这样:

{% if 条件表达式 %}
    <!-- 条件为真时显示的内容 -->
{% endif %}

当您需要处理更复杂的逻辑时,可以引入 elseelif(else if的缩写)来扩展:

{% if 第一个条件 %}
    <!-- 第一个条件为真时显示的内容 -->
{% elif 第二个条件 %}
    <!-- 第二个条件为真时显示的内容 -->
{% else %}
    <!-- 所有条件都不满足时显示的内容 -->
{% endif %}

实际应用场景:

  • 显示/隐藏特定信息: 假设您想在文章详情页,只有当文章有缩略图时才显示图片。您可以这样编写:

    {% archiveDetail article with name="Thumb" %}
    {% if article %}
        <img src="{{ article }}" alt="文章缩略图" />
    {% else %}
        <p>此文章暂无缩略图。</p>
    {% endif %}
    

    这里,{% archiveDetail article with name="Thumb" %} 标签将当前文章的缩略图路径赋值给 article 变量。如果 article 变量存在(即文章有缩略图),if 条件为真,图片就会显示。

  • 根据用户状态展示内容: 如果您有会员系统,可以根据用户是否登录或其VIP等级显示不同内容。

    {% if user.IsLoggedIn %}
        <p>欢迎回来,{{ user.UserName }}!</p>
        {% if user.IsVIP %}
            <p>您是尊贵的VIP会员,可享受专属内容。</p>
        {% else %}
            <p>升级VIP获取更多权益。</p>
        {% endif %}
    {% else %}
        <p>请登录或注册以获取完整体验。</p>
    {% endif %}
    

    这里假定 user 对象包含了用户的登录状态和VIP信息。

  • 分类或页面属性判断: 您可能需要根据当前分类是否有子分类来决定是显示子分类列表还是直接显示文章列表。

    {% categoryDetail currentCategory with name="HasChildren" %}
    {% if currentCategory %}
        <p>本分类包含子分类,请选择:</p>
        {% categoryList subCategories with parentId=currentCategory.Id %}
            {% for subCat in subCategories %}
                <a href="{{ subCat.Link }}">{{ subCat.Title }}</a>
            {% endfor %}
        {% endcategoryList %}
    {% else %}
        <p>本分类暂无子分类,显示文章列表:</p>
        {% archiveList archives with categoryId=currentCategory.Id %}
            <!-- 文章列表内容 -->
        {% endarchiveList %}
    {% endif %}
    

    通过 HasChildren 属性,我们可以智能地引导用户浏览内容。

掌握 for 标签:实现内容的循环展示

for 标签是用来遍历集合(如列表、数组)中的每一个元素,并对每个元素执行相同的模板代码。这对于展示文章列表、产品列表、导航菜单等重复性内容非常高效。

其基本语法如下:

{% for 变量名 in 集合 %}
    <!-- 针对集合中每个元素显示的内容 -->
{% endfor %}

实际应用场景:

  • 展示文章列表: 网站最常见的功能之一就是文章列表展示。

    {% archiveList articles with type="list" limit="10" %}
        {% for article in articles %}
            <div class="article-item">
                <h3><a href="{{ article.Link }}">{{ article.Title }}</a></h3>
                <p>{{ article.Description }}</p>
                <span>发布日期:{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
            </div>
        {% endfor %}
    {% endarchiveList %}
    

    这里,archiveList 标签获取了最新的10篇文章,然后 for 循环遍历这些文章,为每篇文章生成一个展示区块。

  • 构建动态导航菜单: 如果您的网站导航是多层级的,for 循环配合嵌套的 if 标签可以优雅地实现。

    {% navList mainNavs %}
        <ul>
            {% for nav in mainNavs %}
                <li>
                    <a href="{{ nav.Link }}">{{ nav.Title }}</a>
                    {% if nav.NavList %} {# 如果有子导航 #}
                        <ul>
                            {% for subNav in nav.NavList %}
                                <li><a href="{{ subNav.Link }}">{{ subNav.Title }}</a></li>
                            {% endfor %}
                        </ul>
                    {% endif %}
                </li>
            {% endfor %}
        </ul>
    {% endnavList %}
    

    这展示了如何通过一次循环构建包含子菜单的导航。

  • 处理空列表: for 标签还提供了一个 {% empty %} 选项,当循环的集合为空时,会显示 empty 块内的内容,而不是什么都不显示。

    {% archiveList articles with type="list" categoryId="999" limit="5" %} {# 假设这个分类下没有文章 #}
        {% for article in articles %}
            <!-- 文章内容 -->
        {% empty %}
            <p>这个分类下暂时没有文章。</p>
        {% endfor %}
    {% endarchiveList %}
    

    这大大提升了用户体验,避免了页面空白。

  • 利用 forloop 变量增强控制:for 循环内部,forloop 对象提供了许多有用的信息:

    • forloop.Counter: 当前循环的迭代次数,从 1 开始。
    • forloop.Revcounter: 当前循环中剩余的迭代次数,从集合总数递减到 1。
    • forloop.First: 如果当前是第一次迭代,则为真。
    • forloop.Last: 如果当前是最后一次迭代,则为真。
    {% archiveList articles with type="list" limit="3" %}
        {% for article in articles %}
            <div class="article-item {% if forloop.First %}first-item{% elif forloop.Last %}last-item{% endif %}">
                <p>这是第 {{ forloop.Counter }} 篇文章,还剩 {{ forloop.Revcounter }} 篇。</p>
                <h3>{{ article.Title }}</h3>
            </div>
        {% endfor %}
    {% endarchiveList %}
    

    这可以用来为列表的第一个或最后一个元素添加特定的样式。

iffor 的强强联合:高级内容展示

iffor 标签经常协同工作,以实现更精细的内容控制和展示。例如,在一个文章列表中,您可能需要为带有图片或特定标志的文章添加特殊标识。

{% archiveList articles with type="list" limit="5" showFlag=true %} {# 注意这里设置了 showFlag=true #}
    {% for article in articles %}
        <div class="news-card">
            {% if article.Thumb %} {# 检查是否有缩略图 #}
                <img src="{{ article.Thumb }}" alt="{{ article.Title }}" class="news-thumb">
            {% endif %}

            <div class="news-content">
                {% if article.Flag and "h" in article.Flag %} {# 检查是否有“头条”标志 #}
                    <span class="badge hot-news">头条</span>
                {% endif %}
                <h3><a href="{{ article.Link }}">{{ article.Title }}</a></h3>
                <p>{{ article.Description|truncatechars:80 }}</p> {# 使用过滤器截断描述 #}
                <span class="date">{{ stampToDate(article.CreatedTime, "2006-01-02") }}</span>
            </div>
        </div>
    {% empty %}
        <p>暂时没有新闻内容。</p>
    {% endfor %}
{% endarchiveList %}

这个例子展示了在循环遍历文章时,如何根据文章是否有缩略图、是否带有“头条”标志来动态调整其显示样式和内容。过滤器 truncatechars:80 也被用来限制描述的长度,保持页面整洁。

通过这些灵活的组合,您可以创建出高度动态和用户友好的网站界面,充分发挥AnQiCMS模板引擎的潜力。熟练运用 iffor 标签,将使您的内容运营策略在AnQiCMS平台上如虎添翼。


常见问题 (FAQ)

Q1: 在 for 循环中,forloop.Counterforloop.Revcounter 有什么不同?

A1: forloop.Counter 表示当前循环的迭代次数,它从 1 开始递增。例如,在有5个元素的列表中,第一次迭代时 forloop.Counter 是1,第二次是2,以此类推。而 forloop.Revcounter 则表示当前循环中剩余的迭代次数(包括当前这一次),它从集合的总数开始递减到 1。在同一个5个元素的列表中,第一次迭代时 forloop.Revcounter 是5,第二次是4,直到最后一次迭代是1。您可以利用这些来给列表项添加不同的样式或逻辑。

Q2: 如何在 for 循环中判断当前元素是否是最后一个?

A2: AnQiCMS的模板引擎提供了 forloop.Last 这个布尔值变量。当当前迭代是集合中的最后一个元素时,forloop.Last 的值为 true。您可以在条件语句中直接使用它,例如:{% if forloop.Last %}这是最后一个元素{% endif %}

Q3: 我想在 if 条件中检查一个变量(比如字符串或列表)是否为空,应该怎么写?

A3: 对于大多数情况,直接将变量放入 if 条件中即可。如果变量是空字符串、空列表(或数组)、零值数字或者 nil(空),if 条件通常会被评估为假(false)。例如,{% if my_variable %} 会在 my_variable 不为空时为真。如果您想明确判断变量为空,可以使用 {% if not my_variable %}。对于字符串,也可以显式地与空字符串比较:{% if my_string == "" %}