在网站运营中,为用户提供高效、精准的内容筛选功能是提升用户体验和内容可发现性的关键。无论是复杂的房产信息、海量的商品SKU,还是专业的行业文档,一个设计良好的筛选界面都能让用户快速定位所需信息。在安企CMS中,archiveFilters 标签正是构建这类复杂筛选界面的强大工具。
理解筛选界面的核心:内容模型与自定义参数
要构建灵活的筛选功能,首先需要理解安企CMS中“内容模型”的概念。安企CMS允许我们根据业务需求自定义内容模型,比如为“房产”创建一个模型,为“产品”创建另一个模型。在这些模型中,我们可以添加各种自定义字段来描述内容的不同属性。
例如,对于一个房产网站,我们可能会在房产模型中定义如下自定义字段:
- 房屋类型(单项选择:住宅、公寓、别墅、商铺)
- 户型(单项选择:一室一厅、两室一厅、三室两厅)
- 面积(数字范围)
- 装修程度(单项选择:毛坯、简装、精装、豪装)
- 区域(下拉选择:北京、上海、广州、深圳)
这些在内容模型中定义的、类型为单项选择、多项选择或下拉选择的字段,正是 archiveFilters 标签能够识别并用于构建筛选条件的“参数”。它们为用户提供了结构化的选择项,方便我们动态生成筛选链接。
archiveFilters:动态构建筛选条件的利器
archiveFilters 标签专门用于生成基于内容模型自定义参数的筛选条件列表。它会在模板中输出一个可供循环遍历的数组,数组的每个元素都代表一个可筛选的参数(比如“房屋类型”、“户型”)。每个参数又包含其所有可选值以及对应的筛选链接。
它的基本用法是这样:
{% archiveFilters filters with moduleId="1" allText="全部" %}
{# 循环遍历筛选参数 #}
{% endarchiveFilters %}
这里,filters 是我们自定义的变量名,用于接收 archiveFilters 标签输出的数据。
moduleId:指定要筛选哪个内容模型下的文档。例如,moduleId="1"可能代表文章模型,moduleId="2"可能代表产品模型。这个ID需要与你在后台创建内容模型时分配的ID相对应。allText:为每个筛选参数提供一个“全部”或“不限”的选项文本。如果设置为false,则不显示这个选项。
filters 变量本身是一个数组,其中包含多个筛选参数对象。在模板中,我们会通过 for 循环来逐一展现这些参数:
{% for item in filters %}
{# item 代表一个筛选参数,例如“房屋类型” #}
<div class="filter-group">
<span class="filter-name">{{ item.Name }}:</span> {# 显示参数名称,如“房屋类型” #}
<ul class="filter-options">
{% for val in item.Items %}
{# val 代表参数的一个可选值,例如“住宅” #}
<li class="{% if val.IsCurrent %}active{% endif %}">
<a href="{{ val.Link }}">{{ val.Label }}</a> {# 显示选项名称和对应的筛选链接 #}
</li>
{% endfor %}
</ul>
</div>
{% endfor %}
在这段代码中:
item.Name会显示我们后台定义的参数名,如“房屋类型”、“户型”。item.Items是一个包含所有可选值的小数组。val.Label会显示每个选项的文本,如“住宅”、“公寓”。val.Link是最关键的部分,它包含了点击该选项后跳转到的筛选URL。安企CMS会自动根据当前页面的URL和用户选择的筛选条件,生成一个带有相应查询参数的新URL。val.IsCurrent是一个布尔值,表示当前选项是否被选中,这对于为选中项添加active类,实现高亮显示非常有用。
筛选结果的展示与联动
archiveFilters 标签生成的筛选链接会自动携带参数(例如 ?房屋类型=住宅&户型=两室一厅)到当前列表页。而安企CMS的 archiveList 标签在以 type="page" 模式调用时,会自动解析这些URL中的查询参数,并根据这些参数来筛选并展示相应的文档。这意味着,你无需手动编写复杂的查询逻辑,只需在 archiveList 中配置好 moduleId,它就能与 archiveFilters 无缝联动。
同时,结合 pagination 标签,筛选后的文档列表也能够正常进行分页显示,为用户提供完整的浏览体验。
下面是一个综合示例,展示了如何在安企CMS模板中构建一个房产筛选界面:
{# 假设当前模板是房产列表页,并已定义好房产内容模型,moduleId="2" #}
<div class="filter-area">
<h3>房产筛选</h3>
{% archiveFilters filters with moduleId="2" allText="不限" %}
{% for item in filters %}
<div class="filter-group">
<span class="filter-label">{{ item.Name }}:</span>
<ul class="filter-options">
{% for val in item.Items %}
<li class="filter-item {% if val.IsCurrent %}active{% endif %}">
<a href="{{ val.Link }}">{{ val.Label }}</a>
</li>
{% endfor %}
</ul>
</div>
{% endfor %}
{% endarchiveFilters %}
</div>
<div class="house-list-area">
<h3>房源列表</h3>
{% archiveList archives with moduleId="2" type="page" limit="10" %}
{% for item in archives %}
<div class="house-card">
<a href="{{ item.Link }}">
<img src="{{ item.Thumb }}" alt="{{ item.Title }}" class="house-thumb">
<h4>{{ item.Title }}</h4>
<p><strong>房屋类型:</strong> {% archiveDetail with name="房屋类型" id=item.Id %}</p>
<p><strong>户型:</strong> {% archiveDetail with name="户型" id=item.Id %}</p>
<p><strong>面积:</strong> {% archiveDetail with name="面积" id=item.Id %}平米</p>
{# 更多房产参数 #}
</a>
</div>
{% empty %}
<p>抱歉,没有找到符合条件的房源。</p>
{% endfor %}
{% endarchiveList %}
{# 分页导航 #}
<div class="pagination-area">
{% pagination pages with show="5" %}
<ul>
<li class="{% if pages.FirstPage.IsCurrent %}active{% endif %}"><a href="{{pages.FirstPage.Link}}">首页</a></li>
{% if pages.PrevPage %}
<li><a href="{{pages.PrevPage.Link}}">上一页</a></li>
{% endif %}
{% for item in pages.Pages %}
<li class="{% if item.IsCurrent %}active{% endif %}"><a href="{{item.Link}}">{{item.Name}}</a></li>
{% endfor %}
{% if pages.NextPage %}
<li><a href="{{pages.NextPage.Link}}">下一页</a></li>
{% endif %}
<li class="{% if pages.LastPage.IsCurrent %}active{% endif %}"><a href="{{pages.LastPage.Link}}">尾页</a></li>
</ul>
{% endpagination %}
</div>
</div>
通过上述示例,我们可以看到 archiveFilters 标签如何配合内容模型、archiveList 和 pagination,共同构建出一个功能完备、高度动态化的筛选界面。它极大地简化了开发流程,将复杂的逻辑交由CMS内部处理,让内容运营者和模板开发者能够专注于内容和用户体验。
常见问题 (FAQ)
问:
archiveFilters标签只能筛选内容模型中的自定义字段吗? 答:是的,archiveFilters标签主要用于筛选内容模型中定义的自定义参数字段。这些字段通常是你在后台创建内容模型时,特意设置为“单项选择”、“多项选择”或“下拉选择”等类型,以便提供固定的选项供用户筛选。系统默认的字段(如标题、描述等)不会通过此标签自动生成筛选条件,但可以通过archiveList标签的q参数进行关键词搜索。问:如何在筛选界面中添加价格区间或面积范围这样的数字筛选? 答:
archiveFilters标签本身主要用于处理预设选项的分类筛选。对于价格区间或面积范围这类数值型筛选,通常需要结合自定义的表单元素(如输入框、滑块)和前端JavaScript来实现。当用户选择或输入范围后,通过JavaScript动态构建URL查询参数(例如?min_price=1000&max_price=5000),然后archiveList标签能够通过