Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
Блоки решают следующие задачи:
Блок обозначается своим названием в фигурных скобках. Блок должен быть ограничен открывающим и закрывающим тегами (закрывающий дополнительно отмечается символом «/» перед названием). Тег блока всегда должен занимать отдельную строку.
Базовый блок «BASE» удалять нельзя!
Он присутствует во всех шаблонах форм:
{BASE append}
...
{/BASE}
Все остальные блоки создаются внутри базового блока. Для обращения к блокам внутри другого блока используется наследование. Запись уровней идет через “точку”: от “родительского” элемента к “дочернему” элементу.
BASE.MYBLCOCK.myField
1 уровень
2 уровень
3 уровеньВажно! При несоблюдении иерархии блоков встроенный шаблонизатор корректно работать не будет!
Пример: Добавим block с именем STAMP на форме
Шаблон:
{STAMP}
<img src="$photo"/>
{/STAMP}
Так так блоки по умолчанию скрыты, то пропишем в методе onPlay() условие появления данного блока на странице у пользователя.
Для этого используется метод block():
PHP-сценарий:
if($this->structure->stamp == 1){
$this->page->block("BASE.STAMP");
}Данный блок будет выводиться на форме только в том случае, если в поле «stamp» текущего объекта будет храниться значение «1» (BOOL, checkbox).
Для передачи значения в переменную блока используется метод set():
$this->page->set(["BASE.STAMP.photo" => $this->structure->organization->photo->path]);
Система найдет на форме блок «BASE.STAMP» и присвоит переменной $photo новое значение (URL фотографии из справочника «Организации»).
Результат:

