"Illegal offset type in isset or empty" 使用 Twig 宏时
"Illegal offset type in isset or empty" when using a Twig macro
使用 Grav v1.3.8(运行 on PHP 5.6.30),我目前遇到服务器错误("Illegal offset type in isset or empty") 尝试呈现使用宏的 Twig 模板时。
有趣的是,只有当我单独使用宏时才会出现这种情况。一旦我附加了一个过滤器,比如 trim
,一切都会按预期进行。
(缩短的)宏文件,helpers.twig
:
{% macro ascii(str) %}
{% spaceless %}
{{ str|replace({
'Á': 'A',
'À': 'A',
'Â': 'A',
'Ã': 'A',
....
'ƒ': 'f'
})
}}
{% endspaceless %}
{% endmacro ascii %}
模板(MCVE):
{% import 'macros/helpers.twig' as helpers %}
{% set img = helpers.ascii('günter-berger.jpg') %}
{% if page.media[img] is defined %}
<img src="{{ page.media[img].url }}">
{% endif %}
这将产生错误。我将其缩小到 if
行。显然,宏工作正常,但如果输入未过滤的输出,条件将引发错误。添加任何过滤器,如 trim
或 lower
,将使其再次工作。
换句话说,这些工作:
{% if page.media['günter-berger.jpg'] is defined %}
{% if page.media[helpers.ascii('günter-berger.jpg')|trim] is defined %}
但这会引发错误:
{% if page.media[helpers.ascii('günter-berger.jpg')] is defined %}
然而,尝试 the same thing on twigfiddle,所有三个似乎都在那里工作。
也许是 Grav 的问题?有人可以指出任何可能的原因吗?
我忘了这个,但是宏不是 return 字符串而是 return 一个 Twig_Markup
的实例
{% set test = macro.ascii('Ghünter.jpg') %}
{{ dump(test) }}
输出:object(Twig_Markup)#10679 (2) { ["content":protected]=> string(11) "Ghunter.jpg" ["charset":protected]=> string(5) "UTF-8" }
因为 return 类型是一个对象,您会收到此通知,因为您不能将对象用作 index
。通过在此实例上使用过滤器,将调用 magic method
__toString
方法,使其成为 return 字符串,从而使其可用作数组 [=] 的 index
19=]
唯一的办法就是绕过这个,写一个 filter
而不是 macro
使用 Grav v1.3.8(运行 on PHP 5.6.30),我目前遇到服务器错误("Illegal offset type in isset or empty") 尝试呈现使用宏的 Twig 模板时。
有趣的是,只有当我单独使用宏时才会出现这种情况。一旦我附加了一个过滤器,比如 trim
,一切都会按预期进行。
(缩短的)宏文件,helpers.twig
:
{% macro ascii(str) %}
{% spaceless %}
{{ str|replace({
'Á': 'A',
'À': 'A',
'Â': 'A',
'Ã': 'A',
....
'ƒ': 'f'
})
}}
{% endspaceless %}
{% endmacro ascii %}
模板(MCVE):
{% import 'macros/helpers.twig' as helpers %}
{% set img = helpers.ascii('günter-berger.jpg') %}
{% if page.media[img] is defined %}
<img src="{{ page.media[img].url }}">
{% endif %}
这将产生错误。我将其缩小到 if
行。显然,宏工作正常,但如果输入未过滤的输出,条件将引发错误。添加任何过滤器,如 trim
或 lower
,将使其再次工作。
换句话说,这些工作:
{% if page.media['günter-berger.jpg'] is defined %}
{% if page.media[helpers.ascii('günter-berger.jpg')|trim] is defined %}
但这会引发错误:
{% if page.media[helpers.ascii('günter-berger.jpg')] is defined %}
然而,尝试 the same thing on twigfiddle,所有三个似乎都在那里工作。
也许是 Grav 的问题?有人可以指出任何可能的原因吗?
我忘了这个,但是宏不是 return 字符串而是 return 一个 Twig_Markup
{% set test = macro.ascii('Ghünter.jpg') %}
{{ dump(test) }}
输出:object(Twig_Markup)#10679 (2) { ["content":protected]=> string(11) "Ghunter.jpg" ["charset":protected]=> string(5) "UTF-8" }
因为 return 类型是一个对象,您会收到此通知,因为您不能将对象用作 index
。通过在此实例上使用过滤器,将调用 magic method
__toString
方法,使其成为 return 字符串,从而使其可用作数组 [=] 的 index
19=]
唯一的办法就是绕过这个,写一个 filter
而不是 macro