如何在模板中判断当前页面是文章详情页还是分类列表页,并进行不同内容显示?

在安企CMS的模板开发中,根据当前页面的类型(是文章详情页还是分类列表页)来显示不同的内容,是一个非常常见的需求。这不仅能让网站的用户体验更加个性化,也能在SEO优化方面提供更精细的控制。幸运的是,安企CMS强大的模板引擎提供了直观的方式来判断当前页面的上下文,并据此进行条件渲染。

理解安企CMS的模板上下文

安企CMS的模板引擎非常智能,它在渲染页面时,会根据当前URL和数据模型自动加载相关的上下文信息。这意味着,当你在一个文章详情页时,模板会自动“知道”这是一篇文章;当你在一个分类列表页时,它也同样会“知道”这是一个分类。我们可以巧妙地利用其内置的标签和逻辑判断,来判断当前页面的具体类型。

判断当前页面是否为文章详情页

判断当前页面是否为文章详情页,最直接有效的方法是尝试获取当前页面的文章详情数据。安企CMS提供了archiveDetail标签,默认情况下,它会尝试获取当前页面的文章数据。如果当前页面确实是一个文章详情页,那么通过这个标签获取到的文章ID就会有值。

我们可以在模板中这样进行判断:

{%- archiveDetail currentArchiveId with name="Id" %}

{% if currentArchiveId %}
    {# 这里是文章详情页特有的内容 #}
    <div class="article-detail-header">
        <h1>{% archiveDetail with name="Title" %}</h1>
        <p>发布时间:{% archiveDetail with name="CreatedTime" format="2006-01-02" %}</p>
        {# 可以在文章详情页显示返回其所属分类列表的链接 #}
        {%- archiveDetail articleCategory with name="Category" %}
        {%- if articleCategory %}
            <a href="{{ articleCategory.Link }}" class="back-to-category">返回 {{ articleCategory.Title }} 列表</a>
        {%- endif %}
    </div>
    <div class="article-content">
        {%- archiveDetail articleContent with name="Content" %}
        {{ articleContent|safe }} {# 使用safe过滤器确保HTML内容正确渲染 #}
    </div>
    {# 可以在这里添加“上一篇/下一篇”导航、相关推荐等 #}
    <div class="navigation">
        {% prevArchive prev %}
            {% if prev %}<a href="{{ prev.Link }}">上一篇:{{ prev.Title }}</a>{% else %}<span>没有上一篇了</span>{% endif %}
        {% endprevArchive %}
        {% nextArchive next %}
            {% if next %}<a href="{{ next.Link }}">下一篇:{{ next.Title }}</a>{% else %}<span>没有下一篇了</span>{% endif %}
        {% endnextArchive %}
    </div>
{% endif %}

在这段代码中,我们首先使用{%- archiveDetail currentArchiveId with name="Id" %}尝试获取当前文章的ID并赋值给currentArchiveId变量。{%-的使用是为了避免在实际渲染时产生多余的空白行。如果currentArchiveId变量有值(即{% if currentArchiveId %}条件为真),就说明当前页面是一个文章详情页,我们就可以在此代码块内显示所有文章详情页特有的内容。

判断当前页面是否为分类列表页

如果当前页面不是文章详情页,我们接下来需要判断它是不是一个分类列表页。安企CMS提供了categoryDetail标签,同样地,它在未指定id参数时,也会尝试获取当前页面的分类数据。如果当前页面是一个分类列表页,那么通过这个标签获取到的分类ID就会有值。

为了避免判断冲突(一个页面既有文章ID又有分类ID,但我们想优先识别为文章详情),这个判断通常会放在文章详情页判断之后。

”`twig {%- categoryDetail currentCategoryId with name=“Id” %}

{% if currentCategoryId %}

{# 这里是分类列表页特有的内容 #}
<div class="category-list-header">
    <h1>{% categoryDetail with name="Title" %}</h1>
    <p>{% categoryDetail with name="Description" %}</p>
    {# 显示分类Banner图,如果存在的话 #}
    {%- categoryDetail categoryBanner with name="Images" %}
    {%- if categoryBanner %}
        <img src="{{ categoryBanner[0] }}" alt="{% categoryDetail with name='Title' %}" class="category-banner">
    {%- endif %}
</div>
<ul class="article-list">
    {% archiveList archives with type="