Каталог товаров: пример передачи данных между блоками

Проблема передачи данных с одного блока на другой возникает при разработке страниц, состоящих из разных блоков, но выполняющих одну задачу.

В качестве исходного примера возьмем каталог товаров, описанный в другой статье. В шаблонах того примера нужно было указывать номер блока в двух других шаблонах (в переменной $goodsBlock).

Значение этой переменной становилось известным только после назначения шаблона. Такие ручные настройки нежелательны, поэтому постараемся избавиться от переменной настройки.

Корневой шаблон (шаблон страницы)

catalog_.tpl
<?php
echo "
    {$dat['edit']}
    <table>
    <tr>
        <td>$dat[1]</td>
        <td>$dat[2]</td>
    </tr>
    </table>
";
?>
catalog_.tdd
<?php

$types = [
    1 => "block('catalog_categories','new')",
    2 => "block('catalog_goods','new')",
];

?>
Так как весь комплект шаблонов представляет собой нечто целое, нужно чтобы при назначении этого шаблона, который является контейнером всех блоков каталога, эти блоки создавались автоматически. Это достигается путем указания соответствующего шаблона и опции new в объявлении block-данного.

Шаблон для категорий товара

catalog_categories.tpl
<?php

# Блок для данных о товаре
$GLOBALS['catalog_goods']  = $block + 1;
# Номер блока с шаблоном catalog_goods
# больше на единицу номера текущего блока,
# так как шаблон catalog_goods
# назначается автоматически следом.

if (empty($tab))
    return;

echo "<ul>";
foreach ($tab as $dat)
{
    echo "<li>";
    echo $dat['edit'];
    echo "<a href='?page=$page";
    echo "&block=".$GLOBALS['catalog_goods'];
    echo "&p[3]={$dat['rec']}'>";
    echo $dat[1];
    echo "</a>";
    echo "</li>";
}
echo "</ul>";
?>
catalog_categories.tdd
<?php

$titles[1] = 'Категория товара';
$types[1] = 'varchar(255)';

$params['multi-record'] = true;

?>

Шаблон для данных о товаре

catalog_goods.tpl
<?php

if (empty($tab))
    return;

echo "<table>";
foreach ($tab as $dat)
{
    echo "
    <tr>
    <td>
        {$dat['edit']}
        $dat[1]
    </td>
    <td>
        $dat[2]
    </td>
    </tr>";
}
echo "</table>";

?>
catalog_goods.tdd
<?php

$titles[1] = 'Название товара';
$titles[2] = 'Цена';

$types[1] = 'varchar(255)';
$types[2] = 'decimal(6,2)';
$types[3] = 'int';

$defaults[3] = .... код недописан ....


$params['multi-record'] = true;
$fields['hidden'] = [3];
$params['pick']['key-fields'] = [3];

?>

Объявляйте конфигурационные переменные
в том дескрипторе (tdd), который вызывается первым.

В этом случае, данные будут переданы во все шаблоны и дескрипторы комплекта. Напоминаем, что делать это лучше с помощью массива $GLOBALS.