Выделенные фргаменты кода (Сниппеты)¶
Выделенный фрагмент кода (сниппет) — выделенная часть шаблона, пригодная для повторного использования. Классические примеры выделенных фрагментов кода (сниппетов) — это “шапка” и “подвал”, которые подключаются во всех шаблонах почтовых уведомлений. Выделенные фрагменты кода (сниппеты) не имеют своего контекста и переменных, контекст и переменные наследуются от шаблона, вызывающего выделенный фрагмент кода (сниппет).
Функциональность выделенных фрагментов кода (сниппетов) доступна как для шаблонов почтовых уведомлений, так и для шаблонов документов.
Пример подключения выделенного фрагмента кода (сниппета) в шаблон:
{{ snippet("header") }}
Пример подключения выделенного фрагмента кода (сниппета) в шаблон c дополнительными переменными:
{{ snippet("header", {"title": product.name}) }}
Типы выделенных фрагментов кода (сниппетов)¶
Все выделенные фрагменты кода (сниппеты) в системе разделены на типы. Это разделение позволяет разграничить доступ к выделенным фрагментам кода (сниппетам) из разных типов документов. Например, выделенные фрагменты кода (сниппеты) типа mail доступны для всех почтовых уведомлений и недоступны для документов.
Структура данных¶
Для хранения основной информации о выделенных фрагментах кода (сниппетах) используется таблица cscart_template_snippets, содержащая следующие столбцы:
| Название | Тип | Описание |
|---|---|---|
| snippet_id | id | Автоинкрементный идентификатор |
| code | varchar(128) | Символьный код |
| type | varchar(32) | Тип |
| template | text | Шаблон |
| default_template | text | Шаблон по умолчанию |
| status | char(1) | Статус |
| handler | text | Название функции-обработчика выделенного фрагмента кода (сниппета) |
| params | text | Дополнительные параметры |
| addon | varchar(32) | Идентификатор модуля-владельца выделенного фрагмента кода (сниппета). |
| updated | int | UNIX timestamp обновления |
| created | int | UNIX timestamp создания |
Название выделенного фрагмента кода (сниппета) является языкозависимым и хранится в отдельной таблице cscart_template_snippet_descriptions.
Программный интерфейс¶
Для управления и взаимодействия с выделенными фрагментами кода (сниппетами) реализованы следующие классы:
\Tygh\Template\Snippet\Snippet— модель выделенного фрагмента кода (сниппета. Является программным представлением структуры выделенного фрагмента кода (сниппета).\Tygh\Template\Snippet\Repository— репозиторий выделенных фрагментов кода (сниппетов). Класс реализует низкоуровневые методы получения/добавления/обновления/удаления выделенных фрагментов кода (сниппетов) в базе данных. Экземпляр класса доступен из контейнераTygh::$app['template.snippet.repository'].\Tygh\Template\Snippet\Service— сервис. Класс реализует более высокоуровневые методы управления выделенными фрагментами кода (сниппетами). Экземпляр класса доступен из контейнераTygh::$app['template.snippet.service'].\Tygh\Template\Snippet\Exim— класс реализует логику экспорта и импорта выделенных фрагментов кода (сниппетов). Экземпляр класса доступен из контейнераTygh::$app['template.snippet.exim'].
Схема формирования отображения выделенного фрагмента кода (сниппета)¶
- Определение типа выделенного фрагмента кода (сниппета) из контекста. Каждый контекст, в котором вызывается выделенный фрагмент кода (сниппет), знает какие выделенные фрагменты кода (сниппеты) для него доступны. Контекст на программном уровне представляет собой класс, реализующий интерфейс
ITemplate. - Получение шаблона выделенного фрагмента кода (сниппета) по типу и символьному идентификатору. Для этого используется класс
\Tygh\Template\Snippet\Repository. - Вызов пре-хука
'template_snippet_render_pre'. - Вызов шаблонизатора для формирования отображения выделенного фрагмента кода (сниппета).
- Вызов пост-хука
'template_snippet_render_post'. - Возврат результата.
Добавление выделенных фрагментов кода (сниппетов)¶
Модули могут добавлять свои выделенные фрагменты кода (сниппеты) любого типа. Предполагается, что добавление выделенных фрагментов кода (сниппетов) будет происходить в момент установки модуля, а удаление — в момент удаления модуля. Для добавления можно воспользоваться методами класса \Tygh\Template\Snippet\Service, либо воспользоваться возможностью описать выделенные фрагменты кода (сниппеты) в схеме модуля. Пример:
<?xml version="1.0"?>
<addon scheme="3.0">
<id>my_changes</id>
<snippet_templates>
<item>
<type>order_invoice</type>
<code><![CDATA[some_snippet]]></code>
<default_template><![CDATA[Content]]></default_template>
<status><![CDATA[A]]></status>
<name>
<en><![CDATA[Order invoice snippet]]></en>
</name>
<addon><![CDATA[my_changes]]></addon>
</item>
</snippet_templates>
</addon>
Расширение выделенных фрагментов кода (сниппетов)¶
Бывают ситуации, когда для формирования шаблона недостаточно визуального редактора, или он не эффективен, или же необходимы дополнительные структурированные данные.
Например, для вывода списка товаров в документе “order.invoice” необходимо выводить таблицу, которую можно легко расширять. Очевидно, что делать это в визуальном редакторе документов не очень удобно. Для решения таких проблем были добавлены соответствующие хуки, которые позволяют влиять на формирование отображения выделенных фрагментов кода (сниппетов) и расширять интерфейс на страницах редактирования выделенных фрагментов кода (сниппетов) и документов.
PHP-хуки¶
'template_snippet_render_pre'— выполняется перед формированием отображения выделенного фрагмента кода (сниппета). Этим хуком можно добавить необходимые переменные, которые впоследствии можно будет использовать в шаблоне выделенного фрагмента кода (сниппета):fn_set_hook('template_snippet_render_pre', $snippet, $context, $variable_collection)
'template_snippet_render_post'— выполняется после формирование отображения выделенного фрагмента кода (сниппета):fn_set_hook('template_snippet_render_post', $snippet, $context, $variable_collection, $result)
'template_snippet_remove_post'— выполняется после удаления выделенного фрагмента кода (сниппета):fn_set_hook('template_snippet_remove_post', $this, $snippet)
'template_snippet_save_post'— выполняется после сохранения выделенного фрагмента кода (сниппета) в базе данных:fn_set_hook('template_snippet_save_post', $this, $snippet, $lang_code)
Template-хуки¶
{hook name="snippets:tabs_extra"}{/hook}(design/backend/templates/views/snippets/update.tpl) — позволяет добавлять новые вкладки во всплывающее окно редактирования выделенного фрагмента кода (сниппета).
Шаблонизатор¶
В качестве шаблонизатора используется библиотека Twig (версия 1.24). Подключены стандартные расширения:
- Twig_Extensions_Extension_Text
- Twig_Extensions_Extension_Array
- Twig_Extension_Debug — только в режиме разработки.
Добавлены дополнительные фильтры и функции:
Фильтр date — предназначен для форматирования значения в виде даты.
Если вы используете этот фильтр, не забудьте указать формат даты. Например:
{{ o.raw.timestamp }}будет выглядеть как 1127988066 (неформатированное UNIX-время).{{ o.raw.timestamp|date("%d/%m/%Y") }}будет выглядеть как 29/09/2005 (время в понятном человеку формате).
Начиная c CS-Cart 4.6.3, не обязательно указывать формат для даты. Если вы используете фильтр без формата, например,
{{ o.raw.timestamp|date }}, то будет использован формат, выбранный на странице Настройки → Внешний вид.Вот форматы времени, которые можно выбрать в CS-Cart:
Формат даты Отображаемая дата Описание "%d/%m/%Y"29/09/2005 день/месяц/год "%d-%m-%Y"29-09-2005 день-месяц-год "%d.%m.%Y"29.09.2005 день.месяц.год "%m/%d/%Y"09/29/2005 месяц/день/год "%m-%d-%Y"09-29-2005 месяц-день-год "%m.%d.%Y"09.29.2005 месяц.день.год "%Y/%m/%d"2005/09/29 год/месяц/день "%Y-%m-%d"2005-09-29 год-месяц-день "%Y.%m.%d"2005.09.29 год.месяц.день "%b %e, %Y"Сен 29, 2005 месяц день, год "%d %b %Y"29 Сент 2005 день месяц год "%A, %B %e, %Y"Четверг, Сентябрь 29, 2005 день недели, месяц день, год "%A, %e %B %Y"Четверг, 29 сентября 2005 день недели, день месяц год Фильтр price — предназначен для форматирования значения в виде денежного типа. Например,
{{ o.raw.total }}будет выглядеть как 2334.55, а{{ o.raw.total|price }}— как 2 334.55 Р.Начиная с CS-Cart 4.6.3, вы можете использовать этот фильтр, чтобы выбрать, в какой валюте отображать цену. Например,
{{ o.raw.total|price("EUR") }}отобразит итог заказа в евро в соответствии с курсом, заданным в вашем магазине. Если для фильтра не указана валюта, то будет использоваться валюта, которая являетсяCART_PRIMARY_CURRENCY.Фильтр filesize — предназначен для форматирования значения в виде размера файла в килобайтах. Например, он используется в шаблоне электронного письма о доступе к скачиваемым товарам:
{{ file.file_size|filesize }}.Фильтр puny_decode — предназначен для декодирования URL-адресов из PunyCode в интернациональное представление. Этот фильтр можно найти в шаблонах уведомлений по электронной почте, которые содержат URL, например, в письмах о смене пароля:
{{ url|puny_decode }}.Функция __ — предназначена для вывода переводов. Например, вместо кода
{{__("change_order_status_c_text")}}в русской версии документа появится соответствующее значение языковой переменной: Ваш заказ был выполнен. Спасибо, что выбрали нас.Функция snippet — предназначена для подключения выделенных фрагментов кода (сниппетов). Например, код
{{ snippet("ship_to") }}в документе Счет добавляет в документ соответствующий выделенный фрагмент кода (сниппет) со вкладки выделенных фрагментов кода Сниппеты.Функция include_doc — предназначена для подключения документов в тело почтового уведомления. Например, в уведомлениях по электронной почте о статусах заказов есть следующая строка:
{{ include_doc("order.summary", order_info.order_id) }}.Это строка добавляет документ
order.summary(детали заказа) в тело этих почтовых уведомлений.
Подсказка
Более подробную информацию о шаблонизаторе вы можете узнать из официальной документации: http://twig.sensiolabs.org/