0

使用 Grav v1.3.8(在 PHP 5.6.30 上运行),在尝试渲染使用宏的 Twig 模板时,我当前遇到服务器错误(“isset 中的偏移类型非法或为空” )。

有趣的是,这只发生在我单独使用宏时。一旦我添加了一个过滤器,比如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条线。显然,宏工作正常,但如果输入未过滤的输出,条件将引发错误。添加任何过滤器,如trimor 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 %}

然而,在 twigfiddle 上尝试同样的事情,这三个似乎都在那里工作。
也许是 Grav 的问题?有人可以指出任何可能的原因吗?

4

1 回答 1

3

我忘记了,但是宏不返回字符串,而是返回 a 的实例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用于数组

唯一的方法是绕过这个,将编写 afilter而不是 amacro

于 2017-11-28T14:28:56.683 回答