在AnQiCMS中,我们经常需要将某些文本、代码片段或动态内容重复显示多次,无论是为了版式设计、占位符填充,还是为了列表展示。实现这一功能,AnQiCMS提供了灵活的模板标签和过滤器,让内容运营变得高效且富有个性。

理解文本重复显示的需求

文本的重复显示可以分为两种主要情况:一种是简单地将一段固定的文本或变量重复输出N次;另一种是根据数据集合(如文章列表、产品分类)遍历并显示其中的每一个条目,形成动态的重复内容。AnQiCMS的模板系统能够很好地满足这两种需求。

实现固定文本的批量重复显示:repeat 过滤器

如果您需要将一段静态文本或某个变量的值简单地重复输出指定次数,AnQiCMS的repeat过滤器是理想的选择。这个过滤器可以直接应用于任何字符串或可转换为字符串的变量,并根据您设定的次数将其拼接重复。

它的使用方法非常直观: {{ 需要重复的文本或变量 | repeat:次数 }}

例如,我们想在页面上重复显示“安企CMS”这个词5次,可以直接在模板中这样编写:

{{"安企CMS"|repeat:5}}

这段代码的输出结果会是:安企CMS安企CMS安企CMS安企CMS安企CMS。

实际应用场景:

  • 视觉分隔线或装饰图案: 比如重复显示---***#来创建简单的视觉分隔效果。
  • 占位符填充: 在开发初期,需要快速填充一些文字来预览版式,可以使用"Placeholder Text "|repeat:10来生成一段重复文本。
  • 简短的动态数据重复: 如果某个变量的值本身就需要重复展示,例如一个商品的某个特点需要强调数次。

实现动态内容的批量重复显示:for 循环标签

在网站运营中,更常见且更强大的“批量重复显示”是针对动态数据集合的。例如,显示最新的10篇文章、展示所有产品分类、列出相关的Tag标签等。AnQiCMS采用了Django模板引擎类似的语法,其核心就是for循环标签,配合各种数据获取标签来遍历并显示内容。

for循环的基本结构如下:

{% for item in 集合 %}
    <!-- 在这里编写重复显示的内容,可以使用 item 来访问集合中的每个元素 -->
{% empty %}
    <!-- 如果集合为空,将显示这里的内容 -->
{% endfor %}

结合内容标签进行动态重复显示:

  1. 文章或产品列表的重复显示:archiveList 标签 如果您想重复显示一系列文章或产品,可以使用archiveList标签来获取数据集合,然后通过for循环遍历。

    {% archiveList archives with type="list" categoryId="1" limit="5" %}
        {% for item in archives %}
        <div>
            <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
            <p>{{item.Description|truncatechars:100}}</p>
            <span>发布时间:{{stampToDate(item.CreatedTime, "2006-01-02")}}</span>
        </div>
        {% empty %}
        <p>当前分类下没有文章。</p>
        {% endfor %}
    {% endarchiveList %}
    

    这段代码将获取分类ID为1的最新5篇文章,并重复显示它们的标题、描述和发布时间。

  2. 分类列表的重复显示:categoryList 标签 如果要展示网站的分类结构,比如在导航栏或侧边栏重复显示所有顶级分类或子分类,categoryList标签会非常有用。

    {% categoryList categories with moduleId="1" parentId="0" %}
        <ul>
            {% for item in categories %}
            <li><a href="{{item.Link}}">{{item.Title}}</a></li>
            {% endfor %}
        </ul>
    {% endcategoryList %}
    

    这将列出文章模型(moduleId=“1”)下的所有顶级分类。

  3. 循环计数与条件判断:for循环中,您还可以使用forloop.Counter来获取当前循环的次数(从1开始),或者使用forloop.Revcounter获取剩余项的数量。结合if标签,可以实现更复杂的条件显示。

    {% archiveList archives with type="list" limit="3" %}
        {% for item in archives %}
        <div {% if forloop.Counter == 1 %}class="first-item"{% endif %}>
            第{{ forloop.Counter }}篇文章:{{item.Title}}
        </div>
        {% endfor %}
    {% endarchiveList %}
    

    这里为第一篇文章的div添加了class="first-item"

结合其他功能提升重复显示效果

  • 占位符文本:lorem 标签 在没有实际内容但需要填充大量文本进行排版测试时,lorem标签能快速生成随机的拉丁文占位符。可以与repeatfor循环结合使用。
    
    <p>{% lorem 3 p %}</p> // 生成3段随机段落
    
  • 文本格式化:过滤器组合 在重复显示文本时,经常需要对内容进行格式化。例如,使用truncatechars过滤器截断过长的描述,使用safe过滤器来确保HTML内容正确渲染,避免转义。
    
    <p>{{item.Description|truncatechars:100|safe}}</p>
    
  • 内容模型自定义字段的重复显示:archiveParams 标签 如果您的内容模型自定义了多项可重复的字段(例如产品有多个参数或多张细节图),可以通过archiveParams标签获取这些字段,然后在for循环中遍历显示。
    
    {% archiveParams params with id=item.Id %}
        {% for param in params %}
        <p>{{param.Name}}: {{param.Value}}</p>
        {% endfor %}
    {% endarchiveParams %}
    

在哪里实现这些功能?

所有这些模板标签和过滤器的使用,都将集成在AnQiCMS的模板文件(通常是.html文件,存放在/template目录下)中。您可以通过AnQiCMS后台的“模板设计”功能在线编辑模板代码,或者通过FTP/SFTP直接上传和修改文件。理解模板文件的目录结构(如design-director.md中所述)和基本约定(如design-convention.md中所述)将帮助您更有效地组织和编写模板代码。

通过灵活运用repeat过滤器和强大的for循环标签,您可以轻松实现在AnQiCMS中文本内容的批量重复显示,无论是简单的静态重复,还是复杂的数据驱动动态列表,都能游刃有余。


常见问题 (FAQ)

1. repeat 过滤器是否可以重复显示动态数据,比如某个文章标题? 是的,repeat 过滤器可以重复显示动态数据。只要将需要重复的变量作为过滤器的输入,例如 {{ item.Title | repeat:3 }},它就会将该文章标题重复显示3次。但请注意,它只会重复变量的当前值,而不是遍历一个列表。如果需要遍历列表并显示每个元素的标题,那仍然需要使用 for 循环。

2. 我想在一个循环中为不同的条目应用不同的样式,AnQiCMS能做到吗? 完全可以。在 for 循环中,AnQiCMS提供了特殊的 forloop 变量,其中包含 forloop.Counter(当前循环次数,从1开始)、forloop.Revcounter(剩余项数量)、forloop.First(是否是第一次循环)、forloop.Last(是否是最后一次循环)等属性。您可以结合 if 逻辑判断标签来为特定条件的条目应用不同的CSS类或输出不同的HTML结构,例如 {% if forloop.First %} <div class="highlight-item"> {% endif %}

3. “全站内容替换”功能和这里讨论的“批量重复显示”有什么区别? 这两个功能有着本质的区别。“全站内容替换”是AnQiCMS后台的一项高级运营工具,主要用于修改和更新网站上已发布内容的关键词、链接或其他特定文本,它会直接改变数据库中的内容,从而影响所有引用这些内容的页面。而“批量重复显示”则是模板层面的展示逻辑,它不修改网站的原始数据,仅仅是控制如何在前端页面上呈现(重复展示)已有的内容或特定的文本字符串。简单来说,一个是幕后“修改数据”,一个是前端“展示数据”。