安企CMS模板中如何使用`archiveList`标签调用文档列表?

作为一名长期深耕于安企CMS内容运营领域的专家,我深知一套灵活且高效的模板标签对于网站内容展示的重要性。其中,archiveList 标签无疑是安企CMS模板中调用文档列表的核心利器。它不仅能帮助我们精准地筛选和展示各类文档内容,还能结合多种参数,满足千变万化的内容呈现需求,从而为读者提供优质的浏览体验。

archiveList 标签的用途与基本结构

archiveList 标签在安企CMS中用于获取文档列表,无论是常规文档列表、相关文档列表,还是带有分页功能的文档列表,它都能胜任。其基本使用方法涉及定义一个变量来存储获取到的文档数据,并配合 for 循环遍历这些数据。

一个典型的archiveList标签结构如下:

{% archiveList archives with type="list" limit="10" %}
    {% for item in archives %}
        {# 在这里展示文档内容 #}
        <h3><a href="{{item.Link}}">{{item.Title}}</a></h3>
        <p>{{item.Description}}</p>
        <p>发布时间: {{stampToDate(item.CreatedTime, "2006-01-02")}}</p>
    {% empty %}
        <p>抱歉,没有找到任何文档。</p>
    {% endfor %}
{% endarchiveList %}

在这个例子中,archives 是我们定义的变量名,用于存储archiveList获取到的文档集合。{% for item in archives %} 用于遍历这个集合,item则代表集合中的每一个文档对象。当没有文档数据时,{% empty %} 区域的内容将被展示。

精准控制:archiveList 参数详解

archiveList 标签的强大之处在于其丰富的参数,通过这些参数,我们可以对调用的文档列表进行细致的筛选和排序。

模型 ID (moduleId)

这个参数用于指定要获取哪个内容模型下的文档列表。例如,如果您想获取“文章模型”下的文档,可以设置 moduleId="1";如果想获取“产品模型”下的文档,则可能设置为 moduleId="2"。在安企CMS的后台内容管理中,每个内容模型都有其对应的ID。

分类 ID (categoryId)

categoryId 参数允许您获取指定分类下的文档列表。您可以传入单个分类ID,如 categoryId="5",也可以传入多个分类ID,用逗号分隔,如 categoryId="1,2,3"。如果未指定此参数,archiveList 会尝试读取当前页面的分类ID。如果您希望在非分类页面上调用文档但又不想自动读取当前分类,或者明确不希望按当前分类筛选,可以显式设置 categoryId="0"

排除分类 ID (excludeCategoryId)

categoryId 相反,excludeCategoryId 用于排除特定分类下的文档。这在您需要展示大部分文档但想跳过某些特定分类时非常有用,例如 excludeCategoryId="10" 将排除ID为10的分类下的所有文档。

用户 ID (userId)

如果您需要展示某个特定用户发布的文档,可以使用 userId 参数。例如,userId="1" 将只显示ID为1的用户所发布的文档。

上级文档 ID (parentId)

此参数用于获取指定上级文档的子文档。如果您的内容结构存在层级关系(例如产品详情页下的附件列表),parentId="某个文档ID" 就能派上用场。

推荐属性 (flag)

安企CMS允许为文档设置多种推荐属性,如“头条”、“推荐”、“幻灯”等。flag 参数可以帮助您根据这些属性来筛选文档,例如 flag="c" 将只显示标记为“推荐”的文档。多个属性值可以通过组合字母来设置。

排除推荐属性 (excludeFlag)

此参数用于排除具有特定推荐属性的文档,例如 excludeFlag="s" 将不会显示标记为“滚动”的文档。

是否列出文档的 flag (showFlag)

当您希望在文档列表中直接显示每个文档的推荐属性标记时,需要将 showFlag 设置为 true,默认值为 false

是否显示子分类内容 (child)

默认情况下,当您指定 categoryId 时,archiveList 会同时包含该分类及其所有子分类下的文档(child=true)。如果您只想显示指定分类本身的文档,而不包括其子分类的文档,可以设置 child=false

排序方式 (order)

order 参数决定了文档的显示顺序。常见的排序方式包括:

  • 按最新发布排序:order="id desc"
  • 按浏览量最多排序:order="views desc"
  • 按后台自定义排序:order="sort desc"(此为默认排序方式,可不填)

显示数量 (limit)

limit 参数用于控制返回的文档数量。例如,limit="10" 将只显示10条文档。当您不需要分页功能时,limit 还支持 offset 模式,例如 limit="2,10" 表示从第2条文档开始,获取10条数据。

列表类型 (type)

这是一个非常关键的参数,它决定了archiveList标签的行为模式:

  • type="list" (默认值):以普通列表形式显示文档,受 limit 参数控制,不提供分页。
  • type="page":用于带有分页功能的文档列表。当使用此类型时,通常需要结合 pagination 标签来生成分页导航。
  • type="related":用于获取相关文档。在这种模式下,archiveList会尝试获取与当前文档最相关的其他文档。它还可以结合 like 参数进一步细化相关性判断,例如 like="keywords"(按关键词相关)或 like="relation"(按后台手动设置的相关文档)。

搜索关键词 (q)

type="page" 时,q 参数可以用于指定搜索关键词。如果您在URL中包含 q=关键词 的查询参数,archiveList 会自动读取并用于搜索标题中包含该关键词的文档。您也可以在标签中直接指定 q="您的关键词"

筛选参数 (自定义)

type="page" 模式下,如果您的内容模型配置了可筛选的自定义字段(例如“房屋类型”、“价格区间”),您可以将这些字段作为URL的查询参数传递,archiveList 会根据这些参数进行高级筛选。例如,如果自定义字段为 sex,其值为 ,则可以通过URL查询参数 sex=男 来筛选。

站点 ID (siteId)

当您使用安企CMS的多站点管理功能时,如果需要调用其他站点的数据,可以通过 siteId 参数指定目标站点的ID。

组合文档 ID (combineId) 与 前置组合文档 ID (combineFromId)

这两个是高级参数,用于创建文档的组合对比页面。例如,如果您想比较两款产品A和B,可以将产品A作为主文档,产品B作为组合文档。combineId 将在主文档的URL中添加一个组合ID,例如 /tour/1/c-2.html,其中 1 是主文档ID,2 是组合文档ID。combineFromId 类似,但组合文档在前,例如 /tour/2/c-1.html。在 for 循环中,可以通过 {{combine.文档字段}}{{combineArchive.文档字段}} 来访问组合文档的信息。

for 循环中可用的文档字段

archiveListfor循环中,item变量代表每个文档对象,它包含了一系列可直接访问的字段,方便您在模板中展示。以下是一些常用的字段:

  • {{item.Id}}: 文档的唯一ID。
  • {{item.Title}}: 文档标题。
  • {{item.Link}}: 文档详情页的URL链接。
  • {{item.Description}}: 文档简介或摘要。
  • {{item.Keywords}}: 文档关键词。
  • {{item.CategoryId}}: 文档所属分类的ID。
  • {{item.Views}}: 文档的浏览量。
  • {{item.Logo}}: 文档封面首图的URL(大图)。
  • {{item.Thumb}}: 文档封面缩略图的URL。
  • {{item.Images}}: 文档的多张封面图片数组,需要通过嵌套循环遍历。
  • {{item.CreatedTime}}: 文档的创建时间(Unix时间戳),通常需要结合 stampToDate 过滤器格式化。
  • {{item.UpdatedTime}}: 文档的更新时间(Unix时间戳)。
  • {{item.Flag}}: 文档的推荐属性标记。
  • {{item.CommentCount}}: 文档的评论数量。
  • 文档模型自定义字段: 如果您在后台为文档模型定义了额外的自定义字段,例如 authorprice,它们也可以通过 {{item.自定义字段名}} 的形式直接访问。

实际应用场景与代码示例

让我们通过几个具体的场景来演示archiveList标签的强大功能。

场景一:显示最新发布的10篇文章

在网站首页或侧边栏,我们经常需要展示最新发布的内容。

<div class="latest-articles">
    <h2>最新文章</h2>
    <ul>
    {% archiveList latestArchives with moduleId="1" order="id desc" type="list" limit="10" %}
        {% for article in latestArchives %}
            <li>
                <a href="{{article.Link}}" title="{{article.Title}}">
                    <img src="{{article.Thumb}}" alt="{{article.Title}}" onerror="this.style.display='none';">
                    <span class="title">{{article.Title}}</span>
                    <span class="date">{{stampToDate(article.CreatedTime, "2006-01-02")}}</span>
                </a>
            </li>
        {% empty %}
            <li>暂无最新文章。</li>
        {% endfor %}
    {% endarchiveList %}
    </ul>
</div>

此示例中,moduleId="1" 指定了文章模型,order="id desc" 确保按最新发布排序,type="list"limit="10" 则控制了列表形式和数量。

场景二:带有分页的文章列表页

在一个分类列表页,通常需要展示该分类下的所有文章,并提供分页导航。

<div class="category-articles">
    <h1>{{category.Title}}</h1> {# 假设当前页面是分类页,category变量已存在 #}
    <div class="article-list">
    {% archiveList articles with type="page" limit="15" %} {# 默认会获取当前分类的文档 #}
        {% for article in articles %}
            <div class="article-item">
                <h2><a href="{{article.Link}}">{{article.Title}}</a></h2>
                <p class="meta">
                    <span>发布于: {{stampToDate(article.CreatedTime, "2006-01-02")}}</span>
                    <span>分类: <a href="{% categoryDetail with name='Link' id=article.CategoryId %}">{% categoryDetail with name='Title' id=article.CategoryId %}</a></span>
                    <span>浏览量: {{article.Views}}</span>
                </p>
                <div class="description">{{article.Description}}</div>
                <a href="{{article.Link}}" class="read-more">阅读更多</a>
            </div>
        {% empty %}
            <p>该分类下暂无文章。</p>
        {% endfor %}
    {% endarchiveList %}
    </div>

    <div class="pagination-nav">
        {% pagination pages with show="7" %}
            <ul>
                {% if pages.PrevPage %}
                    <li><a href="{{pages.PrevPage.Link}}">上一页</a></li>
                {% endif %}
                {% for p in pages.Pages %}
                    <li {% if p.IsCurrent %}class="active"{% endif %}><a href="{{p.Link}}">{{p.Name}}</a></li>
                {% endfor %}
                {% if pages.NextPage %}
                    <li><a href="{{pages.NextPage.Link}}">下一页</a></li>
                {% endif %}
            </ul>
        {% endpagination %}
    </div>
</div>

这里我们使用了 type="page"limit="15" 来实现分页,并结合了 pagination 标签生成了分页链接。categoryDetail 标签则用于获取文章所属分类的详细信息。

场景三:在产品详情页显示相关产品

为了提升用户体验和站内流量,我们可以在产品详情页底部展示与当前产品相关的产品。

<div class="related-products">
    <h3>相关产品推荐</h3>
    <ul>
    {% archiveList relatedProducts with type="related" like="keywords" limit="5" %}
        {% for product in relatedProducts %}
            <li>
                <a href="{{product.Link}}" title="{{product.Title}}">
                    <img src="{{product.Thumb}}" alt="{{product.Title}}">
                    <span class="title">{{product.Title}}</span>
                </a>
            </li>
        {% empty %}
            <li>暂无相关产品。</li>
        {% endfor %}
    {% endarchiveList %}
    </ul>
</div>

type="related" 模式下,archiveList 会智能地寻找相关文档。这里 like="keywords" 进一步指示系统根据关键词匹配相关性