在网站运营中,分类页不仅是内容的聚合,更是用户了解网站结构、深入探索特定主题的重要入口。一个设计良好、信息丰富的分类页,能显著提升用户体验和搜索引擎优化(SEO)效果。AnQiCMS 提供了灵活的功能,让我们可以轻松地在分类页上展示分类简介、Banner图和缩略图,让您的网站分类页焕然一新。
理解 AnQiCMS 的分类页与模板结构
在 AnQiCMS 中,每一个分类都有其对应的展示页面,通常用于列出该分类下的所有文章或产品。这些页面的内容和布局,都是由相应的模板文件控制的。
默认情况下,分类页的模板文件通常位于您当前使用的模板文件夹下的 /{模型table}/list.html,例如文章分类可能对应 article/list.html,产品分类可能对应 product/list.html。您也可以为特定的分类ID自定义模板,比如 article/list-10.html,这为不同的分类提供了高度定制化的可能。AnQiCMS 会根据当前访问的分类,自动加载并解析正确的模板,并为您提供当前分类的相关数据。
在后台为分类添加丰富信息
要在分类页上展示分类简介、Banner图和缩略图,第一步是在 AnQiCMS 后台为您的分类添加这些信息。
您可以前往 内容管理 -> 文档分类,找到您需要编辑的分类,点击“编辑”按钮。在分类编辑页面中,除了“分类名称”和“文档模型”等基础信息外,您会看到一个“其他参数”的折叠区域。展开这个区域,您将发现以下几个关键字段:
- 分类简介: 这是一个文本输入框,您可以在这里填写对当前分类的简要介绍。这些内容不仅有助于用户快速理解分类主题,也是搜索引擎抓取页面描述(meta description)的重要来源。
- Banner图: 这里允许您上传一张或多张图片。通常用于在分类页顶部展示一个醒目的视觉元素,增加页面的美观度和专业性。您可以上传多张图片,系统会将其作为图片组处理。
- 缩略图: 这是一个单独的图片上传字段。缩略图通常用于在分类列表(例如首页展示的分类模块)或面包屑导航中,以小图的形式代表当前分类。
确保为您的分类填写并上传这些内容,这是前端调用的数据基础。
在分类模板中调用并展示信息
一旦在后台配置好了分类的各项信息,接下来就是在前端模板文件中将它们调用并显示出来。我们将主要使用 categoryDetail 标签来获取当前分类的详细数据。
显示分类简介
分类简介通常分为两种:简短的概述和详细的富文本内容。
如果您在后台的“分类简介”字段填写了简要文字,可以在模板中使用 name="Description" 来获取并展示:
<div class="category-description-short">
<p>{% categoryDetail with name="Description" %}</p>
</div>
如果您的分类页需要展示更详细的、包含富文本甚至Markdown格式的分类内容,可以在后台的“分类内容”字段填写,并在模板中以 name="Content" 来调用。由于“分类内容”可能包含HTML标签,为了确保浏览器正确解析,我们需要使用 |safe 过滤器:
<div class="category-full-content">
{% categoryDetail categoryContent with name="Content" %}{{ categoryContent|safe }}
</div>
展示 Banner 图
Banner图通常是分类页最吸睛的元素之一。在后台上传的Banner图,可以通过 name="Images" 来获取一个图片列表。
如果您的分类只需要展示一张主Banner图,或者您上传了多张但只想取第一张,可以这样处理:
{% categoryDetail bannerImages with name="Images" %}
{% if bannerImages %}
{# 假设您只想显示上传的第一张Banner图 #}
{% set mainBanner = bannerImages[0] %}
<div class="category-banner" style="background-image: url('{{ mainBanner }}');">
{# 您可以在Banner上叠加分类名称或其他信息 #}
<h1>{% categoryDetail with name="Title" %}</h1>
</div>
{% endif %}
如果您的分类可能上传了多张Banner图,希望以轮播图的形式展示,您需要引入一个前端轮播组件(例如Swiper或Owl Carousel),然后遍历 bannerImages 数组:
{% categoryDetail bannerImages with name="Images" %}
{% if bannerImages %}
<div class="category-carousel swiper-container">
<div class="swiper-wrapper">
{% for image in bannerImages %}
<div class="swiper-slide">
<img src="{{ image }}" alt="{% categoryDetail with name="Title" %}" />
</div>
{% endfor %}
</div>
{# 如果需要,添加分页器和导航按钮 #}
<div class="swiper-pagination"></div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
{% endif %}
显示缩略图
分类缩略图通常用于在分类列表或导航中展示。如果您希望在当前分类页面的某个小区域显示其自身的缩略图,可以使用 name="Thumb":
<div class="category-thumbnail-area">
{% categoryDetail categoryThumb with name="Thumb" %}
{% if categoryThumb %}
<img src="{{ categoryThumb }}" alt="{% categoryDetail with name="Title" %}" />
{% else %}
{# 如果没有上传缩略图,可以显示一个默认占位图 #}
<img src="/public/static/images/default-thumb.png" alt="{% categoryDetail with name="Title" %}" />
{% endif %}
</div>
综合示例:构建一个更丰富的分类页
下面是一个将上述元素整合到分类列表页 article/list.html 中的简化示例,您可以在此基础上根据您的设计需求进行扩展:
”`twig {% extends ‘base.html’ %} {# 继承您的基础模板 #}
{% block title %}
<title>{% tdk with name="Title" siteName=true %}</title>
{% endblock %}
{% block content %}
<div class="container">
{# 分类 Banner 区域 #}
{% categoryDetail bannerImages with name="Images" %}
{% if bannerImages %}
{% set mainBanner = bannerImages[0] %} {# 假设只显示第一张作为主Banner #}
<div class="hero-banner" style="background-image: url('{{ mainBanner }}');">
<h1 class="hero-title">{% categoryDetail with name="Title" %}</h1>
</div>
{% else %}
<div class="hero-banner-placeholder">
<h1 class="hero-title">{% categoryDetail with name="Title" %}</h1>
</div>
{% endif %}
<div class="category-header">
{# 分类缩略图,可选 #}
{% categoryDetail categoryThumb with name="Thumb" %}
{% if categoryThumb %}
<div class="category-icon">
<img src="{{ categoryThumb }}" alt="{% categoryDetail with name="Title" %}" />
</div>
{% endif %}
{# 分类简介 #}
<div class="category-intro">
<p>{% categoryDetail with name="Description" %}</p>
</div>
</div>
{# 详细分类内容,如果需要 #}
{% categoryDetail categoryFullContent with name="Content" %}
{% if categoryFullContent %}
<div class="category-detail-content">
{{ categoryFullContent|safe }}
</div>
{% endif %}
<hr>
{# 该分类下的文章列表 #}
<div class="article-list">
<h2>最新文章</h2>
{% archiveList archives with type="page" limit="10" %}
{% for item in archives %}
<div class="article-item">
<h3><a href="{{ item.Link }}">{{ item.Title }}</a></h3>
<p>{{ item.Description }}</p>
<small>发布日期: {{ stampToDate(item.CreatedTime, "2006-01-02") }} 阅读: {{ item.Views }}</small>
{% if item.Thumb %}
<img src="{{ item.Thumb }}" alt="{{ item.Title }}" class="article-thumb" />
{% endif %}
</div>
{% empty %}
<p>该分类下暂无文章。</p>
{% endfor %}
{% endarchiveList %}
{# 分页导航 #}
<div class="pagination">
{% pagination pages with show="5" %}
<ul>
{% if pages.PrevPage %}<li class="page-item"><a href="{{pages.PrevPage.Link}}">上一页</a></li>{% endif %}
{% for page