在 AnQiCMS 中,展示单个文档的详细内容是网站构建的核心需求之一。无论是文章详情页、产品详情页,还是其他自定义类型的内容展示,我们都需要一种灵活高效的方式来获取并呈现文档的标题、正文以及根据业务需求定义的自定义字段。archiveDetail 标签正是为此而生,它能帮助您轻松实现这一目标。

深入了解 archiveDetail 标签:获取特定文档的核心信息

archiveDetail 标签主要用于获取单个文档的详细数据。当您需要在一个页面中完整呈现某篇文档的所有信息时,它将是您的得力助手。这个标签的强大之处在于,它不仅能够获取文档的默认字段(如标题、内容),还能轻松调取您在后台“内容模型”中为该文档类型自定义的各种字段。

它的基本使用语法是: {% archiveDetail 变量名称 with name="字段名称" id="文档ID" %}

其中,变量名称 是可选的,如果设置了,您可以将获取到的数据赋值给这个变量,之后通过 {{变量名称}} 来引用;如果不设置,标签会尝试直接输出指定字段的值。

  • 指定文档: 通常情况下,archiveDetail 在文档详情页会自动识别当前页面的文档。但如果您需要获取特定ID的文档信息,可以加上 id="文档ID" 参数,例如 id="123"。此外,也可以通过 token="文档URL别名" 参数来指定文档。
  • 多站点支持: 如果您的 AnQiCMS 部署了多个站点,并且需要跨站点获取文档数据,可以使用 siteId="站点ID" 参数。

获取文档核心信息:标题与内容

要显示文档的标题和内容,您只需要在 name 参数中指定对应的字段名即可。

  1. 获取文档标题 (Title): 文档标题是内容的核心标识。使用 name="Title" 即可获取。

    {# 获取当前页面文档的标题 #}
    <h1>{% archiveDetail with name="Title" %}</h1>
    
    
    {# 获取ID为1的文档标题,并赋值给archiveTitle变量 #}
    {% archiveDetail archiveTitle with name="Title" id="1" %}
    <p>指定文档标题:{{ archiveTitle }}</p>
    
  2. 获取文档内容 (Content): 文档内容通常包含丰富的 HTML 结构,包括文本、图片、链接等。获取时需要注意一个重要的过滤器:|safe

    {# 获取当前页面文档的内容,并使用|safe过滤器防止HTML转义 #}
    <div class="article-content">
        {% archiveDetail articleContent with name="Content" %}
        {{ articleContent|safe }}
    </div>
    
    
    {# 如果您的内容包含Markdown语法,可以使用render=true进行转换 #}
    <div class="article-content">
        {% archiveDetail articleContent with name="Content" render=true %}
        {{ articleContent|safe }}
    </div>
    
    
    {# 如果您使用了图片懒加载插件,可以指定lazy="data-src"来适配 #}
    <div class="article-content">
        {% archiveDetail articleContent with name="Content" lazy="data-src" %}
        {{ articleContent|safe }}
    </div>
    

    特别提醒: Content 字段通常存储的是带有 HTML 标签的富文本内容。为了让浏览器正确解析并显示这些 HTML 结构,您必须在输出时使用 |safe 过滤器(例如 {{ articleContent|safe }})。否则,HTML 标签将作为纯文本显示在页面上,影响阅读体验。

深入自定义字段:灵活展示个性化内容

AnQiCMS 强大的“内容模型”功能允许您为不同类型的文档添加各种自定义字段,以满足特定的业务需求,例如产品的价格、文章的作者、视频的时长等。archiveDetail 标签也完全支持获取这些自定义字段。

  1. 获取特定自定义字段: 如果您知道自定义字段的“调用字段”名称(在后台内容模型中定义),可以直接通过 name="自定义字段名" 来获取其值。

    假设您在内容模型中定义了一个名为 author 的自定义字段:

    {# 获取当前文档的作者信息 #}
    <p>作者:{% archiveDetail with name="author" %}</p>
    
    
    {# 获取ID为10的文档的产品价格字段 #}
    <p>产品价格:{% archiveDetail with name="price" id="10" %}</p>
    
  2. 循环展示所有自定义字段 (archiveParams): 有时候,您可能希望将文档的所有自定义字段都遍历展示出来,尤其是在产品参数列表等场景。此时,可以使用 archiveParams 标签来获取文档的所有自定义参数,然后通过 for 循环进行展示。

    <div class="custom-params">
        <h3>更多参数:</h3>
        {% archiveParams params %}
        {% for item in params %}
        <p>
            <span>{{ item.Name }}:</span>
            <span>{{ item.Value }}</span>
        </p>
        {% endfor %}
        {% endarchiveParams %}
    </div>
    

    archiveParams 标签会返回一个包含所有自定义字段的数组(或映射,取决于 sorted 参数)。item.Name 是自定义字段的显示名称,item.Value 则是其对应的值。

综合示例:构建一个完整的文档详情页

将上述元素整合起来,一个典型的文档详情页模板片段可能如下所示:

”`twig <!DOCTYPE html>

<meta charset="UTF-8">
<title>{% archiveDetail with name="Title" siteName=true %}</title>
<meta name="description" content="{% archiveDetail with name="Description" %}">
<meta name="keywords" content="{% archiveDetail with name="Keywords" %}">
<link rel="stylesheet" href="{% system with name="TemplateUrl" %}/css/style.css">

<header>
    <!-- 导航、Logo等页面头部元素 -->
</header>

<main class="container">
    <article class="document-detail">
        <h1 class="document-title">{% archiveDetail with name="Title" %}</h1>

        <div class="document-meta">
            <span>分类:<a href="{% categoryDetail with name='Link' %}">{% categoryDetail with name='Title' %}</a></span>
            <span>发布日期:{% archiveDetail with name="CreatedTime" format="2006-01-02" %}</span>
            <span>浏览量:{% archiveDetail with name="Views" %}</span>
            {% archiveDetail author with name="author" %}{# 假设有一个自定义字段叫 author #}
            {% if author %}<span class="document-author">作者:{{ author }}</span>{% endif %}
        </div>

        <div class="document-description">
            <p>{% archiveDetail with name="Description" %}</p>
        </div>

        <div class="document-content">
            {% archiveDetail documentContent with name