подключение кода из функции в глобальную область видимости

Фанат

oncle terrible
Команда форума
так.
"НАХРЕНА нужны в ШАБЛОНЕ дескрипторы вызова элементов с ПХП КОДОМ?"
дескрипторы в шаблоне?
эти дескрипторы для элементов?
в элементах - пхп код?

значит, пхп код - в шаблоне.
опять начинаем в кошки-мышки играть?
мне скоро надоест.
 

Sokil.Dmytro

Новичок
сначала всеми силами пытаемся убрать код из шаблонов а потом ломаем голову как его туда впихнуть :)

а почему ды не выполнить код до вывода шаблона, сгенеренный хтмл в переменную и выводить обычным образом?
 

Vovan-U

Новичок
дескрипторы в шаблоне?
эти дескрипторы для элементов?
в элементах - пхп код?

значит, пхп код - в шаблоне.
опять начинаем в кошки-мышки играть?
мне скоро надоест.
сначала всеми силами пытаемся убрать код из шаблонов а потом ломаем голову как его туда впихнуть
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
если конечно не будет переопределен родитель и для них

В итоге вот что получается... вы наверное думаете что это геморно слишком?!
Если что не ясно, спрашивайте, объясню
 

Фанат

oncle terrible
Команда форума
PHP-код в шаблон не вставляется!!! {TMPL:ELEMENT:get-header-data} всего лишь говорит, что нужно подключить и выполнить блок кода под названием get-header-data
что в лоб - что по лбу.
не вставляется, но надо подключить.
какая разница? все равно у тебя в шаблоне, пусть подключается, а не вставляется ПХП КОД.
зачем?
 

Vovan-U

Новичок
какая разница? все равно у тебя в шаблоне, пусть подключается, а не вставляется ПХП КОД.
зачем?
Хорошо, *****. А почему бы и нет?
Я не понимаю, почему тебя данное решение так категорически неприемлет?! Ты в этом видишь что-то плохое или неудобное?

-~{}~ 08.08.07 20:24:

[offtop]ЗЫ, почему твой ник все время звездочками светиться?! Матерный что ли :)[/offtop]
 

OZ

Новичок
Vovan-U, глобальная область видимости уже занята твоим скриптом. Если туда залезет другой скрипт, могут возникнуть конфликты имён переменных, констант, лишние соединения с mysql, переопределения функций в конце концов.
То есть, если ты разрешаешь чужому коду выполняться в своём, тот этот чужой код должен знать, где он, и должен действовать по правилам. Для твоей системы ведь модули будут делать, правильно?
Значит объясни им, как выводить текст (передавать в твой объект?), как соединяться с mysql и т.д. Если модули для системы - модули должны действовать по правилам системы. если ты хочешь выполнить что-то неизвестное - результат будет неизвестным. Зачем неизвестному коду глобальную среду? Чтобы они могли пользоваться твоими объектами? Если они знают о них - пусть взаимодействуют с ними.
 
Сверху