Тэги Liquid

Материал из CartEnergy
Перейти к: навигация, поиск


Содержание

Стандартные тэги Liquid

Тэги, предоставляемые языком разметки Liquid.


Комментарии

Комментарий должен начинаться с "{% comment %}" и заканчиваться "{% endcomment %}". Все что заключено между этими тегами будет игнорироваться и не попадёт на конечную страницу. Комментарии могут быть как однострочными так и многострочными.

Привет мир. {% comment %} это однострочный комментарий {% endcomment %}
Привет мир, 
сегодня будет замечательный день. {% comment %} Это многострочный комментарий который будет игнорирован,
как и однострочный комментарий {% endcomment %}

Результатом выполнения кода будет:

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


Raw тег

Если по какой-то причине Вам необходимо использовать две фигурные кавычки {{ }} но Вы хотите чтобы этот код игнорировался Liquid то Вам необходимо использовать тег raw. {% raw %} открывающий тег, {% endraw %} закрывающий тег.

{% raw %}{{ 5 + 6 = }}{% endraw %} {{ 5 | plus: 6 }}.

Результатом выполнения кода будет:

{{ 5 + 6 = }} 11.


Include тег

Тег include позволяет вставлять один из сниппетов темы (оформления) в другой лайаут (layout), темплейт (template) или сниппет (snippet).
Тег имеет следующий синтаксис: {% include 'имя_сниппета' [with 'параметр'] [набор параметров вида имя: параметр] %}. Необязательный параметр в секции 'with' в скоде сниппета будет назван имененм сниппета.


Пример использования:

Создадим сниппет с именем color.liquid:

color: '{{ color }}'
shape: '{{ shape }}'

Создадим лайаут theme.liquid:

{% assign shape = 'circle' %}
{% include 'color' %}
{% include 'color' with 'red' %}
{% include 'color' with 'blue' shape: 'box' %}
{% assign shape = 'square' %}
{% include 'color' with 'red' %}

Результатом выполнения кода будет:

color: ''
shape: 'circle'
color: 'red'
shape: 'circle'
color: 'blue'
shape: 'box'

color: 'red'
shape: 'square'


Условия If / Else, Unless

Liquid поддерживает два оператора условия If / Else и Unless.

  • Оператор If/Elsif/Else позволяет проверить истинность условие и, в зависимости от результата, выполнить ту или иную ветку.
  • Оператор Unless, позволяет проверить ложность условия и если оно ложно выполнить ветвь.

При сравнении доступны следующие операторы:

  • == равенство
  •  != неравенство
  • <> неравенство
  • < меньше
  • > больше
  • >= больше либо равно
  • <= меньше либо равно
  • contains строка слева содержит строку справа или коллекция слева содержит элемент справа
  • and логическое И
  • or логическое ИЛИ

обратите внимание: в Liquid нет оператора отрицания.


{% if customer %}
  Привет, {{ customer.name }}
{% endif %}

{% if customer.name == 'Александр' %}
  Привет, Александр.
{% endif %}

{% if customer.name != 'Александр' %} 
  Привет не Александр.
{% endif %}

{% unless customer.name == 'Александр' %} 
  Привет не Александр.
{% endunless %}

{% if customer.name == 'Александр' or customer.name == 'Алексей' %} 
  Привет Александр или Алексей.
{% endif %}

{% if customer.name == 'Александр' %} 
  Привет Александр.
{% elsif customer.name == 'Алексей' %}
  Привет Алексей.
{% endif %}

{% if product.properties == empty %}
  Товар не имеет свойств.
{% endif %}

обратите внимание: В последнем примере empty не переменная а специальное ключевое слово, обозначающее проверку на то, что переменная (обычно это коллекция) не содержит ни одного элемента. Также определены ключевые слова nil и blank. Первое означает проверку, что переменная не определена или не существует, второе комбинацию (nil or empty).


Конструкция Case

Если Вам необходимо проверить несколько условий то можно использовать кострукцию Case.

{% case condition %} 
  {% when 1 %} 
    первое условие
  {% when 2 %} 
    второе условие
  {% else %} 
    условие которое не совпало ни с одним из предыдущих
{% endcase %} 

Пример использования:

{% case template.model_name %}
  {% when 'category' %}
     Категория {{ category.view.title }}
  {% when 'product' %}
     Товар {{ product.view.title }}
  {% else %}
     Другая страница {{ page_title }}
{% endcase %}


