在AnQiCMS中构建一个清晰、功能丰富的网站,离不开灵活多样的导航菜单。多级导航不仅能帮助访问者迅速定位所需内容,更能优化网站结构,对搜索引擎友好。AnQiCMS强大的模板引擎和后台管理功能,让实现复杂的嵌套导航变得直观而高效。

AnQiCMS 中的导航菜单构成:理解基础

在AnQiCMS中,导航菜单的实现分为两个主要部分:首先是在后台进行配置和数据管理,其次是在前端模板文件中通过特定的标签和逻辑来渲染显示。AnQiCMS采用了类似Django模板引擎的语法,这种语法以其易学性和强大功能而闻名,使得开发者和运营者能够轻松上手,将技术信息转化为实用的展示效果。

系统内置的 navList 标签是构建导航的核心工具,它能帮助我们获取后台设置的导航数据。同时,结合 for 循环、if 逻辑判断等通用模板标签,我们可以轻松地实现多级菜单的嵌套显示。

第一步:后台配置多级导航

首先,我们需要在AnQiCMS的后台设置导航菜单的结构。

  1. 进入“网站导航设置”: 登录AnQiCMS后台,在左侧菜单中找到“后台设置”,然后点击“导航设置”。
  2. 管理导航类别: 默认情况下,系统会有一个“默认导航”类别。如果您需要为网站的不同区域(例如顶部导航、页脚导航、侧边栏导航)创建独立的菜单,可以在“导航类别管理”中添加新的导航类别。每个类别都会有一个唯一的 typeId,在模板中调用时会用到。
  3. 添加导航链接:
    • 创建一级导航: 点击“添加导航链接”,填写“显示名称”和“链接类型”。链接类型可以是内置链接(如首页、模型首页)、分类页面链接(选择现有分类或单页面)或外部链接(手动输入URL)。将“上级导航”选择为“顶级导航”,即可创建一个一级菜单项。
    • 创建二级导航: 要创建一个子菜单,只需再次点击“添加导航链接”,在“上级导航”下拉列表中选择您刚才创建的一级导航。这样,新的链接就会作为该一级导航的子项出现。
    • 显示顺序: 通过调整“显示顺序”的数字,可以控制导航项的排列位置,数字越小越靠前。

AnQiCMS的导航设置原生支持两级菜单的嵌套。这意味着您可以在后台方便地设置“主菜单 -> 子菜单”这样的结构。

第二步:模板文件中的实现

完成了后台配置后,接下来就是将这些数据呈现在网站前端。AnQiCMS的模板文件通常位于 /template 目录下,并使用 .html 后缀。

我们使用 navList 标签来获取后台配置的导航数据。以下是一个基本的两级导航菜单的模板代码示例:

{# 假设我们调用的是默认导航类别,其 typeId 默认为1 #}
<nav class="main-navigation">
    <ul>
        {# 遍历所有一级导航项 #}
        {% navList navs with typeId=1 %}
            {% for item in navs %}
                <li class="{% if item.IsCurrent %}active{% endif %}{% if item.NavList %} has-submenu{% endif %}">
                    <a href="{{ item.Link }}" {% if item.SubTitle %}title="{{ item.SubTitle }}"{% endif %}>
                        {{ item.Title }}
                    </a>
                    {# 如果当前一级导航有子菜单,则进行嵌套遍历 #}
                    {% if item.NavList %}
                        <ul class="submenu">
                            {% for subItem in item.NavList %}
                                <li class="{% if subItem.IsCurrent %}active{% endif %}">
                                    <a href="{{ subItem.Link }}" {% if subItem.SubTitle %}title="{{ subItem.SubTitle }}"{% endif %}>
                                        {{ subItem.Title }}
                                    </a>
                                </li>
                            {% endfor %}
                        </ul>
                    {% endif %}
                </li>
            {% endfor %}
        {% endnavList %}
    </ul>
</nav>

在这个示例中:

  • {% navList navs with typeId=1 %} 用于获取 typeId 为 1 的导航类别下的所有导航数据,并将其赋值给变量 navs
  • 外层的 {% for item in navs %} 循环遍历所有的一级导航项。
  • item.Linkitem.Title 分别输出导航链接地址和显示名称。
  • {% if item.IsCurrent %} 判断当前导航项是否是用户正在访问的页面,如果是,可以添加 active 类来高亮显示。
  • {% if item.NavList %} 是关键,它检查当前一级导航项是否有子导航。如果 item.NavList 存在,则会进入内层的 for 循环,遍历并显示所有二级导航项 (subItem)。

深入探讨:三级甚至更多级导航的灵活实现

虽然 navList 标签原生支持两级导航,但在实际网站运营中,我们经常需要更深层次的菜单,例如“一级分类 -> 二级分类 -> 某个二级分类下的产品列表”。AnQiCMS通过灵活的标签嵌套,完全可以实现这种需求。

要实现三级甚至更多级的导航,我们可以在二级导航的循环中,进一步嵌套其他数据调用标签,例如 categoryList(分类列表标签)或 archiveList(文档列表标签),利用二级导航项的 PageId 来动态获取相关内容。

以下是一个实现“一级分类 -> 二级分类 -> 二级分类下的文档列表”的三级导航示例:

<nav class="main-navigation">
    <ul>
        {% navList navList with typeId=1 %}
            {% for item in navList %}
                <li class="{% if item.IsCurrent %}active{% endif %}{% if item.NavList %} has-submenu{% endif %}">
                    <a href="{{ item.Link }}">{{ item.Title }}</a>
                    {% if item.NavList %}
                        <ul class="submenu">
                            {% for inner in item.NavList %}
                                <li class="{% if inner.IsCurrent %}active{% endif %}{% if inner.PageId > 0 %} has-third-level{% endif %}">
                                    <a href="{{ inner.Link }}">{{ inner.Title }}</a>
                                    {# 检查二级导航项是否关联了某个分类ID (PageId),如果存在,则获取该分类下的文档 #}
                                    {% if inner.PageId > 0 %}
                                        {# 获取该分类下的文档,作为第三级菜单 #}
                                        {% archiveList products with type="list" categoryId=inner.PageId limit="8" %}
                                            {% if products %}
                                                <ul class="third-level-menu">
                                                    {% for product in products %}
                                                        <li><a href="{{ product.Link }}">{{ product.Title }}</a></li>
                                                    {% endfor %}
                                                </ul>
                                            {% endif %}
                                        {% endarchiveList %}
                                    {% endif %}
                                </li>
                            {% endfor %}
                        </ul>
                    {% endif %}
                </li>
            {% endfor %}
        {% endnavList %}
    </ul>
</nav>

在这个扩展示例中:

  • 我们关注内层的 {% for inner in item.NavList %} 循环,它代表了二级导航项。
  • {% if inner.PageId > 0 %} 检查当前二级导航项是否在后台配置时关联了一个分类(PageId 会是该分类的ID)。
  • 如果关联了分类,我们便在其中嵌套 {% archiveList products with type="list" categoryId=inner.PageId limit="8" %} 标签,获取该分类下的最多8篇文档(