В многозаписных шаблонах часто возникает необходимость в данных, которые относились бы ко всему блоку, а не к отдельным записям блока. Это может быть заголовок блока или различные конфигурационные настройки блока.
В принципе, эту задачу можно решить с помощью дополнительных блоков, но для разработчика сайта удобнее воспользоваться экстраданными, так как они доступны в том же блоке в виде переменных шаблона.
Пример: в списке вакансий каждая запись состоит из наименования вакансии и описания вакансии.
Задача — над списком вакансий поместить заголовок, а под списком указать почтовый ящик, куда отправлять резюме.
Дескриптор и шаблон будут выглядеть так:
<?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)',
];
<?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',
];
См. также Применение блока для настройки других блоков.