дескрипторы в шаблоне?
эти дескрипторы для элементов?
в элементах - пхп код?
значит, пхп код - в шаблоне.
опять начинаем в кошки-мышки играть?
мне скоро надоест.
сначала всеми силами пытаемся убрать код из шаблонов а потом ломаем голову как его туда впихнуть
PHP-код в шаблон не вставляется!!! {TMPL:ELEMENT:get-header-data} всего лишь говорит, что нужно подключить и выполнить блок кода под названием get-header-data.
Все.
а почему ды не выполнить код до вывода шаблона
Ну а я о чем толкую.
-~{}~ 08.08.07 19:43:
Простейший пример как используют систему программисты по старинке
имеем иерархию шаблонов
general // стиль темы
---- news // подстили
---- news-detail
---- header.tpl
---- footer.tpl // рутовые блоки
---- header.tpl
---- js-libs.tpl
---- main.tpl
---- main-menu.tpl
---- main-menu-item.tpl
main.tpl например
{TMPL:LOAD:header} - эта директива формирует отдельные блоки, которые потом билдятся в главный рутовый блок
<br><B>Root style main</B><br>
<TABLE width="700" height="400" border="2">
<TR><TD width="*" colspan="2" align="center" height="60">{MAIN.TITLE}</TD></TR>
<TR><TD width="200">
{USER_BLOCK}
<TABLE width="340" border="1" align="center">
{MAIN_MENU}
{TMPL:INCLUDE:main-menu-item} - эта директива всталяет содержимое
{/MAIN_MENU}
</TABLE>
</TD><TD width="*">
{MAIN.CONTENT}<br>
{MAIN.CREATED}
</TD></TR>
</TABLE>
{TMPL:LOAD:footer}
теперь например index.php
PHP:
// код всякий, если был запрошен модуль, то у них есть переменная $module
$tmpl = Template::factory( Conf::factory( 'tmpl' ) );
$tmpl->style( 'general' );
$tmpl->root( $module ); // если пустой то юзается рутовый раздел шаблонов
$tmpl->load( 'main' ); // Грузим главный шаблон, который рекурсивно загружает все блоки из директив TMPL:LOAD
// Вот тут начинается то, из за чего они собсна и попросили сделать вставки элементов
// допустим формируют данные для хедера
$data_header
$tmpl->assign( 'HEADER', $data_header, 'header' /*блок header*/ );
// Для меню например
$res = $db->get( 'menu' );
$menu = $res->result();
$tmpl->assign( 'MAIN_MENU::ROW', $menu /*блок не указывается, значит для рутового блока*/ );
// Если запроса на модуль не было, выводят главную страницу
$tmpl->assign( 'MAIN', array( 'content' => 'Main page content' ) );
// или если был, то инклюдят модуль и в нем уже заполняют контентом
//ну так вот, если допустим был запрошен модуль /news/news-detail,
// и кому то например захотелось чтоб у этого модуля была другая шапка с другими данными
// не составлять же структуру в индексе.php где хедер формировался
// ессесно $tmpl->root( $module ); становится
$tmpl->root( 'news.news-detail' ); // и потому как там есть header.tpl, он перекрывает родительский шаблон
// и они его заполняют его в модуле /news/news-detail, но факт в том, что вот этот код в индексе
// (он был выше описан)
$data_header
$tmpl->assign( 'HEADER', $data_header, 'header' /*блок header*/ );
//выполняется все равно. Хоть там и ничего такого особенного, но все-равно выполнение в холостую как то не очень.
// тогда я и подумал сделать страничные элементы.
Структура иерархии примерно та же
elements // root элементы, и внутри могут также перекрываться
допустим шапка
<HTML>
<HEAD>
<TITLE>{TITLE}</TITLE>
</HEAD>
<BODY>
<HR>{HEADER.WELLCOME}<HR>
<B>Style header - new.news-detail</B><BR>
{HEADER.TODAY}. {HEADER.YOUR_NAME}<BR>
{TMPL:ELEMENT:make-header-data}
ну или
{TMPL:ELEMENT:sub-module.make-header-data}
тут абсолютно для всех модулей у которых не перекрыты элементы, будет использоваться elements.make-header-data
в нашем случае, когда они захотели полностью изменить для /news/news-detail , в отличие от всех других модулей, и шапку и заполнение шапки
то им достаточно добавить в иерархию шаблонов
news.news-detail - header.tpl
и в иерархию элементов
news.news-detail - make-header-data // и заполнять ее насколько у них хватит фантазии
при этом в индексе небудет выполняться холостого кода ( КОТОРЫЙ МОЖЕТ ПЕРЕОПРЕДЕЛЯТЬСЯ В МОДУЛЯХ )
и затем когда запускаем сборку блоков,
PHP:
$tmpl->build();
$tmpl->out();
перед ней метод build() выпоняет run_elements если они были найдены
в нашем случае есть
news.news-detail.make-header-data
который заполняет шапку текушего модуля
PHP:
$new_data_header
$tmpl->assign( 'HEADER', $data_header, 'header' /*блок header*/ );
вот. а дя остальных модулей будет выполняться
elements.make-header-data
если конечно не будет переопределен родитель и для них
В итоге вот что получается... вы наверное думаете что это геморно слишком?!
Если что не ясно, спрашивайте, объясню