安企CMS导航菜单:巧用navList实现多级嵌套与子导航判断

作为一名资深的网站运营专家,我深知一套清晰、灵活的导航系统对于用户体验和网站整体架构的重要性。在安企CMS(AnQiCMS)中,navList标签正是我们构建强大导航系统的核心工具。它不仅能够帮助我们轻松展示网站的主导航,更提供了强大的机制来判断菜单项是否拥有子导航,并进行优雅的嵌套渲染,从而构建出层次分明、功能丰富的多级菜单。

今天,我们就来深入探讨如何在安企CMS中,巧妙地运用navList标签,判断并渲染带有子导航的菜单项。

认识navList:安企CMS的导航基石

在安企CMS的模板设计中,navList标签承担着获取网站导航列表的重要职责。它允许我们根据不同的需求,比如主导航、页脚导航或侧边栏导航,通过typeId参数来调用预设好的导航类别。当我们在后台“网站导航设置”中配置好菜单结构,包括一级菜单和可能存在的二级甚至更多级子菜单时,navList标签就会将这些结构化的导航数据提取出来,供前端模板使用。

每一个从navList标签循环出的菜单项,都被封装在一个item变量中。这个item包含了导航标题(Title)、链接(Link)、子标题(SubTitle)、描述(Description)等基本信息。而判断一个菜单项是否拥有子导航的关键,则在于检查它的一个特殊属性:NavList

核心判断:item.NavList的奥秘

item.NavList是一个非常关键的属性,如果当前的菜单项下面有子菜单,那么item.NavList就会是一个包含这些子菜单项的数组。更巧妙的是,这个NavList数组中的每一个子菜单项,也同样拥有和父级item相同的字段结构,包括它自己的NavList属性。这种递归的结构,正是实现多级嵌套导航的基础。

要判断一个菜单项是否有子导航,我们只需简单地利用安企CMS模板引擎的if条件判断标签,检查item.NavList是否存在或不为空即可。

例如,在一个典型的两级导航结构中,我们可以这样编写模板代码:

{% navList navs %}
    <ul class="main-nav">
        {%- for item in navs %} {# 遍历一级导航 #}
            <li class="{% if item.IsCurrent %}active{% endif %}">
                <a href="{{ item.Link }}">{{item.Title}}</a>
                {%- if item.NavList %} {# <-- 关键判断点:如果存在子导航 #}
                <dl class="sub-nav">
                    {%- for inner in item.NavList %} {# <-- 嵌套渲染子导航 #}
                        <dd class="{% if inner.IsCurrent %}active{% endif %}">
                            <a href="{{ inner.Link }}">{{inner.Title}}</a>
                        </dd>
                    {% endfor %}
                </dl>
                {% endif %}
            </li>
        {% endfor %}
    </ul>
{% endnavList %}

在这段代码中,我们首先使用{% navList navs %}获取顶层导航列表,并通过一个for循环遍历每一项。在循环内部,{%- if item.NavList %}这行代码便是判断当前item是否有子导航的核心。一旦判断为真,我们便会进入一个新的dl标签内部,并用另一个for循环({%- for inner in item.NavList %})来渲染这些子导航项。inner变量代表了每一个子导航项,它同样拥有TitleLink等属性,与父级item的使用方式保持一致。

进阶应用:动态内容与多层嵌套

这种判断和嵌套的模式并非仅限于两级,它具有很强的递归性。如果你的导航有三级甚至更多级,你可以在inner循环内部,再次检查inner.NavList,并重复上述的嵌套渲染逻辑。

更重要的是,导航菜单项不仅可以链接到普通的页面或分类,我们还可以利用它来动态地展示与该导航项相关的内容,比如某个产品分类下的具体产品列表,或者某个分类下的子分类列表。这通常需要结合inner.PageId属性来完成。inner.PageId记录了该导航项所关联的页面、分类或模型的ID。

例如,在一个复杂的导航菜单中,你可能希望当鼠标悬停在某个产品分类上时,不仅显示该分类的子分类,还能直接展示一些热门产品。

下面是一个在导航项下显示关联产品的示例:

<ul>
    {% navList navList with typeId=1 %}
    {%- for item in navList %}
    <li>
        <a href="{{ item.Link }}">{{item.Title}}</a>
        {%- if item.NavList %} {# 如果有一级子导航 #}
        <ul class="nav-menu-child">
            {%- for inner in item.NavList %} {# 遍历一级子导航 #}
            <li>
                <a href="{{ inner.Link }}">{{inner.Title}}</a>
                {% archiveList products with type="list" categoryId=inner.PageId limit="8" %} {# <-- 这里根据子导航关联的分类ID调用产品列表 #}
                {% if products %} {# 如果有产品内容 #}
                <ul class="nav-menu-child-child">
                    {% for product in products %}
                    <li><a href="{{product.Link}}">{{product.Title}}</a></li>
                    {% endfor %}
                </ul>
                {% endif %}
                {% endarchiveList %}
            </li>
            {% endfor %}
        </ul>
        {% endif %}
    </li>
    {% endfor %}
    {% endnavList %}
</ul>

这里,我们通过inner.PageId