Twig &引用;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',

使用Grav1.3.8(在PHP5.6.30上运行),我当前在试图呈现使用宏的细枝模板时遇到一个服务器错误(“isset中的非法偏移类型或空”)

有趣的是,只有当我单独使用宏时才会发生这种情况。只要我附加一个过滤器,比如
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
应该返回一个字符串。