Версия: 3.x
Дополнения к Smarty

Общие сведения

Обращение к шаблонизатору в ReadyScript происходит через класс RS::View::Engine, который является прямым наследником класса известного шаблонизатора Smarty 3. В конструкторе RS::View::Engine происходит установка стандартных директорий для поиска шаблонов, скомпилированных файлов, а также происходит передача часто используемых переменных в шаблон.

  • Setup - ассоциативный массив значений статических свойств из класса
  • app - объект параметров страницы RS::Application::Application
  • router - объект менеджера маршрутов RS::Router::Manager
  • CONFIG - объект настроек текущего сайта Site::Model::Orm::Config
  • CMS_CONFIG - объект настроек системы RS::Config::Cms
  • SITE - объект текущего сайта Site::Model::Orm::Site
  • THEME_CSS - строка, путь к папке с CSS файлами текущей темы
  • THEME_JS - строка, путь к папке с JS файлами текущей темы
  • THEME_IMG - строка, путь к папке с изображениями текущей темы
  • THEME_SHADE - строка, идентификатор цветовой схемы текущей темы оформления

Помимо этого, функционал шаблонизатора расширяется с помощью плагинов ReadyScript. Персональные плагины ReadyScript располагаются в папке /core/smarty/rsplugins. Рассмотрим эти плагины подробнее.

Ресурсы

RS

Ресурс отвечает за загрузку шаблона из хранилища. В ReadyScript добавлен собственный ресурс, который установлен как ресурс по-умолчанию. Ресурс RS расширяет допустимый синтаксис пути к шаблону:

В пути к шаблону можно использовать следующие включения:

  • %THEME% - будет заменен на путь к папке текущего шаблона. Например: %THEME%/layout.tpl, будет ссылаться на /templates/default/layput.tpl, если текущий шаблон - default.
  • %ИМЯ_МОДУЛЯ% или module:ИМЯ_МОДУЛЯ - будет заменен на путь к папке шаблонов соответствующего модуля. Например: %catalog%/product.tpl или module:catalog/product.tpl, будет ссылаться на /modules/catalog/view/product.tpl
  • %SYSTEM% - будет ссылаться на папку с системными шаблонами. Например: system%/admin/body.tpl, будет ссылаться на /templates/system/admin/body.tpl
  • theme:ИМЯ_ТЕМЫ_ОФОРМЛЕНИЯ - будет ссылаться на папку заданной темы оформления. Например: theme:default/layout.tpl, будет ссылаться всегда на /templates/default/layput.tpl
1 {extends file="%THEME%/body.tpl"} {* Подключит файл /templates/ТЕКУЩАЯ ТЕМА/body.tpl *}
2 {block name="content"}
3  {include file="theme:default/content.tpl"} {* подключит шаблон /templates/default/content.tpl *}
4 {/block}

Блоки

{t}...{/t}

Отображает фразу, находящуюся внутри блока на текущем языке системы. Вызывает системную функцию t() для перевода.

Зарезервированные параметры:

  • alias - необязательный, идентификатор фразы. Используется, если внутри блока объемный текст Остальные параметры используются для подстановки в фразу.

Пример:

{t}Фраза на русском языке{/t}
{t key="35"}Успешно выполнено %key операций{/t}
{t key="35" time="5"}Успешно выполнено %key операций за %time{/t}
{t alias="bigtext"}Очень объемный текст с множеством переносов строк и.т.д.{/t}
{t years="1"}Артему %years [plural:%years:год|года|лет]{/t}
{t years="2"}Артему %years [plural:%years:год|года|лет]{/t}
{t years="5"}Артему %years [plural:%years:год|года|лет]{/t}
{t}открыть^my_module_context{/t}

{hook}...{/hook}

Объявляет обернутую зону хуком. Позволяет сторонним модулям добавлять собственный HTML до, после или вместо обернутого HTML-кода. Подробнее об использовании хуков написано здесь.

Параметр Тип Назначение Обязательный Значение по-умолчанию
name string идентификатор хука Да
title string описание хука Нет

Пример:

1 <div class="product">
2  {hook name="catalog-product:images" title="Карточка товара:изображения"}
3  <div class="images">
4  ....
5  </div>
6  {/hook}
7  {hook name="catalog-product:rating" title="Карточка товара:рейтинг"}
8  <div class="rating">
9  ...
10  </div>
11  {/hook}
12 </div

Функции

addcss

Подключает CSS файл добавлением тега <link type="text/css" href=""> секцию <HEAD>. Вызывает метод RS::Application::Application::addCss.

