Экстраданные — дополнительные общие данные блока ($xtitles, $xtypes)

В многозаписных шаблонах часто возникает необходимость в данных, которые относились бы ко всему блоку, а не к отдельным записям блока. Это может быть заголовок блока или различные конфигурационные настройки блока.

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

Пример: в списке вакансий каждая запись состоит из наименования вакансии и описания вакансии.
Задача — над списком вакансий поместить заголовок, а под списком указать почтовый ящик, куда отправлять резюме.

Дескриптор и шаблон будут выглядеть так:

list.tdd
<?php

$titles = [
    1 => 'Наименование',
    2 => 'Описание',
];
$types = [
    1 => 'varchar(100)',
    2 => 'text',
];
$params = [
    'multi-record' => true
];

# Экстраданные
$xtitles = [
    [1] => 'Заголовок',
    [2] => 'e-mail',
];
$xtypes = [
    [1] => 'varchar(100)',
    [2] => 'varchar(100)',
];
list.tpl
<?php

echo'
<h2>'.$xdat[1].'</h2>
<ul>';
foreach ($tab as $dat) {
    echo'
    <li>'.$dat['edit'].'        
        <h2>'.$dat[1].'</h2>
        <div>'.$dat[2].'</div>
    </li>';
}
echo'
</ul>
<a href="mailto:'.$xdat[2].'">Отправить резюме</a>';

Заголовок всей страницы можно также помещать в корневой шаблон страницы.

Работать с экстраданными нужно точно также, как и с обычными данными, только ко всем переменным нужно добавлять префикс 'x', то есть:

  • В дескрипторе (.tdd) нужно объявлять массивы: $xtitles, $xtypes, $xdefaults, $xparams, $xkeys, $xoptions, $xcaptions, $xnotes, $xwidths.

  • В шаблоне (.tpl) нужно применять массивы: $xtab, $xdat, в том числе, кнопку редактирования экстраданных: $xdat['edit'].

  • Одно ограничение — не существует многозаписных экстраданных. Если вам нужен многозаписный режим экстраданных, создайте другой многозаписный блок и передавайте данные с него.

Применение экстраданных для настройки блока

Обычно все настройки блока делаются в дескрипторе шаблона, то есть, если необходимо изменить настройки, придется редактировать tdd-файл. Однако, настроечные данные можно поместить в экстраданные, таким образом, получив возможность изменять настройки в окне редактирования.

Так как при вызове tdd-файла никакие данные еще не извлечены, то экстраданные придется извлечь из базы данных напрямую. Так как нам нужно только одна запись, лучше воспользоваться методом Dat::get().

photos.tdd

<?php
# Извлечение экстраданных
$xdat = Dat::get($blockInfo, [], 'x'); // Номер записи можно не указывать
$width  = $xdat[1] ?: 400; // Ширина фото по умолчанию - 400px
$height = $xdat[2] ?: 300; // Высота фото по умолчанию - 300px
$mode = $xdat[3] ? 'fit' : 'crop';  // Режим кадрирования фото

# Объявление основных данных
$titles = [
    1 => 'Фото'
];
$types = [
    1 => 'file thumbnail('.$mode.', '.$width.','.$height.')'
];
$params = [
    'multi-record' => true
];

# Объявление экстраданных
$xtitles = [
    1 => 'Ширина фото',
    2 => 'Высота фото',
    3 => 'Фото не обрезать',
];
$xtypes = [
    1 => 'smallint(4) unsigned not null default 400',
    2 => 'smallint(4) unsigned not null default 300',
    3 => 'tinyint(1) unsigned not null default 0',
];
См. также Применение блока для настройки других блоков.

См. также