安企CMS在内容管理方面做得非常出色,特别是其灵活的内容模型和自定义字段功能,为我们搭建个性化网站提供了极大的便利。网站的内容往往不仅仅是标题和正文,我们可能还需要文章的作者、发布来源、产品规格、活动地点、房屋面积等各种额外信息。这些自定义字段就像是内容的“专属档案袋”,让我们能根据业务需求,为每种内容类型量身定制所需的属性。

那么,当我们在后台为内容模型创建了这些丰富的自定义字段后,如何在网站前端页面中巧妙地调用并展示它们的值呢?这正是我们这篇文章要探讨的核心。

自定义字段:让你的内容管理更灵活

首先,让我们简单回顾一下安企CMS的自定义字段。在后台,进入“内容管理”下的“内容模型”,你会看到系统默认提供了文章和产品模型。当然,你也可以根据自己的业务需求,添加全新的内容模型。每个内容模型都可以配置专属的“自定义字段”,例如,你可以为“产品模型”添加“产品型号”、“颜色”、“库存数量”等字段。

在添加字段时,我们需要定义“参数名”(供后台显示)和“调用字段”(供模板调用),并选择合适的“字段类型”(如单行文本、数字、多行文本、单项选择、多项选择、下拉选择等),还可以设置是否必填和默认值。正是这个“调用字段”,决定了我们在前端模板中如何精确地引用和显示这些自定义信息。

在前端页面中调用自定义字段的几种方法

安企CMS的模板引擎语法类似Django,这让字段的调用变得直观且强大。针对自定义字段值的调用,通常有以下几种灵活的方式:

方法一:直接通过变量访问(适用于当前内容详情页)

当你正在制作文章详情页、产品详情页这类直接展示内容完整信息的模板时,系统会自动将当前内容的全部数据(包括自定义字段)加载到 archive 这个变量中(对于分类详情页则是 category 变量)。这时,你可以直接通过点语法来访问自定义字段的值。

假设你为文章模型创建了一个“作者”字段,其“调用字段”设置为 author,那么在文章详情页的模板中,你可以这样简单地显示它:

<p>文章作者:{{ archive.author }}</p>

如果你的自定义字段是数字类型,比如“阅读时长”的调用字段是 readTime

<p>预计阅读时长:{{ archive.readTime }} 分钟</p>

这种方法非常便捷,特别适合在当前内容的详情页中直接展示。

方法二:使用 archiveDetailcategoryDetail 标签

当你需要更精确地控制字段的获取,或者想获取*非当前页面*的特定内容(如在侧边栏显示某篇指定ID文章的某个自定义字段),archiveDetail(用于文章或产品)或 categoryDetail(用于分类)标签就显得非常有用。

这两个标签都可以通过 name 参数来指定要获取的字段。 比如,你可以在首页某个模块中,展示ID为10的文章的“作者”字段:

<div>特荐文章作者:{% archiveDetail with name="author" id="10" %}</div>

或者在分类列表页中,显示ID为5的分类的某个自定义字段 bannerText

<div>分类横幅文字:{% categoryDetail with name="bannerText" id="5" %}</div>

这种方式提供了更高的灵活性,让你能够跨内容调用特定字段。

方法三:利用 archiveParams 标签循环获取

有时候,你可能希望在页面上动态地展示所有或部分自定义字段,而不需要预先知道每个字段的具体名称,或者这些字段的数量和类型可能会变化。这时,archiveParams 标签就派上用场了。它能获取指定文档(或当前文档)的所有自定义参数,并以数组或Map的形式提供,方便我们进行循环遍历。

这个标签默认会获取当前文档的所有自定义字段,并将它们组织成一个可循环的数组。你可以这样在模板中遍历并显示它们:

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

这里 item.Name 会显示你在后台设置的“参数名”(如“文章作者”),item.Value 则是用户输入的值。如果你在后台创建自定义字段时,将“默认值”设置为空,并且用户在发布内容时也没有填写,那么 item.Value 就会是空字符串。

如果你的业务场景需要更精细的控制,例如只显示特定名称的自定义字段,或者你希望通过字段名而非循环索引来访问,可以将 archiveParams 标签的 sorted 参数设置为 false。这样,params 变量将成为一个Map,你可以直接通过字段名来访问:

<div class="specific-fields">
    {% archiveParams params with sorted=false %}
        <p>文章来源:{{ params.source.Value }}</p>
        <p>发布日期:{{ params.publishDate.Value }}</p>
    {% endarchiveParams %}
</div>

这里 sourcepublishDate 都是你在后台设置的自定义字段的“调用字段”。

处理不同类型的自定义字段值

自定义字段的类型多种多样,其在前端的显示方式也需要我们进行适当的处理:

  • 单行文本和数字类型: 这类字段的值通常是简单的字符串或数字,直接调用即可显示。

    <p>联系电话:{{ archive.phoneNumber }}</p>
    <p>商品价格:¥{{ archive.price }}</p>
    
  • 多行文本(富文本编辑器): 如果自定义字段使用了富文本编辑器,其值可能包含HTML标签。为了在前端正确渲染这些HTML,而不是直接显示源代码,你需要使用 |safe 过滤器。

    <div class="product-features">
        <h3>产品特点</h3>
        {{ archive.features|safe }}
    </div>
    

    如果富文本内容是Markdown格式,且后台启用了Markdown编辑器,你可以额外添加 render=true 参数(配合 |safe)来确保其被正确渲染为HTML。

    <div class="markdown-content">
        {{ archive.markdownIntro|render|safe }}
    </div>
    
  • 单项选择、多项选择和下拉选择:

    • 单项选择和下拉选择通常只存储一个值,可以像普通文本一样直接调用。
      
      <p>产品颜色:{{ archive.color }}</p>
      
    • 多项选择通常会存储多个值,这些值在数据库中可能以逗号或其他分隔符连接的字符串形式存在,也可能直接是数组。如果它是逗号分隔的字符串