Можно передавать сразу несколько переменных в форму в массиве:
$this->page->set([
"BASE.total" => Text::money($this->structure->total),
"BASE.nds" => Text::money($this->structure->nds),
"BASE.invoiceSum" => $invoiceSum,
"BASE.paymentSum" => $paymentSum,
"BASE.debtSum" => $debtSum,
"BASE.color" => $color
]);Система также позволяет также выводить блоки и сразу передавать в них значения. В этом случае используется метод block():
$this->page->block("BASE.ALERT", ["text" => "Внимание: У контрагента есть скидки!"]);В данном случае переменные на форме должны быть выделены двумя знаками доллар ($):
{ALERT}
<script>
showAlert('$text$',"error", 0);
</script>
{/ALERT}Один и тот же блок можно вызывать несколько раз. Например, для отображения табличной части документа Счет в печатной форме:
$this->page->block("BASE.PRODUCT", [
"num" => ($num + 1),
"name" => $product->name,
"article" => $product->product->article,
"unit" => $product->product->units->name,
"number" => $product->number,
"price" => Text::money($product->price_nds),
"sum" => Text::money($price),
"no_discount" => $no_discount
]);Блоки можно также использовать для подгрузки JS-кода на страницу при определенном событии согласно бизнес-логике, а также для передачи параметров в функции JS:
{SUPPLIER_ORDER}
<script>
showAlert("<b>Товар успешно отправлен в закупку!</b>");
document.location.href = "/companies/$data.owner.value/orders/$data.id.value/";
</script>
{/SUPPLIER_ORDER}Блоки могут быть вложены друг в друга. Имена блоков и переменных в нем при этом становятся иерархическими (иерархия отображает вложенность блоков). Для разделения используется точка (.)
Например, выведем название отделов и список сотрудников (каждого отдела):
{DEPARTMENT}
$name
{EMPLOYEE}
$name
{/EMPLOYEE}
{/DEPARTMENT}У каждого блока свое пространство имен.
При вызове блока-наследника, он помещается в родительский блок, вызванный последним. Обратите внимание на адрес вложенных блоков:
$this->page->block("DEPARTMENT", ["name" => "Отдел продаж:"]);
$this->page->block("DEPARTMENT.EMPLOYEE", ["name" => "Виктория"]);
$this->page->block("DEPARTMENT.EMPLOYEE", ["name" => "Оксана"]);
$this->page->block("DEPARTMENT", ["name" => "IT отдел:"]);
$this->page->block("DEPARTMENT.EMPLOYEE", ["name" => "Василий"]);Результат:
Список сотрудников Отдел продаж: Виктория Оксана IT отдел: Василий
Блок может иметь один или несколько флагов. Флаги модифицируют поведение блока и/или его внутренние элементы. Флаги указываются через пробел после названия блока в открывающем теге. В закрывающем теге флаги не указываются.
Эти флаги модифицируют отображение блока. Блок, отмеченный флагом show, отображается всегда. Такие блоки используются исключительно для внутренней структуризации документа.
Text 1
{BLOCK show}
Text 2
{/BLOCK}В этом случае на экране выведется:
Text 1 Text 2
Флаг invert работает по тому же принципе, однако вызов метода block для него скроет блок (другими словами, вызовет обратное относительно обычного блока, поведение.
Блоки с такими флагами не являются полноценными блоками. Они могут задаваться только после одноименного блока без флага и просто добавляют к нему HTML-код: в начало (prepend) или в конец (append) блока.
Добавленный код считается полноценной частью исходного блока.
Текст письма:
{LETTER}
Поздравляем, вы допущены до участия в нашем проекте.
{/LETTER}
{LETTER prepend}
Многоуважаемый $name!
{/LETTER}
{LETTER append}
Желаем удачи!
{/LETTER}
PHP:
$this->page->block("LETTER", ["name" => "Сергей"]);Результат:
Текст письма: Многоуважаемый Сергей! Поздравляем, вы допущены до участия в нашем проекте. Желаем удачи!
Обратите внимание на порядок строк в итоговом тексте письма.
По умолчанию, порядок отображения различных блоков определяется их следованием в тексте.
{HEADS}
Орел!
{/HEADS}
{TAILS}
Решка!
{/TAILS}PHP-сценарий:
$this->page->block("HEADS");
$this->page->block("TAILS");
$this->page->block("TAILS");
$this->page->block("HEADS");Выведет следующий результат вне зависимости от порядка обращений к методу block():
Орел! Орел! Решка! Решка!
Это не всегда удобно (например, при отображение активных и неактивных пунктов меню). Чтобы изменить это поведение, необходимо поместить блоки в родительский блок с флагом reorderable.
Блоки, вложенные в reorderable, отображаются в порядке вызова.
{FLIPS reorderable}
{HEADS}
Орел!
{/HEADS}
{TAILS}
Решка!
{/TAILS}
{/FLIPS}Тот же PHP-сценарий:
$this->page->block("FLIPS.HEADS");
$this->page->block("FLIPS.TAILS");
$this->page->block("FLIPS.TAILS");
$this->page->block("FLIPS.HEADS");Вывод теперь отражает порядок вызова блоков:
Орел! Решка! Решка! Орел!
Статический блок — это шаблон внутри шаблона. Он недоступен для метода block, однако может быть вызван из любого места текущего шаблона с использованием синтаксиса: названия блока, заключенного в двойные квадратные скобки:
[[SEPARATOR]]
Пример шаблона:
Позиция 1
Позиция 2
[[SEPARATOR]]
Позиция 3
{SEPARATOR static}
===
{/SEPARATOR}Результат:
Позиция 1 Позиция 2 === Позиция 3
В статический блок можно передавать параметры. Параметры отделяются символом «|» и вводятся в порядке {КЛЮЧ}:{ЗНАЧЕНИЕ}. Внутри статического блока параметры обозначаются символом «#» со следующим за ним названием параметра. Названия параметров могут содержать только буквы.
{ITEM static}
Название: #name
Цена: #price руб.
{/ITEM}
[[ITEM | name: Пылесос Koshiba | price: 10 000]]
[[ITEM | name: Видеокамера Hamsung | price: 55 700]]Результат:
Название: Пылесос Koshiba Цена: 10 000 руб. Название: Видеокамера Hamsung Цена: 55 700 руб.
Можно задавать переменным значение по умолчанию. Для обычных переменных оно заключается в символы «~» сразу после название переменной. Для переменной препарсинга — в символы «*».
Пример шаблона:
{BLOCK}
Значение — $value~не определено~.
{/BLOCK}
{STATIC_BLOCK static}
Название: #name*неизвестно*.
{/STATIC_BLOCK}
[[STATIC_BLOCK | name: Песня про зайцев]]
[[STATIC_BLOCK]]PHP:
$this->page->block("BLOCK");
$this->page->block("BLOCK", ["value" => "42"]);Результат:
Значение — не определено. Значение — 42. Название: Песня про зайцев. Название: неизвестно.
Для переменных можно также указывать шаблон, в который подставляется значение переменной, в случае, если оно задано (не пусто) и является или может быть преобразовано к истине. Шаблон указывается сразу после названия переменной, заключается в символы «^^». Место в шаблоне, куда необходимо подставить переменную, обозначается символом «%».
Пример шаблона:
{ITEM}
Название: $name
$frequency^Частота: %GHz^
$size^Размер: %Gb^
===
{/ITEM}PHP:
$this->page->block("ITEM", ["name" => "Intel Core i7", "freq" => "3.40"]);
$this->page->block("ITEM", ["name" => "Seagate ST500", "size" => "500"]);Результат:
Название: Intel Core i7 Частота: 3.40GHz === Название: Seagate ST500 Размер: 500Gb ===