Twig中如何实现PHP式变量变量?子菜单代码报错求助
解决Twig中类似PHP变量变量的导航菜单问题
嘿,Mikel,你遇到的问题是Twig不支持PHP那种直接的${$slug}变量变量语法,你写的{% for slugg, itemm in {{ slug }} %}是错误的写法——Twig里循环的目标变量不需要加花括号,而且动态获取变量得用专门的方式。下面给你两种可行的解决方案:
方法一:重构数组结构(推荐)
最规范的做法是把子菜单直接嵌套到主区域数组里,这样结构更集中,维护起来也方便,完全不需要动态变量的操作:
{% set regiones = { patagonia: { title: "Patagonia", submenu: { neuquen: { title: "Neuquén"}, rionegro: { title: "Río Negro"}, chubut: { title: "Chubut"}, santacruz: { title: "Santa Cruz"}, tierradelfuego: { title: "Tierra del Fuego"} } }, pampa: { title: "Pampa", submenu: { buenosaires: { title: "Buenos Aires"}, cordoba: { title: "Córdoba"}, lapampa: { title: "La Pampa"}, santafe: { title: "Santa Fe"} } }, cuyo: { title: "Cuyo", submenu: { mendoza: { title: "Mendoza"}, sanjuan: { title: "San Juan"}, sanluis: { title: "San Luis"} } }, noreste: { title: "Noreste"}, noroeste: { title: "Noroeste"} } %} <nav> <ul> {% for slug, item in regiones %} <li><a href="/{{ slug }}">{{ item.title }}</a> {# 只有当子菜单存在时才渲染 #} {% if item.submenu is defined %} <ul> {% for subSlug, subItem in item.submenu %} <li><a href="/{{ slug }}/{{ subSlug }}">{{ subItem.title }}</a></li> {% endfor %} </ul> {% endif %} </li> {% endfor %} </ul> </nav>
这种方式的优点是逻辑清晰,所有导航数据都在一个数组里,后续修改或添加新区域/子菜单都很直观。
方法二:使用attribute()函数实现动态变量
如果你不想重构现有数组,想保留单独的子菜单变量,可以用Twig的attribute()函数结合_context变量——_context是当前模板中所有变量的集合,通过它可以动态获取以slug值命名的变量:
{% set regiones = { patagonia: { title: "Patagonia"}, pampa: { title: "Pampa"}, cuyo: { title: "Cuyo"}, noreste: { title: "Noreste"}, noroeste: { title: "Noroeste"} } %} {% set patagonia = { neuquen: { title: "Neuquén"}, rionegro: { title: "Río Negro"}, chubut: { title: "Chubut"}, santacruz: { title: "Santa Cruz"}, tierradelfuego: { title: "Tierra del Fuego"} } %} {% set pampa = { buenosaires: { title: "Buenos Aires"}, cordoba: { title: "Córdoba"}, lapampa: { title: "La Pampa"}, santafe: { title: "Santa Fe"} } %} {% set cuyo = { mendoza: { title: "Mendoza"}, sanjuan: { title: "San Juan"}, sanluis: { title: "San Luis"} } %} <nav> <ul> {% for slug, item in regiones %} <li><a href="/{{ slug }}">{{ item.title }}</a> {# 先判断对应的子菜单变量是否存在,避免报错 #} {% if attribute(_context, slug) is defined %} <ul> {% for slugg, itemm in attribute(_context, slug) %} <li><a href="/{{ slugg }}">{{ itemm.title }}</a></li> {% endfor %} </ul> {% endif %} </li> {% endfor %} </ul> </nav>
这里关键是把你原来的{% for slugg, itemm in {{ slug }} %}改成{% for slugg, itemm in attribute(_context, slug) %},同时加上存在性判断,防止noreste和noroeste这类没有子菜单的项引发错误。
内容的提问来源于stack exchange,提问作者M. Galardi
相关产品推荐
相关产品推荐

