使用Grav v1.3.8(在PHP 5.6.30上运行),我目前收到服务器错误(" isset中的非法偏移类型或空#34; )尝试渲染使用宏的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,这三个似乎都在那里工作 也许格拉夫有问题?有人可以指出任何可能的原因吗?
答案 0 :(得分:3)
我忘记了这一点,但宏没有返回字符串,而是返回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" }
由于返回类型是对象,因此您无法将对象用作index
,因此您会收到此通知。通过在此实例上使用过滤器,将调用magic method
__toString
方法,使其返回一个字符串,从而使其可用作数组的index
唯一可以绕过这一点,就是写filter
而不是macro