在网站内容运营中,我们经常会遇到需要对内容进行批量展示的情况,例如文章列表、产品介绍摘要等。为了页面的美观和信息呈现的清晰度,我们往往需要对这些内容的标题或描述进行截取,使其在不同区域或不同条件下展现出不同的长度。安企CMS(AnQiCMS)提供了强大的模板标签和过滤器,让这一需求变得简单而灵活。

今天,我们将深入探讨如何在内容循环中,利用slice过滤器或其他相关工具,动态地截取字符串,从而实现更智能、更具表现力的内容展示。

理解 slice 过滤器:灵活截取内容的基石

在安企CMS的模板系统中,slice是一个非常实用的过滤器,它的主要功能是截取字符串或数组中指定位置的元素。它的语法简洁明了:

{{ obj|slice:"from:to" }}

这里的obj代表你想要截取的目标字符串或数组。fromto则指定了截取的起始位置和结束位置。

  • from:表示从哪个位置开始截取(包含该位置)。如果省略from,则从头开始截取。
  • to:表示截取到哪个位置(不包含该位置)。如果省略to,则截取到末尾。

例如,如果你想从一个字符串"安企CMS内容管理系统"中截取前五个字符,可以这样写:

{{ "安企CMS内容管理系统"|slice:"0:5" }}
{# 显示结果: 安企CMS内容 #}

如果你想从第四个字符开始截取到末尾:

{{ "安企CMS内容管理系统"|slice:"3:" }}
{# 显示结果: CMS内容管理系统 #}

值得注意的是,slice过滤器能够正确处理UTF-8编码的字符,这意味着在处理中文字符时,你无需担心出现乱码或半个字的情况。

在循环中实现动态截取:让内容展示更智能

slice过滤器的真正威力在于它能与循环结构(如for循环)和条件判断(如if标签)结合使用,从而实现内容的动态截取。这使得你可以根据内容的特性、在列表中的位置,或者其他业务逻辑,灵活地控制内容的显示长度。

1. 根据循环位置动态截取:

假设你正在展示一个文章列表,希望第一篇文章的标题显示更长一些,以吸引用户注意,而后续文章的标题则显示较短的摘要。你可以在for循环中利用forloop.Counter(表示当前循环的索引,从1开始)来判断文章的位置,并应用不同的截取长度。

{% archiveList archives with type="list" limit="10" %}
    {% for item in archives %}
        <li>
            <a href="{{item.Link}}">
                {% if forloop.Counter == 1 %}
                    {# 第一篇文章,标题截取较长 #}
                    <h3>{{ item.Title|slice:"0:30" }}...</h3>
                    <p>{{ item.Description|slice:"0:80" }}...</p>
                {% else %}
                    {# 其他文章,标题和描述截取较短 #}
                    <h4>{{ item.Title|slice:"0:15" }}...</h4>
                    <p>{{ item.Description|slice:"0:40" }}...</p>
                {% endif %}
            </a>
        </li>
    {% empty %}
        <li>暂无文章内容。</li>
    {% endfor %}
{% endarchiveList %}

在这个例子中,我们根据文章在列表中的顺序,动态地对标题和描述进行了不同长度的截取。

2. 根据内容自身长度设定截取阈值:

有时候,我们不希望所有的内容都被强制截取,而是当内容长度超过某个阈值时才进行截取。这可以通过结合item.Title|length等方式来判断。

{% archiveList archives with type="list" limit="10" %}
    {% for item in archives %}
        <li>
            <a href="{{item.Link}}">
                {% if item.Title|length > 25 %}
                    {# 标题超过25个字符才截取 #}
                    <h3>{{ item.Title|slice:"0:25" }}...</h3>
                {% else %}
                    {# 标题未超过,显示完整 #}
                    <h3>{{ item.Title }}</h3>
                {% endif %}

                {% if item.Description|length > 60 %}
                    {# 描述超过60个字符才截取 #}
                    <p>{{ item.Description|slice:"0:60" }}...</p>
                {% else %}
                    {# 描述未超过,显示完整 #}
                    <p>{{ item.Description }}</p>
                {% endif %}
            </a>
        </li>
    {% empty %}
        <li>暂无文章内容。</li>
    {% endfor %}
{% endarchiveList %}

这里我们利用了length过滤器来获取字符串的实际字符长度,再结合if条件决定是否进行截取。

slicetruncatecharstruncatewords:何时选择,如何组合?

在内容截取方面,安企CMS除了slice之外,还提供了truncatecharstruncatewords两个非常有用的过滤器。理解它们的区别,能帮助你做出更合适的选择。

  • slice:适用于你需要精确控制截取范围,获取字符串或数组特定部分的场景。它不对截取后的内容添加省略号(...),也不会智能处理HTML标签。如果你的目标是获取一个原始子字符串或子数组,slice是首选。
  • truncatechars:N:这个过滤器会根据字符数N来截取字符串,并在截取后的末尾自动添加省略号(...)。N包含了省略号的长度。它更适合用于显示文章摘要、标题预览等场景,提供友好的“未完待续”提示。
  • truncatewords:N