Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
Блоки решают следующие задачи:
Блок обозначается своим названием в фигурных скобках. Блок должен быть ограничен открывающим и закрывающим тегами (закрывающий дополнительно отмечается символом «/» перед названием). Тег блока всегда должен занимать отдельную строку.
Базовый блок «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 ===