Чередование Cycle

Часто есть необходимость чередовать несколько значений, например цвета в таблице. Для подобных задач в Liquid есть тег cycle. Пример использования:

{% cycle 'one', 'two', 'three' %}<br /> 
{% cycle 'one', 'two', 'three' %}<br /> 
{% cycle 'one', 'two', 'three' %}<br /> 
{% cycle 'one', 'two', 'three' %} 

Результатом выполнения кода будет:

one
two
three
one

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

{% cycle 'group 1': 'one', 'two', 'three' %}<br /> 
{% cycle 'group 1': 'one', 'two', 'three' %}<br /> 
{% cycle 'group 2': 'one', 'two', 'three' %}<br /> 
{% cycle 'group 2': 'one', 'two', 'three' %} 

Результатом выполнения кода будет:

one
two 
one
two


Цикл For

Цикл применяется для обхода коллекций

  {% for item in array %} 
    {{ item }}
  {% endfor %} 

При обходе массива доступны дополнительные переменные:

 forloop.length       # => количество элементов в массиве
 forloop.index        # => номер текущей итерации 
 forloop.index0       # => номер текущей итерации (считая от нуля) 
 forloop.rindex       # => сколько элементов осталось
 forloop.rindex0      # => сколько элементов осталось (считая от нуля)
 forloop.first        # => первая итерация?
 forloop.last         # => последняя итерация? 

Можно задавать сдвиг и максимальное число элементов для обхода:

  • limit позволяет ограничить число обходимых элементов
  • offset позволяет начать обход с n-ого элемента
  # array = [1,2,3,4,5,6]
  {% for item in array limit:2 offset:2 %} 
    {{ item }}
  {% endfor %} 
  # результат выполнения 3,4 

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

  # Если item.quantity = 4...
  {% for i in (1..item.quantity) %}
    {{ i }}
  {% endfor %}
  # результат выполнения 1,2,3,4


Таблицы

Используя Liquid, можно создавать таблицы (аналогично с циклом for), при этом нужно применить тег table, обрамляющий инструкцию tablerow: Liquid позволяет создавать строки и столбцы таблиц, Вам все ровно необходимо использовать тег table который включает инструкцию tablerow.

  {% tablerow item in items cols: 3 limit: 12 %}
    {{ item.variable }}
  {% endtablerow %}

На каждой итерации цикла есть возможность определить, является ли ячейка таблицы первой или последней в ряду или же прямо узнать номер ячейки по значению дополнительных переменных, доступных при обходе таблицы:

 tablerowloop.length       # => количество элементов в цикле
 tablerowloop.index        # => номер текущей итерации 
 tablerowloop.index0       # => номер текущей итерации (считая с нуля) 
 tablerowloop.rindex       # => сколько элементов осталось
 tablerowloop.rindex0      # => сколько элементов осталось (считая  с нуля)
 tablerowloop.first        # => первый элемент?
 tablerowloop.last         # => последний элемент? 
 tablerowloop.col          # => номер колонки в текущей строчке
 tablerowloop.col0         # => номер колонки в текущей строчке (считая с нуля)
 tablerowloop.col_first    # => первая колонка в строке?
 tablerowloop.col_last     # => последняя колонка в строке?
  {% tablerow item in items cols: 3 %}
    {% if tablerowloop.col_first %}
      Первый столбец: {{ item.variable }}
    {% else %}
      Не первый стлолбец: {{ item.variable }}
    {% endif %}
  {% endtablerow %}


Использование переменных

Вы можете сохранять данные в собственных переменных, которые можно использовать для вывода информации удобным для Вас способом. Самый простой способ создания переменной это использование тега assign который имеет простой синтаксис:

{% assign name = 'freestyle' %}
{% for t in collections.tags %}
  {% if t == name %}
     <p>Freestyle!</p>
  {% endif %}
{% endfor %}

Другим способом создания переменной является назначения переменной значения true/false (истинно/ложно):

{% assign freestyle = false %}
{% for t in collections.tags %}
   {% if t == 'freestyle' %}
     {% assign freestyle = true %}
   {% endif %}
{% endfor %}

{% if freestyle %}
  <p>Freestyle!</p>
{% endif %}