Параметр Тип Назначение Обязательный Значение по-умолчанию
file string имя файла Да
name string символьный идентификатор файла Нет равно имени файла
basepath string базовый путь для поиска файла. Возможные значения
  • theme - для поиска в папке /templates/ИМЯ_ТЕМЫ_ОФОРМЛЕНИЯ/resource/css
  • common - для поиска в папке /resource/css
  • root - не дописывает ничего перед именем файла, переданным в параметре file.
Нет theme
no_compress bool если true, то недопускает объединение и сжатие данного файла Нет false
type string подставляется в атрибут type тега link Нет text/css
media string подставляется в атрибут media тега link Нет all
rel string подставляется в атрибут rel тега link Нет stylesheet
before string произвольный текст, подставляется до тега link. Обычно используется для CSS-хаков. Нет
after string произвольный текст, подставляется после тега link. Обычно используется для CSS-хаков. Нет

Пример:

1 {* Добавит в секцию <HEAD> тег <link type="text/css" href="/templates/ИМЯ_ТЕКУЩЕЙ_ТЕМЫ/resource/css/style.css" media="all" rel="stylesheet"> *}
2 {addcss file="style.css"}
3 
4 {* Добавит в секцию <HEAD> тег <link type="application/rss+xml" href="/rss-news/" media="all" rel="alternate"> *}
5 {addcss file="/rss-news/" basepath="root" rel="alternate" type="application/rss+xml"}
6 
7 {* Добавит в секцию <HEAD> конструкцию *}
8 {addcss file="960gs/960_orig.css" before="<!--[if lte IE 8]>" after="<![endif]-->"}

addjs

Подключает JS файл добавлением тега <script type="text/javascript" src=""> секцию <HEAD> Вызывает метод RS::Application::Application::addJs.

Параметр Тип Назначение Обязательный Значение по-умолчанию
file string имя файла Да
name string символьный идентификатор файла Нет равно имени файла
basepath string базовый путь для поиска файла. Возможные значения
  • theme - для поиска в папке /templates/ИМЯ_ТЕМЫ_ОФОРМЛЕНИЯ/resource/css
  • common - для поиска в папке /resource/css
  • root - не дописывает ничего перед именем файла, переданным в параметре file.
Нет theme
no_compress bool если true, то недопускает объединение и сжатие данного файла Нет false
type string подставляется в атрибут type тега link Нет text/javascript
before string произвольный текст, подставляется до тега link. Нет null
after string произвольный текст, подставляется после тега link. Нет null
unshift bool устанавливает файл первым в списке Нет null
header bool принудительно задает зону размещения скриптов в секции head нет null
footer bool принудительно задает зону размещения скриптов перед закрывающим тегом body нет null

Пример:

1 {* Добавит в зону по-умолчанию тег <script type="text/javascript" src="/templates/ИМЯ_ТЕКУЩЕЙ_ТЕМЫ/resource/js/html5shiv.js"></script> *}
2 {addjs file="html5shiv.js"}
3 
4 {* Установит в секцию HEAD тег <script type="text/javascript" src="/resource/js/jquery.min.js"></script> первым в списке *}
5 {addjs file="jquery.min.js" name="jquery" basepath="common" unshift=true header=true}
6 
7 {* Добавит в конце тела документа тег <script type="text/javascript" src="/resource/js/jquery.deftext.js"></script> *}
8 {addjs file="jquery.deftext.js" basepath="common" footer=true}

addmeta

Добавляет META-тег в секцию <HEAD>. Вызывает метод RS::Application::Meta::add.

Параметр Тип Назначение Обязательный Значение по-умолчанию
key string внутренний идентификатор meta тега Нет null

Добавляет все остальные атрибуты к тегу <meta> соответственно.

Пример:

1 {* Добавит в секцию HEAD тег <meta name="viewport" content="width=device-width, initial-scale=1.0" > *}
2 {addmeta name="viewport" content="width=device-width, initial-scale=1.0"}

adminurl

Вставляет в шаблон путь к требуемому разделу административной части. Обычно используется в шаблонах административного раздела. Вызывает метод RS::Router::Manager::getAdminUrl.

Параметр Тип Назначение Обязательный Значение по-умолчанию
do string или false Действие контроллера. Если не задан, то параметр подставляется из текущего URL Нет
mod_controller string Сокращенное имя контроллера. Если не задан, то параметр подставляется из текущего URL Нет

Все остальные атрибуты добавляются в виде параметров к URL.

Пример:

