Twig &引用;isset中的偏移类型非法或为空;使用细枝宏时
使用Grav1.3.8(在PHP5.6.30上运行),我当前在试图呈现使用宏的细枝模板时遇到一个服务器错误(“isset中的非法偏移类型或空”) 有趣的是,只有当我单独使用宏时才会发生这种情况。只要我附加一个过滤器,比如Twig &引用;isset中的偏移类型非法或为空;使用细枝宏时,twig,grav,Twig,Grav,使用Grav1.3.8(在PHP5.6.30上运行),我当前在试图呈现使用宏的细枝模板时遇到一个服务器错误(“isset中的非法偏移类型或空”) 有趣的是,只有当我单独使用宏时才会发生这种情况。只要我附加一个过滤器,比如trim,一切都会按预期工作 宏文件(简称)helpers.twig: {% macro ascii(str) %} {% spaceless %} {{ str|replace({ 'Á': 'A', 'À': 'A',
trim
,一切都会按预期工作
宏文件(简称)helpers.twig:
{% macro ascii(str) %}
{% spaceless %}
{{ str|replace({
'Á': 'A',
'À': 'A',
'Â': 'A',
'Ã': 'A',
....
'ƒ': 'f'
})
}}
{% endspaceless %}
{% endmacro ascii %}
{% 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 %}
模板(MCVE):
{% macro ascii(str) %}
{% spaceless %}
{{ str|replace({
'Á': 'A',
'À': 'A',
'Â': 'A',
'Ã': 'A',
....
'ƒ': 'f'
})
}}
{% endspaceless %}
{% endmacro ascii %}
{% 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 %}
{%import'宏/helpers.twig'作为helpers%}
{%set img=helpers.ascii('günter berger.jpg')%}
{%如果定义了page.media[img%}
{%endif%}
这将产生错误。我把它缩小到if
行。显然,宏工作正常,但如果未经过滤地输入宏的输出,则该条件将抛出错误。添加任何过滤器,如trim
或lower
,将使其再次工作
换句话说,这些工作:
{%if page.media['günter berger.jpg']已定义%}
{%if page.media[helpers.ascii('günter berger.jpg')| trim]已定义%}
{%if page.media[helpers.ascii('günter berger.jpg')已定义%}
也许是Grav的问题?有人能指出任何可能的原因吗?我忘记了这一点,但是宏不会返回字符串,而是返回一个
Twig\u标记的实例
{% set test = macro.ascii('Ghünter.jpg') %}
{{ dump(test) }}
输出:object(Twig_标记)10679(2){[“content”:protected]=>string(11)“Ghunter.jpg”[“charset”:protected]=>string(5)“UTF-8”}
由于返回类型是一个对象,您将收到此通知,因为您不能将对象用作索引。通过在此实例上使用筛选器,将调用魔术方法\uuuuToString
方法,使其返回字符串,从而使其可作为数组的索引使用
唯一的办法就是绕过这个,写一个过滤器,而不是一个宏,我忘记了这一点,但是宏不返回字符串,而是返回一个小树枝标记的实例
{% set test = macro.ascii('Ghünter.jpg') %}
{{ dump(test) }}
输出:object(Twig_标记)10679(2){[“content”:protected]=>string(11)“Ghunter.jpg”[“charset”:protected]=>string(5)“UTF-8”}
由于返回类型是一个对象,您将收到此通知,因为您不能将对象用作索引。通过在此实例上使用筛选器,将调用魔术方法\uuuuToString
方法,使其返回字符串,从而使其可作为数组的索引使用
唯一的办法就是绕过它,编写一个过滤器
,而不是宏
,似乎宏就是这里的问题所在though@DarkBee你说得对。多亏了你的暗示,我才能够进一步缩小这个问题的范围。问题已相应更新。看来宏观是这里的问题though@DarkBee你说得对。多亏了你的暗示,我才能够进一步缩小这个问题的范围。问题也相应更新了。哈,我怀疑是这样的!就在一分钟前,我尝试使用string
过滤器将宏的结果转换为string,这也起到了作用。但是,这感觉有点脆弱-将来移除过滤器将再次导致此错误。有没有更好(更稳定或更优雅)的方法?也许是强制宏实际返回字符串的一种方法?不能强制宏返回字符串。但是你应该可以在grav中做这样的事情:谢谢!现在我了解了问题的原因以及如何解决问题。让宏返回字符串的另一种方法是使用无空格过滤器。例如:macro.ascii('Ghünter.jpg')| spaceless
应该返回一个字符串。哈,我怀疑是这样的!就在一分钟前,我尝试使用string
过滤器将宏的结果转换为string,这也起到了作用。但是,这感觉有点脆弱-将来移除过滤器将再次导致此错误。有没有更好(更稳定或更优雅)的方法?也许是强制宏实际返回字符串的一种方法?不能强制宏返回字符串。但是你应该可以在grav中做这样的事情:谢谢!现在我了解了问题的原因以及如何解决问题。让宏返回字符串的另一种方法是使用无空格过滤器。例如:macro.ascii('Ghünter.jpg')| spaceless
应该返回一个字符串。