Если вы хотите объединить несколько строк в одну строку и сохранить ее как переменную Вам необходимо использовать тег capture.
Примеры использования:

  {% capture attribute_name %}
    {{ item.title | handleize }}-{{ i }}-color
  {% endcapture %}

  <label for="{{ attribute_name }}">Color:</label>
  <select name="attributes[{{ attribute_name }}]" id="{{ attribute_name }}">
    <option value="red">Red</option>
    <option value="green">Green</option>
    <option value="blue">Blue</option>
  </select>

обратите внимание: тэги assign и capture определяют так называемые глобальные переменные, эти переменные доступны в пределах всего шаблона. Локальные переменные (определяемые некоторыми тэгами, например, тэгом for) доступны только в пределах блока, в котором были определены.


Дополнительные тэги

Тэги, дополнительно реализованные в системе CartEnergy. Не входят в стандартный набор тэгов Liquid.

Cache

cache on NUM (minute|minutes|hour|hours|day|days) [k1:v1 k2:v2 ... kn:vn]

Выполняет кэширование заданного фрагмента. В качестве обязательного параметра выступает время кэширования (в минутах - minute, часах - hour или днях - day). В качестве необязательных параметров тэга, выступают параметры для формирования ключа кэширования.


Пример использования:

{% cache on 1.hour %}
Этот фрагмент закэширован на один час.
{% endcache %}
Этот фрагмент не закэширован.
{% cache on 20 minutes locale:locale %}
Закэшированное на 20 минут локализованное название товара {{ product.view.title }}
{% endcache %}

Результат:

Этот фрагмент закэширован на один час.
Этот фрагмент не закэширован.
Закэшированное на 20 минут локализованное название товара Мой товар


IncludeTemplate

include_template

Указывает точку, куда в лэйоут необходимо включить шаблон.


Paginate

paginate COLLECTION by PAGE_SIZE [[assign] to RESULT_VARIABLE]

Разбивает коллекцию на страницы. В качестве параметров принимает коллекцию, размер страницы и опциональную переменную, куда необходимо записать результат. Если присутствует модификатор assign создаётся глобальная, иначе локальная переменная. Если последний параметр не переопределяется переменная с коллекцией.

Пример использования:

{% paginate products by 3 %}
Товары на первой странице:
{% for product in products[1] %}
{{ product.view.title }}
{% endfor %}
Товары на второй странице:
{% for product in products[2] %}
{{ product.view.title }}
{% endfor %}
Товары на последней странице:
{% for product in products[-1] %}
{{ product.view.title }}
{% endfor %}

Результат:

Товары на первой странице:
Товар 1
Товар 2
Товар 3
Товары на второй странице:
Товар 4
Товар 5
Товар 6
Товары на последней странице:
Товар 20
Товар 21


Convert

convert OPERAND, OPERAND, ..., OPERAND to [integer|float|string] [collection [of COUNT rows|columns]] [[assign to] RESULT_VARIABLE]

Выполняет преобразования данных.

Пример использования:

{% convert 1, 2, 3, 4, 5 to string array str_ary %}
Массив строк: {{ str_ary | join: ',' }}
{% convert '3' to float num %}
Результат - {% if num == 3.0 %}число{% else %}строка{% end %}.
{% convert str_ary to collection of 2 columns groups %}
Группировка по столбцам:
{% for grp in groups  %}
{{ grp | join: ',' }}
{% endfor %}
{% convert str_ary to collection of 2 rows groups %}
Группировка по строкам:
{% for grp in groups  %}
{{ grp | join: ',' }}
{% endfor %}

Результат:

Массив строк: 1,2,3,4,5
Результат - число.
Группировка по столбцам:
1,2
3,4
5
Группировка по строкам:
1,2,3
4,5


Select

select [and assign] [first|all] RESULT_VARIABLE from COLLECTION where CONDITIONS 

Выполняет выборку данных. Поле CONDITIONS содержит одно или несколько условий в модифицированном формате условий SQL, вида:

"RESULT_VARIABLE.attribute" operator value

Где operator может быть один из =, ==, !=, <>, >, <, >=, <=, in, is null, is not null. Условия разделяются логическими операторами and и or. Поддерживаются скобки.


Пример использования:

{% assign products_order = 'priority' %}
{% select products from channel.products where action.category in "products.categories" and "products.active?" = true order:products_order order:'id'  %}
{% for product in products %}
{{ product.view.title }}
{% endfor %}

Результат:

Товар 1
Товар 2
...
Товар n

обратите внимание: при использование тэга select следует учитывать, что если указанный в условии атрибут, переменная или оператор неверны, всё условие не будет выполнятся.