====== Как MACRO-шаблон получает данные для вывода? ======
MACRO всегде предполагает, что работает с литеральными переменными и массивами. Поэтому, если вы передаете в MACRO объекты, убедитесь, что они поддерживают интерфейсы [[http://www.php.net/~helly/php/ext/spl/interfaceArrayAccess.html|ArrayAccess]] и [[http://www.php.net/~helly/php/ext/spl/interfaceIterator.html|Iterator]] (для работы с такими тегами как %%{{list}}%%).
Для передачи данных в шаблон используются 2 подхода:
* **push** - когда данные передаются в шаблон явно из-вне. Так работают большинство шаблонизаторов.
* **pull** - когда данные шаблон получает самостоятельно при помощи какого-го вспомогательного API.
MACRO поддерживает оба этих подхода.
===== Push - подход =====
lmbMacroTemplate содержит метод **set($variable_name, $value)**, который устанавливает переменную с именем $variable_name в шаблон. Эта переменная будет доступна в шаблоне при помощи выражения {$#variable_name} или {$this->variable_name}.
Например:
$macro = new lmbMacroTemplate('page.phtml');
$macro->set('title', 'Hello');
В шаблоне для вывода 'title' будет использоваться следующее выраженияе:
{$#title}
===== Pull - подход =====
Вы также можете всегда использовать прямые PHP-вставки для того, чтобы получать данные непосредственно в MACRO-шаблоне, например:
$products = lmbActiveRecord :: find('Product'); ?>
{{list using='$products' as="$product"}}
{{list:item}}
- {$product.title}
{{list:item}}
{{/list}}
==== Данные в MACRO в контроллера Limb-based приложения ====
Если вы создаете приложение, которое работает на базе пакета WEB_APP, то стоит также отметить, что в MACRO-шаблон попадают все публичные переменные контроллера, например:
class MyController extends lmbController
{
function doDisplay()
{
$this->title = 'Hello';
}
}
В шаблоне для вывода атрибута $title конроллера можно будет использовать следующее выраженияе:
{$#title}
Передача данных из контроллера в MACRO-шаблон осуществляется автоматически через промежуточный объект класса lmbMacroView.
===== Контексты данных в MACRO и отличия от WACT-а =====
В MACRO нет контекстов данных в том смысле, какие они были в WACT-е. MACRO-шаблон после компиляции - это класс с методами, которые формируются исходя из наличия %%{{insert}}%% и прочих тегов [[template_composition|композиции шаблонов]]. Все данные в MACRO выводятся из какой-либо переменной, локальной переменной или из атрибута класса, который создался при компиляции. Поэтому в MACRO имеет смысл говорить о:
* глобальном контексте - контексте всего класса шаблона
* локальном контексте - контексте одного из методов класса шаблона.
Такие теги, как [[limb3:ru:packages:macro:tags:core_tags:insert_tag| {{insert}}]] или [[limb3:ru:packages:macro:tags:core_tags:apply_tag| {{apply}}]] позволяют передавать при помощи произвольных атрибутов данные в локальные контексты, которые создаются этими тегами.
см. также [[expressions|описание выражений]]