Дескриптор — это обычный php-скрипт, который вызывается до извлечения данных из базы данных и подстановки этих данных в шаблон. Именно в этом файле задаются параметры выборки данных из базы данных. По этой причине через дескриптор можно программно управлять выборкой данных.
С другой стороны, в массиве $types дескриптора задается структура базы данных. И любые изменения этого массива вызовут изменения и в базе данных. Поэтому, программное изменение массива $types является крайне нежелательным! Оно будет к тому же и бесполезным, потому что любые изменения в массиве $types вступают в силу только в режиме администратора.
Эти обстоятельства, делают использование самого дескриптора в качестве конфигурационного и управляющего файла не очень удобным. Для этих целей лучше подойдет предобработчик дескриптора.
Предобработчики пишутся на языке PHP.
Файл скрипта должен иметь расширение .tddh и имя, совпадающее с именем шаблона.
Как и в самом дескрипторе, в обработчике дескриптора, доступен массив $blockInfo.
Данные, которые нужно передать в дескриптор, должны быть собраны в массиве $ddat. Под тем же именем массив будет доступен в дескрипторе.
В предобработчике дескриптора доступен массив $udat объявленный в предобработчике обновления данных (файл *.tuh).
С помощью массива $ddat в дескриптор можно передавать данные, и менять "на лету" любые переменные tdd-файла (кроме массива $types). Обычно в дескрипторе программно меняют массив $params.
Допустим, вы хотите, чтобы на страничке "Новости" выводились 10 новостей, а на главной странице, при использовании того же шаблона, только 3 новости. Коды файлов могут быть такими:
news.tddh<?php
$ddat['limit'] = ($_GET['page'] > 1) ? 10 : 3 ; // применен тернарный оператор
?>
news.tdd
<?php
. . .
$params['multi-record'] = true;
$params['backward'] = true;
$params['part']['limit'] = $ddat['limit'];
?>
Теперь любые изменения в файле .tddh, сразу отразятся на страничке без предварительного посещения ее в режиме администратора.
Кроме изменения переменных, можно выполнять любые сложные скрипты до извлечения данных из базы данных. Например, из дескриптора можно напрямую управлять запросами к блокам с помощью класса Request.