" isset或empty中的非法偏移类型"使用Twig宏时

时间:2017-11-28 13:16:43

标签: twig grav

使用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行。显然,宏工作正常,但如果输入它的输出,未经过滤,则会出现错误。添加任何过滤器(例如trimlower)都可以让它重新运行。

换句话说,这些工作:

  • {% 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,这三个似乎都在那里工作 也许格拉夫有问题?有人可以指出任何可能的原因吗?

1 个答案:

答案 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