В системе Blox CMS блоки независимы и изолированны друг от друга. Любые переменные, объявленные в блоке, действуют только в этом блоке. Как же обеспечить передачу данных от одного блока к другому при генерации страницы?
Способы передачи данных на блок другой страницы описаны в статье "Методы передачи данных с одной страницы на другую" — здесь никаких тонкостей нет.
Что касается передачи данных с одного блока на другой блок в пределах одной страницы, то самый простой способ — это воспользоваться глобальными переменными. Для того чтобы не случилось накладок с именами этих глобальных переменных переменных, рекомендуем следовать следующему правилу:
Как правило этими файлами будут шаблоны:
./templates/articles_nav.tpl
$GLOBALS['articles_nav']['current-rec'] = $dat['rec']
Во избежание накладок в старшем ключе учитывайте путь к шаблону для шаблонов в подпапках:
./templates/shop/nav.tpl
$GLOBALS['shop/nav']['current-rec'] = $dat['rec'] $GLOBALS['shop/nav']['current-rec'] = $dat['rec'] // Менее предпочтительный вариант
Если нужно, чтобы переменная была доступна в любом файле, то объявляйте ее в файле ./config.php
./config.php
$GLOBALS['config']['emails']['to'] = ['ivan@bloxcms.net'=>'Иванов Иван', 'petr@bloxcms.net'=>'Петров Петр'];
$GLOBALS['config']['emails']['from'] = 'info@bloxcms.net';
См. пример
Глобальные переменные — это самое простое решение. Более надежный вариант — это передача данных с помощью статичных методов, когда данные хранятся в приватных переменных класса, а извлекаются и записываются с помощью соответствующих методов.
В случае передачи данных с одного блока на другой блок в пределах одной страницы дело обстоит не так просто. Вы не сможете передать данные (даже в виде глобальной переменной) на шаблон, файл которого уже был вызван.
Поэтому, нужно знать последовательность, в которой вызываются файлы шаблонов.
В статье "Как генерируется страница" описывается весь процесс отображения страницы. Из этого описания можно построить блок-схему последовательности вызова дескрипторов и шаблонов при генерации html-кода блока, содержащего вложенные блоки.
# Файлы этого блока будут вызваны раньше
$types[2] = "block template('menu')";
# Номер поля не влияет на порядок вызова блоков — важен только порядок кода.
$types[1] = "block template('content')";
Все, что было сказано в отношении файлов шаблонов (tpl), относится и к файлам предобработчиков шаблона (tplh). Нужно только помнить, что файл предобработчика вызывается непосредственно перед вызовом шаблона.
Хотим обратить ваше внимание, на то, что с дополнительными глобальными переменными можно работать не только в шаблонах, но и в дескрипторах. В частности, с помощью этих переменных можно управлять параметрами шаблона. Можно даже управлять параметрами самих данных.
Внимание! Речь идет только о параметрах идентификационных данных. Не следует затрагивать строки кода, в которых объявляются обычные данные (MySQL), так как это будет приводить к изменению таблиц базы данных.
Этим способом можно передавать динамически изменяющиеся данные.
Еще не реализован...
Динамически изменяющиеся данные в таком случае передать будет невозможно. Что касается неименных данных, то сделать это можно так.
Допустим шаблон links выводится раньше шаблона goods. В первом (навигационном) шаблоне находятся ссылки pick-навигации с запросами к блоку на втором шаблоне. То есть, в первом шаблоне нужно знать номер второго блока. Чтобы сохранить номер второго блока и всегда иметь его в первом блоке, делаем следующее.
links.tdd
$xtypes[1] = int;
В навигационном шаблоне links создаем поле экстраданных для хранения номера второго (целевого) блока.
links.tpl
if (!$xdat[1])
$GLOBALS['links']['links-block-info'] = $blockInfo;
Номер целевого блока можно было бы записать и вручную в окне редактирования, но мы автоматизируем это действие. Для этого отправим второму блоку информацию о том, куда нужно сохранить нужное данное.
goods.tpl
if ($GLOBALS['links']['links-block-info'])
Dat::update($GLOBALS['links']['links-block-info'], [1=>$blockInfo['id']], [], 'x');
Этим способом можно передавать не только номер блока, но и любое данное.
wrap.tdd
$types[1] = 'block(links, new)';
$types[2] = 'block(goods, new)';
$GLOBALS['wrap']['goods-block-id'] = Dat::get($blockInfo, ['rec'=>1])[2];
links.tpl
$goodsBlockId = $GLOBALS['wrap']['goods-block-id'];
links.tpl
$goodsBlockId = Blox::getInstancesOfTpl('goods')[0];