{* Вернет URL: /admin/article-ctrl/ *}
{adminUrl do=false mod_controller="article-ctrl"}
{* Вернет URL: /admin/article-ctrl/add/ *}
{adminUrl do="add" mod_controller="article-ctrl"}
{* Если текущий URI:/admin/article-ctrl/, вернет URL: /admin/article-ctrl/edit/?id=123 *}
{adminUrl do="edit" id=123}
{* Если текущий URI:/admin/article-ctrl/, вернет URL: /admin/article-ctrl/?param1=value1 *}
{adminUrl param1="value1"}
{* Если текущий путь /admin/article-ctrl/edit/?id=35, вернет URL: /admin/article-ctrl/edit/ *}
{adminUrl}

csrf

Вставляет в шаблон <input type="hidden" name="csrf_protection" > код защиты от CSRF атак. В контроллере должна быть предусмотрена проверка данного кода методом RS::Http::Request::checkCsrf

Параметр Тип Назначение Обязательный Значение по-умолчанию
form string Имя формы Нет

Пример:

<form method="POST">
{csrf}
<input type="text" name="title">
<input type="submit" value="Отправить">
</form>

moduleinsert

Вставляет блок-контролер в шаблон.

Параметр Тип Назначение Обязательный Значение по-умолчанию
name string Имя класса блок-контроллера Да
var string Переменная шаблона, в которую будут записаны переменные блока Нет

Остальные атрибуты поступают в качестве параметров блок-контроллеру соответственно.

Пример:

{* Вставляет в шаблон блок Меню, в котором будут отображаться дочерние элементы от элемента с символьным идентификатором footmenu*}
{moduleinsert name="\Menu\Controller\Block\Menu" root="footmenu"}
{* Вставляет в шаблон блок Список категорий *}
{moduleinsert name="\Catalog\Controller\Block\Category"}
{* Вставляет в шаблон баннерную зону left, с нестандартным шаблоном *}
{moduleinsert name="\Banners\Controller\Block\BannerZone" zone="left" indexTemplate="blocks/bannerzone/left.tpl"}
{* Пулучаем в переменную HTML блока и отображаем его по условию *}
{$content={moduleinsert name="\Catalog\Controller\Block\Category" var="block_vars"}}
{if $block_vars.dirlist}
{$content} {* Показываем блок со списком категорий, только если такие категории есть *}
{/if}

modulegetvars

Запускает блок-контроллер, и возвращает все переменные, которые должны были пойти в шаблон блок-контроллера.

Параметр Тип Назначение Обязательный Значение по-умолчанию
name string Класс блок-контроллераДа
var string Переменная шаблона, в которую будут записаны переменные блока Да

Остальные атрибуты поступают в качестве параметров блок-контроллеру соответственно.

Пример:

{* Возьмет все подготовленные для шаблона переменные из блок-контроллера Article\Controller\Block\Article и запишет их в переменную $article*}
{modulegetvars name="\Article\Controller\Block\Article" article_id=9 var="article"}
{$article.article.short_content}

split_list

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

Параметр Тип Назначение Обязательный Значение по-умолчанию
item array Исходный массив объектов Да
var string Переменная шаблона, в которую будет записаны переменные блока Да
incols string Количество колонок, если указано одно число. Количество элементов, от которого будет появляться колонка через запятую Нет 0,11,21. Если элементов будет менее 11, то будет 1 колонка. Если элементов будет от 11 до 21, то будет 2 колонки. Если элементов будет более 21, то будет 3 колонки
horizontal bool Принцип распределения элементов по колонкам. Если присутствует, то горизонтально, иначе - вертикально Нет null

Пример:

{assign var=source_array value=['one', 'two', 'three', 'four', 'five', 'six', 'seven']}
{split_list item=$source_array var=result incols="2"}
{print_r($result)}
{*
Результат: 4 строки, 2 колонки:
Array (
[0] => Array (
[0] => one
[1] => five )
[1] => Array (
[0] => two
[1] => six )
[2] => Array (
[0] => three
[1] => seven )
[3] => Array (
[0] => four
[1] => )
)
*}
{* Используется в таблице следующим образом *}
<table border="1">
{foreach from=$result item=row}
<tr>
{foreach from=$row item=col}
<td>{$col}&nbsp;</td>
{/foreach}
</tr>
{/foreach}
</table>
{* Горизонтальное расположение элементов *}
{split_list item=$source_array var=result incols="2" horizontal=true}
{print_r($result)}
{*
Результат: 4 строки, 2 колонки:
Array (
[1] => Array (
[0] => one
[1] => two )
[2] => Array (
[0] => three
[1] => four )
[3] => Array (
[0] => five
[1] => six )
[4] => Array (
[0] => seven
[1] => )
)
*}
{assign var=source_array value=['one', 'two', 'three', 'four', 'five', 'six', 'seven']}
{* от 0 до 4 элементов - 1 колонка
от 4 до 7 элементов - 2 колонки
от 7 и выше - 3 колонки
так как у нас - 7 элементов, то формируется 3 колонки
*}
{split_list item=$source_array var=result incols="0,4,7"}
{print_r($result)}
{*
Результат: 3 строки, 3 колонки:
Array (
[0] => Array (
[0] => one
[1] => four
[2] => seven )
[1] => Array (
[0] => two
[1] => five
[2] => )
[2] => Array (
[0] => three
[1] => six
[2] => )
)
*}

