OctoberCMS博客组件中currentCategorySlug无法传递至宏的问题求助
解决OctoberCMS博客分类宏中currentCategorySlug传递问题
我之前也碰到过这个Twig宏作用域的坑!OctoberCMS用的Twig模板里,宏有自己独立的作用域,外部变量默认没法直接在宏里访问,这就是你currentCategorySlug传不进去的原因。
问题分析
你原来的代码里,虽然在调用宏前set了currentCategorySlug,但宏内部并没有接收这个变量作为参数,反而自己重新set了一遍——这相当于在宏的局部作用域里创建了一个新变量,根本拿不到外部的当前分类slug值,所以子分类的active状态判断自然失效。
修复步骤
只需要把currentCategorySlug明确作为参数传递给宏,包括宏内部递归调用自己的时候:
- 修改宏的定义,添加参数
把宏的定义改成接收categories和currentCategorySlug两个参数:
{% macro render_cats(categories, currentCategorySlug) %}
- 递归调用宏时传递参数
在宏内部处理子分类的时候,调用自己要带上currentCategorySlug:
{{ list.render_cats(category.children, currentCategorySlug) }}
- 外部调用宏时传递参数
在partial的主代码里调用宏的时候,也要把外部的currentCategorySlug传进去:
{{ list.render_cats(categories, currentCategorySlug) }}
完整修改后的代码
{% import _self as list %} {% macro render_cats(categories, currentCategorySlug) %} {% import _self as list %} {% for category in categories %} {% set postCount = category.post_count %} <li class="{{ category.slug == currentCategorySlug ? 'active' }}"> <a href="{{ category.url }}">{{ category.name }}</a> {% if postCount %} <span>{{ postCount }}</span> {% endif %} </li> {% if category.children|length > 0 %} <ul> {{ list.render_cats(category.children, currentCategorySlug) }} </ul> {% endif %} {% endfor %} {% endmacro %} <div> <h3>Categories</h3> {% if blogCategories.categories|length > 0 %} <ul> {% set categories = blogCategories.categories %} {% set currentCategorySlug = blogCategories.currentCategorySlug %} {{ list.render_cats(categories, currentCategorySlug) }} </ul> {% else %} <p>No categories were found.</p> {% endif %} </div>
这样修改后,宏就能正确拿到当前分类的slug,子分类的active状态就能正常判断了。
内容的提问来源于stack exchange,提问作者Charis
相关产品推荐
相关产品推荐

