В догонку (слепил за 2 минуты - чесслово, так что думаю можно оптимизировать): Код (Text): // page.xtpl <!-- BEGIN: page --> <html> <head><title>{title}</title></head> <body> {FILE {BODYRU}} <hr/> {footer} </body> </html> <!-- END: page --> // body.xtpl <!-- BEGIN: main --> <p style="background-color: #f0f1f0;">Контент:<br/> {title} and {footer} </p> <!-- END: main --> PHP: <?php include_once('./XTemplate.class.php'); $xtpl = new XTemplate('page.xtpl'); $xtpl->assign('footer', 'footer'); $xtpl->assign('title', 'title'); $xtpl->assign_file('BODYRU', 'body.xtpl'); $xtpl->parse('page.main'); $xtpl->assign('footer', 'footer1'); $xtpl->assign('title', 'title1'); $xtpl->parse('page'); $xtpl->out('page'); ?> надо будет посмотреть доки и сам код, думаю все-таки там можно еще проще и красивше.
Mr.M.I.T.sobachnik Результат парсинга дает $xtpl->text( имя блока ); Я надеюсь мы не придем к спору что круче smarty или xtemplate ?! Я уже выше все писал по этому поводу. А то у меня, чуть-чуть, уже подозрение появилось . Повторюсь: все задачи, которые передо мной стояли, решались xtemplate. (а далее: парой страниц назад).
obsrv, спасибо! Вот про $xtpl->text("main"); я и спрашивал! И (вроде) эта функция в примерах не рассматривалась, поэтому и не знал, собственно. Полностью код всего XTemplate я себе распечатал, всё хочу его перечитать внимательно и разобраться, но пока ещё этого не сделал. Спорить о том, что лучше (лично я) ни сколько не хочу - во-первых знания не те, чтобы спорить на эту тему, во-вторых, я в принцыпе не конфликтный чел и спорить не люблю. Собственно после того, как сейчас узнал про $xtpl->text("main"); мне пока Xtemplate тоже хватает! Ещё раз спасибо.
P.S. Ну и кроме того даже если бы функции text() не было, всё равно врядли стал бы использовать другой шаблонизатор, т.к. к этому уже начал понемногу привыкать. Просто воспользовался бы тем способом, который obsrv описал в предпоследнем своём посте. А потом, возможно (посовещавшись с вами), дописал бы эту функцию в XTemplate.
Не мог ли кто-нибудь пояснить назначение следующей конструкции: Код (Text): # reset($GLOBALS); # # while(list($name,$val) = each($GLOBALS)) { # # # выбираем только строки и числа # if(is_string($val) OR is_int($val)) { # $this->buffer = str_replace('{'.$name.'}',$val,$this->buffer); # } # }
Гуру, приветствую. Подскажите, при использовании этой замечательной конструкции требуется вместо значения переменной подставить скрипт. По порядку: 1. Обработчик результатов формы содержится в parser.php. Однако, нужно обработчик "упаковать" в готовый темплейт. 2. Для этого натравляем форму вместо parser.php на info.php 3. info.php должен содержать не только скрипт обработки данных формы (parser.php), но и темплейт (index.html). 4. Темплейт index.html содержит указатель {content}, куда вставляется содержимое страницы (куда и требуется воткнуть parser.php). Нижеприведённый код не работает, естественно (содержание info.php): Код (Text): include_once("buffer.inc"); $content = new Buffer("parse.php"); $content->SendFile("parse.php"); $HTML = new Buffer("index.html"); $HTML->Parse(); $HTML->Show(); index.html выводится, а вместо кода parse.php выводится "{content}" Подскажите, что поправить, а то знаний пока нехватает, ветку почитал, но так и не получил рабочего результата.
попробовал разобраться с этим кодом. насколько я понял, основную задачу парсинга шаблона выполняет функция extract(). читаю про эту функцию в книге: Подскажите, гуру ПХП, почему "для небольших массивов" и "признаком дурного тона"?
Всем привет! Подскажите вот с чем... Это говнокод? PHP: <? ... while(list($name,$val) = each($GLOBALS)) { if(is_string($val) OR is_int($val)) { while (list($name_POST, $val_POST) = each($_POST)) { if ($val != $val_POST){ $this->buffer = str_replace('$'.$name,$val,$this->buffer); } } } } ... ?> Я просто для себя ещё не решил...
Ты сам видел, какой массив перебираешь? =) PHP: <?php print_r($GLOBALS); while-list-each в 8 раз медленнее, чем foreach. Да-да, эта проверка для того, чтобы, в случае, если включены register_globals, переменнеы из POST не попали в шаблон. А как же переменные из GET, COOKIE и SESSION? А сам шаблон - объект! Epic bingo!!! ))
Не, на самом деле, мышление интересное. Когда оно подкрепится опытом - из него выйдет толк. По коду видно, что соображалка работает, просто знаний и опыта не хватает.
На самом деле плохо использовать extract в глобальной области видимости. Дело в том, что при модифицировании скрипта тебе придется помнить, какие перменные извлекаются с помощью extract.
ну, это в случае, если нет никакого вывода.. а вот с выводом поинтереснее.. ob_start(), ob_get_contents(), ob_end_clean() ит.д. Вот только лично я столкнулся с проблемой вложенного буфера в буфер, т.е. некой конструкцией: PHP: ob_start() ob_start() $mod = ob_get_contents(); $content = ob_get_contents(); Полагаю,что она не верна, т.к. буферизацию если инициировать то и нужно также закрыть перед открытием следующей. А у меня первая ob_start() юзает gz_handler ... p.s. Напоминает мне это все XHTML 1.0 Strict и незакрытые теги
По моему неплохо добавить в класс метод добавление массивов типа ключ значение и создать внутренний член массив где они будут хранится. Соответственно при прсере шаблона они будут заменять тэги шаблона. В итоге на выходе получается один массив где все итоговые данные. И это действительно очень удобно, т.к. мы можем сделать выгрузку данных например в XML или загрузить в FLASH ролик. Получается дизайн независим от конечной информации.
Есть возможность обойти PHP: reset($GLOBALS); Если в функцию Parse($txt) передать переменную, которую нужно заменить. В шаблоне можно сделать несколько функций ParseText($txt); ParseMenu($menu); и т.д.