static_call

Выполняет любую функцию в системе.

Параметр Тип Назначение Обязательный Значение по-умолчанию
callback callback Функция, которую необходимо вызвать Да
var string Переменная шаблона, в которую будет записан разультат выполнения функции Да
params array Параметры, которые необходимо передать в качестве аргументов в функцию Нет

Пример:

{static_call var=result callback=date params=['Y-m-d']}
{$result} {* 2014-01-05 *}
{static_call var=result callback=['\Catalog\Model\DirApi', 'staticSelectList']}
{$result} {* Array *}

urlmake

Возвращает URL, составленный с учетом изменений текущего. Для построения нового URL используется текущий маршрут, поэтому переменная будет подставлена с учетом маски маршрута. Вызывает метод RS::Http::Request::replaceKey.

Параметр Тип Назначение Обязательный Значение по-умолчанию
__searchkey string Переменные, которые должны остаться в итоговом URL. Указываются через запятую Нет
__prefix string Префикс, который будет приписан ко всем новым именам переменных слева Нет

Остальные параметры используются для добавления/изменения их в URL.

Пример:

{* Если маска текущего маршрута: /catalog/{category_id}/
И текущий URL: /catalog/notebooks/,
то итоговый URL будет: /catalog/smartphones/?filter[key1]=value1&filter[key2]=value2
*}
{urlmake category_id="smartphones" filter=['key1' => 'value1', 'key2' => 'value2']}
{* Если маска текущего маршрута: /catalog/{category_id}/
И текущий URL: /catalog/smartphones/?filter[key1]=value1&filter[key2]=value2,
то итоговый URL будет: /catalog/new/
Атрибут, который равен false, означает что необходимо убрать данный параметр из URL
*}
{urlmake category_id="new" filter=false}
{* Если маска текущего маршрута: /catalog/{category_id}/
И текущий URL: /catalog/smartphones/?filter[key1]=value1&filter[key2]=value2,
то итоговый URL будет: /catalog/smartphones/?filter[key1]=value1&filter[key2]=value2&foo=bar
*}
{urlmake foo=bar}
{* Если маска текущего маршрута: /catalog/{category_id}/
И текущий URL: /catalog/smartphones/?key1=value1&key2=value2&key3=value3
то итоговый URL будет: /catalog/smartphones/?key1=value1
*}
{urlmake __searchkey="category_id,key1"}
{* Вернет текущий URL без изменений *}
{urlmake}

verb

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

Параметр Тип Назначение Обязательный Значение по-умолчанию
item integer Число Да
values string 3 формы слова, через запятую, которые должны использоваться в количестве 1,2,5. Например:год,года,лет. Да
onlyword bool Возвращать только слово. Если не задано, то перед словом будет располагаться цифра Нет null

Пример:

{* Результат: 1 сообщение *}
{verb item=1 values="сообщение,сообщения,сообщений"}
{* Результат: 2 сообщения *}
{verb item=2 values="сообщение,сообщения,сообщений"}
{* Результат: 5 сообщений *}
{verb item=5 values="сообщение,сообщения,сообщений"}

Модификаторы

devnull

Всегда возвращает null. Удобно использовать для подавления результата выполнения функций.

Пример:

{* Произойдет вызов функции, однако никакого результата выведено не будет *}
{$product->fillProperty()|devnull}

substr

Возвращает часть строки. Вызывает функцию mb_substr.

Параметры:

ПараметрТип Назначение Обязательный Значение по-умолчанию
1 integer Начальная позиция в строке Да
2 integer Длина Да

Пример:

{assign var=str value="Съешь еще этих мягких французских булок"}
{$str|substr:6:9}

teaser

Обрезает текст до нужного количества символов. Текст обрезается по словам.

Параметры:

Параметр Тип Назначение Обязательный Значение по-умолчанию
1 integer Длина Да
2 bool Если false, то HTML теги будут вырезаны, иначе - нет Нет false

Пример:

{* Результат: Съешь еще... *}
{assign var=str value="Съешь еще этих мягких французских булок"}
{$str|teaser:10}