Как передавать данные с одного блока на другой

В системе 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-кода блока, содержащего вложенные блоки.

Последовательность исполнения файлов
при генерации html-кода блока,
содержащего вложенные блоки


Последовательность исполнения файлов


  • Дескриптор дочернего (вложенного) блока вызывается после дескриптора родительского блока.
  • Шаблон дочернего блока вызывается до шаблона родительского блока.
  • Чем выше в коде дескриптора объявляется block-данное (с помощью массива types), тем раньше вызываются соответствующие файлы (как дескриптора, так и шаблона).

Пример, иллюстрирующий последний пункт:

.tdd
# Файлы этого блока будут вызваны раньше
$types[2] = "block template('menu')";

# Номер поля не влияет на порядок вызова блоков — важен только порядок кода.
$types[1] = "block template('content')";
То есть, чтобы передавать данные с одной ветви древа блоков на другую ветвь, нужно начальный блок объявлять в дескрипторе выше.

Все, что было сказано в отношении файлов шаблонов (tpl), относится и к файлам предобработчиков шаблона (tplh). Нужно только помнить, что файл предобработчика вызывается непосредственно перед вызовом шаблона.

Хотим обратить ваше внимание, на то, что с дополнительными глобальными переменными можно работать не только в шаблонах, но и в дескрипторах. В частности, с помощью этих переменных можно управлять параметрами шаблона. Можно даже управлять параметрами самих данных.

Внимание! Речь идет только о параметрах идентификационных данных. Не следует затрагивать строки кода, в которых объявляются обычные данные (MySQL), так как это будет приводить к изменению таблиц базы данных.

Как передавать данные с блока, который вызывается позже принимающего блока?

  1. Отложенный вывод принимающего блока

    Этим способом можно передавать динамически изменяющиеся данные.

    Еще не реализован...

  2. Передача данных путем сохранения

    Динамически изменяющиеся данные в таком случае передать будет невозможно. Что касается неименных данных, то сделать это можно так.

    Допустим шаблон 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');
    

    Этим способом можно передавать не только номер блока, но и любое данное.

  3. Передача номера блока через дескриптор родительского блока

    Если оба блока имеют одного родителя, то номер вложенного блока легко определяется через родителя.

    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'];
    
  4. Определение номера блока с помощью метода Blox::getInstancesOfTpl()

    links.tpl

    $goodsBlockId = Blox::getInstancesOfTpl('goods')[0];

См. также