在安企CMS中管理内容时,文档详情页面的 archiveDetail 标签非常强大,它能帮助我们获取到当前文档的丰富信息。其中,ContentTitles 字段是一个特别有用的数据结构,它返回的是一个数组,包含了文档内容中所有标题(如H1、H2、H3等)的层级信息。这为我们提供了极大的灵活性,可以用来构建文章目录、智能导航,甚至进行内容分析。

ContentTitles 字段返回的每个元素都是一个对象,通常包含以下关键信息:Title(标题文本)、Tag(HTML标签,如h1、h2)、Level(标题层级,如1、2)、以及 Prefix(可能用于编号的前缀,如1.1)。

当我们拿到这个标题数组后,如何进一步处理它,让它发挥更大的作用呢?安企CMS的模板引擎提供了丰富的逻辑标签和过滤器,让我们可以像处理普通数组一样,对 ContentTitles 进行各种操作。

1. 基础遍历与条件筛选:构建动态文章目录

最直接的用法就是遍历这个数组,将所有标题展示出来。这通常通过 for 循环标签实现。例如,我们可以轻松地为文章生成一个动态目录,让读者快速跳转到感兴趣的部分。

{% archiveDetail titles with name="ContentTitles" %}
    {% if titles %} {# 检查标题数组是否存在且不为空 #}
        <nav class="article-toc">
            <h3>文章目录</h3>
            <ol>
            {% for item in titles %}
                {# 根据标题层级添加不同的样式或前缀,或者生成页面内跳转链接 #}
                <li class="level-{{ item.Level }}">
                    <a href="#section-{{ item.Title | urlencode }}">{{ item.Prefix }} {{ item.Title }}</a>
                </li>
            {% endfor %}
            </ol>
        </nav>
    {% endif %}
{% endarchiveDetail %}

在这里,item.Level 帮助我们识别标题的层级,item.Title | urlencode 则是一个非常实用的过滤器,它能将标题文本转换成URL安全的字符串,非常适合作为页面内锚点(id)的值,实现点击目录项后平滑跳转。

如果我们只想展示特定层级的标题,比如只展示二级(H2)标题作为主要章节,可以借助 if 条件判断:

{% archiveDetail titles with name="ContentTitles" %}
    {% if titles %}
        <nav class="article-main-sections">
            <h4>主要章节</h4>
            <ul>
            {% for item in titles %}
                {% if item.Level == 2 %} {# 只显示二级标题 #}
                    <li><a href="#section-{{ item.Title | urlencode }}">{{ item.Prefix }} {{ item.Title }}</a></li>
                {% endif %}
            {% endfor %}
            </ul>
        </nav>
    {% endif %}
{% endarchiveDetail %}

2. 数组长度与内容检查:快速了解文章结构概览

除了遍历,我们还可以利用一些数组过滤器来获取数组的整体信息。

  • 获取标题总数length 过滤器可以返回数组中元素的数量。这对于显示文章包含多少个标题,或者在标题数量很少时不显示目录等场景非常有用。

    {% archiveDetail titles with name="ContentTitles" %}
        {% if titles %}
            <p>本文共包含 <strong>{{ titles|length }}</strong> 个标题,为您提供了结构化的阅读体验。</p>
        {% endif %}
    {% endarchiveDetail %}
    
  • 检查特定标题是否存在:虽然没有直接的过滤器可以判断数组中对象的某个属性是否匹配特定值,但我们可以通过结合 for 循环和 if 语句实现,并用一个布尔变量来记录结果。

    ”`twig {% archiveDetail titles with name=“ContentTitles” %}

    {% set has_conclusion = false %}
    {% for item