Shopify жидкость: как я могу условно включить фрагменты в Shopify жидкость?

Я хотел бы включить фрагмент в шаблон, но только если файл фрагмента существует. Есть ли способ сделать это?

Сейчас я просто использую:

{% include 'snippetName' %}

Но это выдает ошибку:

Liquid error: Could not find asset snippets/snippetName.liquid

Причина, по которой мне нужна такая функциональность, заключается в том, что у меня есть фоновый процесс, который позже добавляет фрагмент.


person vovafeldman    schedule 02.02.2013    source источник


Ответы (6)


Сам имел эту проблему. Это было мое решение:

{% capture the_snippet_content %}{% include the_snippet %}{% endcapture %}
{% unless the_snippet_content contains "Liquid error" %}
  {% include reviews_snippet %}
{% endunless %}

В основном захватите содержимое фрагмента как переменную. Если сниппета нет, Shopify выдает ошибку:

Ошибка Liquid: не удалось найти фрагменты активов/caroline-flint-reviews.liquid.

Так что проверьте, сгенерировано ли это... если да, то не печатайте сниппет :D

Конечно, это сломается, если вы хотите, чтобы ваш фрагмент включал «Liquid error» или если Shopify когда-либо изменит сообщение об ошибке.

person Jon Heslop    schedule 26.03.2013
comment
Так полезно. Завелся, используя это, чтобы создать систему маршрутизации фрагментов, основанную на дескрипторах. - person Leland; 23.03.2017

Расширение ответа Джона;

Создайте файл с именем snippet.liquid

{% capture snippet_content %}{% include snippet %}{% endcapture %}
{% unless snippet_content contains "Liquid error" %}
  {{ snippet_content }}
{% endunless %}

Затем, когда вы хотите включить файл, только если он существует

{% include 'snippet' with 'filename_of_include' %}
person a.wmly    schedule 08.09.2016
comment
Очень аккуратная реализация. - person Carlton; 13.02.2018

Хорошо, появится здесь в 2021.

Синтаксис include устарел и редко используется, а также расширяет ответ @a.wmly, это должен быть последний синтаксис, заменяющий include на render:

{% capture snippet_content %}{% render 'your-snippet-name' %}{% endcapture %}
{% if snippet_content contains "Could not find asset" %}
    {% comment %} do nothing {% endcomment %}
{% else %}
    {% render 'your-snippet-name' %}
{% endif %}

ссылки для включения и рендеринга: https://shopify.dev/docs/themes/liquid/reference/tags/deprecated-tags#include

person Rohit Gupta    schedule 03.03.2021

В качестве альтернативы вы можете создать свой собственный тег, который проверяет существование файла перед попыткой его обработки.

https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers#create-your-own-tags

person aidan    schedule 11.07.2013
comment
Вы можете создавать свои собственные теги, если вы управляете своей жидкостью от «корней». В Shopify определены все теги, и вы не можете создавать новые. - person alexandresaiz; 28.06.2014

@vovafeldman Не знаю, почему у вас не может быть пустого фрагмента, но файла не существует.

Единственный другой вариант, который я могу придумать, это то, что, поскольку вы используете процесс BG для создания фрагмента (и я предполагаю, что загрузите его), вы всегда можете использовать API шаблона для загрузки версии шаблона, который включает фрагмент одновременно .

person meeech    schedule 03.02.2013

Использование кода, указанного выше Джоном или a.wmly, все еще приводило к ошибкам. Однако, просто написав

{% include 'snippet_name' %}

работал просто отлично.

Обратите внимание, что это работает только для файлов, расположенных в папке «snippets/». Например, шаблоны не работали с использованием этого метода.

person BGitlin    schedule 19.06.2018