AnQiCMS如何获取并展示当前文章的详细内容?

在安企CMS中,要获取并展示当前文章的详细内容,主要围绕模板文件的组织和内置的模板标签展开。理解这些核心机制,就能灵活地控制文章在前端页面的呈现方式。

核心概念:文章详情页面的构成

在安企CMS中,每篇文章的详细内容通常通过一个特定的模板文件来展示。这个模板文件会根据文章所属的内容模型(例如“文章模型”或“产品模型”)以及在后台的设置,自动或手动地被系统调用。默认情况下,安企CMS会查找 template/{你的模板目录}/{模型table}/detail.html 这样的路径来渲染文章详情页。例如,如果你的文章属于“文章模型”(默认的 table 名称可能是 archive),那么系统会尝试加载 template/{你的模板目录}/archive/detail.html 文件。

在这个详情页模板中,我们需要使用安企CMS提供的强大模板标签来“抓取”文章的各项数据,并按照设计进行布局显示。其中,archiveDetail 标签是获取文章详细信息的核心。

深入理解 archiveDetail 标签

archiveDetail 标签专门用于从数据库中提取单篇文章的详细数据。它的基本用法是 {% archiveDetail 变量名称 with name="字段名称" %}

  1. 获取当前文章数据 当你在文章详情页(例如 archive/detail.html)中使用 archiveDetail 标签时,通常不需要指定文章的ID。系统会智能地识别当前正在访问的文章,并自动获取其数据。例如,要获取当前文章的标题,你只需这样写: {% archiveDetail with name="Title" %}

  2. 通过 name 参数指定要获取的字段 archiveDetail 标签通过 name 参数来指定你希望获取文章的哪个具体字段。这些字段包括文章的基础信息、SEO信息、内容本身,以及通过内容模型自定义的字段。

    以下是一些常用的字段及其应用:

    • 文章标题 (Title){% archiveDetail with name="Title" %} 这会直接输出文章的标题。

    • 文章内容 (Content){% archiveDetail with name="Content" %} 这是文章页面的主体部分。需要注意的是,如果文章内容包含HTML标签(如图片、链接、格式化文本等),为了确保这些HTML代码能被浏览器正确解析而不是作为纯文本显示,通常需要配合 |safe 过滤器使用。如果文章是使用Markdown编写的,并且你在后台启用了Markdown编辑器,安企CMS会自动将其转换为HTML;如果需要手动控制,可以在标签中添加 render=truerender=false 参数。 示例:{% archiveDetail articleContent with name="Content" %}{{articleContent|safe}}{% endarchiveDetail %}

    • 发布时间 (CreatedTime) 和更新时间 (UpdatedTime): 这些字段返回的是时间戳,为了在页面上以可读的日期格式显示,需要使用 stampToDate 格式化时间戳标签。 示例:{{ stampToDate(archive.CreatedTime, "2006-01-02 15:04") }} (其中 archive 是通过 archiveDetail 标签定义的变量名,2006-01-02 15:04 是Go语言的时间格式化标准。)

    • 文章链接 (Link)、关键词 (Keywords)、描述 (Description)、浏览量 (Views): 这些字段的获取方式类似 Title。 示例: {% archiveDetail with name="Link" %} {% archiveDetail with name="Keywords" %} {% archiveDetail with name="Description" %} {% archiveDetail with name="Views" %}

    • 封面图片 (LogoThumbImages)Logo 通常指文章的单张主图或大图,Thumb 是其缩略图。Images 则可能是一个图片组(多张图片)。 示例: <img src="{% archiveDetail with name="Logo" %}" alt="{% archiveDetail with name="Title" %}" /> 如果有多张图片,需要将其定义为变量并进行循环: {% archiveDetail archiveImages with name="Images" %} {% for img in archiveImages %} <img src="{{img}}" alt="文章图片" /> {% endfor %} {% endarchiveDetail %}

    • 所属分类 (Category): 这个字段可以获取文章所属分类的详细信息。如果需要显示分类名称或链接,可以将其定义为变量,然后访问其属性,或者直接使用 categoryDetail 标签获取。 示例: {% archiveDetail currentCategory with name="Category" %} <a href="{{ currentCategory.Link }}">{{ currentCategory.Title }}</a> {% endarchiveDetail %}

    • Tag标签 (tagList): 文章的Tag标签通常不是 archiveDetail 的直接属性,而是通过 tagList 标签来获取。你可以在 archiveDetail 的上下文中调用 tagList,并指定 itemId 为当前文章的ID。 示例: {% tagList tags with itemId=archive.Id %} {% for tag in tags %} <a href="{{ tag.Link }}">{{ tag.Title }}</a> {% endfor %} {% endtagList %}

    • 自定义字段 (archiveParams 或直接按名称获取): 安企CMS支持为内容模型定义额外的自定义字段。这些字段可以通过两种方式在模板中获取:

      • 直接按字段名获取:如果自定义字段的调用字段名是 author,则可以直接 {% archiveDetail with name="author" %}
      • 循环所有自定义字段:使用 archiveParams 标签来遍历所有自定义字段,这对于不确定字段名称或需要统一展示时很有用。 {% archiveParams params %} {% for item in params %} <span>{{ item.Name }}:{{ item.Value }}</span> {% endfor %} {% endarchiveParams %}

逐步构建文章详情页面

了解了核心标签后,我们可以按照以下步骤来构建一个功能完善的文章详情页:

  1. 确定模板文件位置 首先,你需要找到或创建你的文章详情页模板文件。例如,如果是文章模型,通常会在 template/你的模板名称/archive/detail.html

  2. 获取并展示基本文章信息detail.html 文件中,你可以先放置文章标题和主要内容。

    <h1>{% archiveDetail with name="Title" %}</h1>
    <div class="article-content">
        {% archiveDetail articleContent with name="Content" %}{{ articleContent|safe }}{% endarchiveDetail %}
    </div>
    
  3. 展示辅助信息 接着,添加发布日期、浏览量、所属分类和Tag标签等辅助信息。

    <div class="article-meta">
        <span>发布日期:{{ stampToDate(archive.CreatedTime, "2006-01-02") }}</span>
        <span>浏览量:{% archiveDetail with name="Views" %}</span>
        <span>所属分类:
            {% archiveDetail currentCategory with name="Category" %}<a href="{{ currentCategory.Link }}">{{ currentCategory.Title }}</a>{% endarchiveDetail %}
        </span>
        <span>标签:
            {% tagList tags with itemId=archive.Id %}{% for tag in tags %}<a href="{{ tag.Link }}">{{ tag.Title }}</a>{% endfor %}{% endtagList %}
        </span>
    </div>
    

    (注意:archive.CreatedTime 这里的 archive 是一个假设的变量名,如果你没有通过 with 参数将 archiveDetail 的结果赋值给 archive