Не удается получить доступ к глобальным данным или макросу внутри макроса - PullRequest
0 голосов
/ 25 февраля 2020

Я довольно новичок в patternlab и просто переношу свой проект на основе php на версию узла. У меня проблемы с доступом к глобальным данным и блокировкам в файле блоков, которых у меня не было ранее.

Я использую Pattern Lab Node v3.0 на Mac, с Node v13.9.0, используя Gulp Издание с Twig.

source/_data/data.json

"img": {
    "landscape": {
      "w_1024": {
        "src": "../../images/1536x864_16x9.jpg",
        "alt": "16x9 Image"
      }
    }
  }

source/macros/ui.twig

{% macro icon( name ) %}
  {% if name == "airplay" %}<img src="airplay.png"/>{% endif %}
{% endmacro %}

source/02-organisms/00-global/file-1.twig

{% import "@macros/blocks.twig" as blocks %}
{% import "@macros/ui.twig" as ui %}
<p class="icon">{{ ui.icon( "airplay" ) }}</p>
<p class="output">{{img.landscape.w_1024.src}}</p>
{{ blocks.media(item) }}

source/macros/blocks.twig

{% import "@macros/ui.twig" as ui %}
{% macro media( params ) %}
<p class="icon2">{{ ui.icon( "airplay" ) }}</p>
<p class="output2">{{img.landscape.w_1024.src}}</p>
{% endmacro %}
Ожидаемое поведение

Сгенерировано html должно выглядеть следующим образом:

<p class="icon"><img src="airplay.png"/></p>
<p class="output">../../images/1536x864_16x9.jpg</p>
<p class="icon2"><img src="airplay.png"/></p>
<p class="output2">../../images/1536x864_16x9.jpg</p>
Фактическое поведение

Сгенерировано html выглядит следующим образом:

<p class="icon"><img src="airplay.png"/></p>
<p class="output">../../images/1536x864_16x9.jpg</p>
<p class="icon2"></p>
<p class="output2"></p>

Любая помощь приветствуется!

1 Ответ

1 голос
/ 25 февраля 2020

Макросы имеют собственную переменную область видимости. Если вы хотите получить доступ к любым другим определенным переменным, вам нужно передать специальную переменную _context.

{% macro foo(bar, context) %}
    {{ bar }}
    {{ context['foo'] }}
{% endmacro %}

{% import _self as macros %}

{{ macros.foo(42, _context) }}

demo - demo с include

...