[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Шаблонизатор PHP
oskin
Шаблонизатор на PHP для сайта.
Шаблоны имеют структуру как

HTML
<!-- Template:index:start -->

---Text

<!-- Template:index:end-->


притом в одном файле могут содержатся несколько частей шаблона, только с разными именами (XXX)

<!-- Template:XXX:start -->
<!-- Template:XXX:end-->

В шаблоне допустимы следующие инструкции:
%ПЕРЕМЕНАЯ% - вывод переменой php предварительно заданой функцией template_assign_vars
%VAR (ПЕРЕМЕНАЯ|КОНСТАНТА)%, например %VAR URI_HOME%
компилируется как:
PHP
print (defined('URI_HOME') ? URI_HOME $URI_HOME);


%IF ПЕРЕМЕНАЯ%
---Text
%END IF%
блок с условием. Если ПЕРЕМЕНАЯ != 0 выводим на печать

%IF NOT ПЕРЕМЕНАЯ%
---Text
%END IF%
блок с условием. Если ПЕРЕМЕНАЯ == 0 выводим на печать

%FUNCTION rand% - вызов функции и возращаемое значение в основной поток при условии если функция найдена:

print ((function_exists('rand')) ? rand() : '<!-- function rand not found//-->');

%INCLUDE news:lastnews% - подключаем файл к основному потоку.
news:lastnews - Модуль:Файл - сделано для ограничения инструкции. Можно конечно же и убрать news:lastnews или указать другой путь категории с файлами для include

%TEMPLATE name% подключает другой шаблон предварительно обработав.

%BEGIN row%
---Text
%END BEGIN%
обрабатываем как список

-------------------------------------------------------------------
Привожу сам шаблонизатор


PHP
<?php

/*
* @ Template block
*
*
    (bool) template_read( filename )
    template_get_vars( varname, partition )
    (void) template_assign_vars( vars, partition )
    (void) template_assign_block_vars
    (filename) template_compile( text, partition)
    (void) template_parse( partition )

*    
*
* @ template_read
*/
    
function template_read($file) {
        global 
$template_data;
        
$data file_get_contents($file);
          
$count preg_match_all("/<!-- Template:([^:]+?):start -->(.*?)<!-- Template:\\1:end -->/is"$data$matchesPREG_SET_ORDER); 
        if(( 
$count count$matches)) > ) {
            for(
$i=0$i $count$i++) {
                
$template_data[template][ strtoUpper$matches[$i][1]) ] = $matches[$i][2];
                
$template_data[template_property][ strtoUpper$matches[$i][1]) ][time] = filemtime$file);
            }
            return 
true;
        }
        return 
false;
    }
/*
* @ template_assign_vars
*/
    
function template_assign_vars$vars$partition 0) {
        global 
$template_data;
        if(empty(
$partition)) $partition $template_data[partition];
        else 
$template_data[partition] = $partition;
        if(
is_array$vars)) {
            foreach( 
$vars as $key => $value ) {
                
$template_data[vars][ strtoUpper$partition) ][$key] = $value;
            }
        }
        return 
true;
    }
/*
* @ template_get_vars
*/
    
function template_get_vars$var 0$partition 0) {
        global 
$template_data;
        if(empty(
$partition)) $partition $template_data[partition];
        else 
$template_data[partition] = $partition;
        return 
$template_data[vars][ strtoUpper$partition) ][$var];
    }
/*
* @ template_assign_block_vars
*/
    
function template_assign_block_vars$vars$block 0$index 0) {
        global 
$template_data;
        if(empty(
$block)) return;
        
$template_data['block_vars'][ strtoUpper$block) ][ $index ] = $vars;
        return 
true;
    }
/*
* @ template_compile
*/
    
function template_compile($text 0$partition 0) {
        global 
$template_data;
        if(empty(
$partition)) $partition $template_data[partition];
        
$partition strtoUpper$partition);
        if( 
file_exists( ( $filename PATH_CASHE md5$partition ) . '.compile' ))
            AND 
filemtime$filename ) >= $template_data[template_property][ $partition ][time] ) {

            return 
$filename;
        }
/*
* @ ERROR COMPILE
*/
        
preg_match_all"/%IF[ \t]+[A-Z0-9_]+%|%IF[ \t]+NOT[ \t]+[A-Z0-9_]+%|%IF[ \t]+[A-Z0-9_]+\.[A-Z0-9_]+%|%IF[ \t]+NOT[ \t]+[A-Z0-9_]+\.[A-Z0-9_]+%/is"$text$matches);
        
$c_if count($matches[0]);
        
preg_match_all"/%END[ \t]+IF%/is"$text$matches);
        
$c_endif count($matches[0]);
        
preg_match_all"/%BEGIN[ \t]+[A-Z0-9_]+%/is"$text$matches);
        
$c_begun count($matches[0]);
        
preg_match_all"/%END\s+BEGIN%/is"$text$matches);
        
$c_endbegun count($matches[0]);

        if( 
$c_if != $c_endif OR $c_begun != $c_endbegun ) return 0;
/*
* @ COMPILE
*/
        
preg_match_all"/%VAR[ \t]+([A-Z0-9_]+)%/is"$text$matches);
        
$matches[1] = array_unique$matches[1]);
        
$text = (( count($matches[1]) > ) ? "<?php\n\n\tglobal \$" implode', $'$matches[1] ) .";\n\n?>\n\n" '') . $text;

        
$text preg_replace("/%IF[ \t]+([A-Z0-9_]+)%/is""<?php\n\n\tif( \$template_data['vars']['".$partition."']['\\1'] ) {\n\n?>"$text);
        
$text preg_replace("/%IF[ \t]+NOT[ \t]+([A-Z0-9_]+)%/is""<?php\n\n\tif( empty(\$template_data['vars']['".$partition."']['\\1']) ) {\n\n?>"$text);
        
$text preg_replace("/%END[ \t]IF%/is""<?php\n\n\t}\n\n?>"$text);
        
$text preg_replace("/%([A-Z0-9_]+)%/is""<?php\n\n\tprint \$template_data['vars']['".$partition."']['\\1'];\n\n?>"$text);
        
$text preg_replace("/%VAR[ \t]+([A-Z0-9_]+)%/is""<?php\n\n\tprint (defined('$1') ? $1 : \$$1 );\n\n?>"$text);
        
$text preg_replace("/%MODULE[ \t]+([A-Z0-9_]+):([A-Z0-9_]+)%/is""<?php\n\n\tif( file_exists( PATH_MODULE . '\\1/\\2.php')) {\n\t\tif(!function_exists('\\2')) include( PATH_MODULE . '\\1/\\2.php');\n\t\tprint ((function_exists('\\2')) ? \\2() : '');\n\t}\n\n?>"$text);
        
$text preg_replace("/%FUNCTION[ \t]+([A-Z0-9_]+)%/is""<?php\n\n\tprint ((function_exists('\\1')) ? \\1() : '<!-- function \\1 not found//-->');\n\n?>"$text);
        
$text preg_replace("/%INCLUDE[ \t]+([A-Z0-9_]+):([A-Z0-9_]+)%/is""<?php\n\n\tif( file_exists( PATH_MODULE . '\\1/\\2.php')) include( PATH_MODULE . '\\1/\\2.php');\n\n?>"$text);
        
$text preg_replace("/%MENU[ \t]+([A-Z0-9_]+)%/is""<?php\n\n\tif( file_exists( PATH_MENU . '\\1.php' ) ) {\n\t\trequire_once( PATH_MENU . '\\1.php' );\n\t\tprint ( function_exists('\\1') ) ? \\1() : '';\n\t}\n\telse\n\t\tprint menu_result( '\\1' );\n\n?>"$text);
        
$text preg_replace("/%TEMPLATE[ \t]+([A-Z0-9_]+)%/is""<?php\n\n\tprint template_parse( '$1' );\n\n?>"$text);
/*
* @ BEGIN
*/
        
if( preg_match_all"/%BEGIN[ \t]+([A-Z0-9_]+)%/is"$text$matches) ) {
            
$text preg_replace("/%IF[ \t]+([A-Z0-9_]+)\.([A-Z0-9_]+)%/is""<?php\n\n\tif( \$template_data['block_vars']['\\1'][\$key]['\\2'] ) {\n\n?>"$text);
            
$text preg_replace("/%IF[ \t]+NOT[ \t]+([A-Z0-9_]+)\.([A-Z0-9_]+)%/is""<?php\n\n\tif( empty( \$template_data['block_vars']['\\1'][\$key]['\\2'] )) {\n\n?>"$text);
            
$text preg_replace"/%BEGIN[ \t]+([A-Z0-9_]+)%/is""<?php\n\n\tif( count( \$template_data['block_vars']['\\1'] ) > 0 ) {\n\t\tforeach( \$template_data['block_vars']['\\1'] as \$key => \$value ) {\n\n?>"$text);
            
$text preg_replace"/%END[ \t]BEGIN%/is""<?php\n\n\t\t}\n\n\t}\n?>"$text);
            
$text preg_replace("/%([A-Z0-9_]+)\.([A-Z0-9_]+)%/is""<?php\n\n\tprint \$template_data['block_vars']['\\1'][\$key]['\\2'];\n\n?>"$text);
        }


        if( 
file_write_contentsPATH_CASHE md5$partition ) . '.compile'$text ) )
            return 
$filename;
        else
            return -
1;
    }
/*
* @ template_parse
*/
    
function template_parse($partition 0){
        global 
$template_data;
        if(empty(
$partition)) $partition $template_data[partition];
        else 
$template_data[partition] = $partition;
        
$partition strtoUpper$partition);
        if( !isset(
$template_data[template][$partition]) ) return "<!-- Template part "$template_data[template][$partition] ." not found -->\n";
        
$text $template_data[template][$partition];
        
$file template_compile$text$partition );

        if( 
$file === ) return "<!-- Error compile $partition -->\n";
        elseif( 
$file === -) return "<!-- Error write file compile $partition -->\n";

        
Ob_start();
        
Ob_implicit_flush(0);
        include( 
$file );
        
$contents ob_get_contents();
        
Ob_end_clean();
        return 
$contents;
    }
/*
* @ End Template
*/



Да посли компиляции шаблона файл помещаем в каталог и в последующем чтении берем компилированый php файл а не парсим заново шаблон.

В прогармме использую так, пример:

Шаблон:

HTML
<!-- Template:NEWSindex:start -->

<h1>%title%</h1>

%BEGIN ROW%
<h2>%ROW.title%</h2>
<p>%ROW.description%</p>
<hr>
%END BEGIN%

<!-- Template:NEWSindex:end -->






Обработчик:

PHP
template_read('news.template');

    
template_assign_vars(Array(    'title' => 'Новости',
                
'description' => '',
                
'keywords' => '',

            ), 
'index');// к главному шаблону сайта с идентификатором index

    
$index 0;
    while(
$index<5){
        
template_assign_block_vars(Array(     'title' => 'title news' $index
                    
'description' => 'description news'.$i

                
),
                
'ROW'
                
$index );// для списка новостей (BEGIN)

        
$index += 1;
    }

    
template_assign_vars(Array( 'title' => 'Новости'), 'NEWSindex' );
    
template_assign_vars(Array( 'body' => template_parse('NEWSindex') ), 'index');// для шаблона news


В итоге получаем компилированый файл:

PHP
<h1><?php

    
print $template_data['vars']['NEWSINDEX']['title'];

?></h1>

<?php

    
if( count$template_data['block_vars']['ROW'] ) > ) {
        foreach( 
$template_data['block_vars']['ROW'] as $key => $value ) {

?>
    <h2><?php

    
print $template_data['block_vars']['ROW'][$key]['title'];

?></h2>
    <p><?php

    
print $template_data['block_vars']['ROW'][$key]['description'];

?></p>
    <hr>
<?php
        
}

    }


В итоге файлы с print, include, и поток вывода на печать.

-----
Шаблонизатор писал для себя. Нравится тем что все сводится к простым инструкциям include. Пробывал через eval-include обрабатывалось на ~50% дольше чем данное решение (ИМХО моя оценка).

Пост создавал - может кому понадобится может кто покритикует)

будут вопросы пишите




Спустя 40 минут, 5 секунд (1.04.2009 - 14:58) twin написал(а):
Не устаю поражаться, как вы любите перевернуть всё с ног на голову. Вот еще один ярчайший пример. На сколько сами себе усложнили жизнь. Сначала нужно считать весь темплэйт в переменную. Тягодумными регулярками разобрать его на кусочки в массив. Рискуя при этом словить какой нибуь непредсказуемый глюк или просто ошибку в написании разделителя. Потом не менее изощренно менять шило на мыло. Потому что уже один раз пришлось исковеркать язык всякими %IF NOT ПЕРЕМЕНАЯ%. В результате потратив кучу времени и нещадно пожирая ресурсы получить то, что и так давно было. И кому стало от этого легче?

PS Ничего личного, меня сама идея веселит всегда. smile.gif

Спустя 41 минута, 32 секунды (1.04.2009 - 15:40) sergeiss написал(а):
twin - а это как раз по причине того, о чем я недавно писал тут свои соображения. Вот в этой теме.
Если каждый будет заниматься своим делом (дизайнер - делать дизайн, а программер - кодить), то тогда и не понадобятся такие извраты, как описанный в этой теме.

С другой стороны если посмотреть... Ежели человеку хочется, по сути дела, написать свой язык программирования "с нуля"... То флаг ему в руки, и барабан на шею smile.gif

PS. хАчу свой аватар вернуть! smile.gif

Спустя 25 минут, 26 секунд (1.04.2009 - 16:05) oskin написал(а):
>>>Не устаю поражаться, как вы любите перевернуть всё с ног на голову.

Да нужны иногда шаблоны!!!! Я лучше шаблон распарсю чем ту же меню через eval програню.

>>>На сколько сами себе усложнили жизнь.

Себе да усложняю ... мне проще все php кодом выводить хоть что. Но вообщето пишу не только для себя и стараюсь облегчить другим.

>>>Сначала нужно считать весь темплэйт в переменную. Тягодумными регулярками разобрать его на кусочки в массив.

хорошо можно немного модифицировать код. Один шаблон - один файл.
Проверяем если есть уже компилированый файл для шаблона - возврат:

PHP
function template_read($file) {
        global 
$template_data;
        if( 
file_exists(( $filename PATH_CASHE md5substr$partition0, (strpos$partition'.')-1) )) . '.compile' ))) and
            
filemtime$filename ) >= filemtime($file) ) return true;

            
$text file_get_contents($file);
            
$template_data[template][ strtoUpper( (strpos$partition'.')-1) ] = $text;
            return 
true;
        }
        return 
false;
    }


>>>Рискуя при этом словить какой нибуь непредсказуемый глюк или просто ошибку в написании разделителя.

Можно просмотреть полученую готовую страничку.
ниличие функции проверяются, файлы include тоже, {} тоже.

>>>Потом не менее изощренно менять шило на мыло.

(( меняется просто простыми регулярками и один раз при компиляции!


>>>нещадно пожирая ресурсы

Не надо беспокоится о машине.
Это не промышленый контролер с ограничеными 256Кб.

Я например больше беспокоюсь о посетителе все равно сжимаю содержимое и отдаю
$contents = ob_get_contents();
+gzip
.....
Своему хостеру я плачу деньги за хостинг, и пишу для людей а не для машин.




Спустя 1 минута, 5 секунд (1.04.2009 - 16:06) twin написал(а):
Да вопрос даже не в этом. Поражает другое. Ну ладно, я понимаю, начитаются люди всяких разных непонятных книжек аля Попов и пытаются изобрести что то своё, как кажется красивое и вкусное. Это похвально в плане саморазвития. Но ведь многие серьёзные программисты стопроцентно уверенны, что именно так и н только так можно разделить мухи с котлетами. Вот человек пыхтел, старался, а по идее весь этот супершаблонизатор можно уместить всего в четыре строчки. Если чётко понимать что такое php и для чего собственно этот язык придуман. Вот эти четыре строчки:

PHP
ob_start();
include(
"template.html");
$contents ob_get_contents();
ob_end_clean();


Просто вместо этого безобразного %IF NOT ПЕРЕМЕНАЯ% нужно писать СПЕЦИАЛЬНО придуманные php теги: <?php echo $var ?> и всё. А потом скомпелированный темплэйт выводить в поток, совать в каталог, писать в базу, кэшировать или складывать в мешок. Что в голову взбредет.


Спустя 29 минут, 48 секунд (1.04.2009 - 16:36) oskin написал(а):
Ну наверное вы и я понимаем эти СПЕЦИАЛЬНО придуманные php теги))

берем шаблон и пишем все на php ... ну ни как не пересекутся %ХХХ% и php код.
т.е. можно использовать инструкции %ХХХ% в шаблоне а можно и нет.

----
Критика хорошо конечно же помощь бы еще по топику)))
http://phpforum.ru/index.php?showtopic=17043

ЗЫ:
настройки страниц, модулей, меню и .тд. держу в XML, потом парсю в Array, и также сохраняю компилированый и использую далее уже Array без парсинга XML.

Спустя 3 минуты, 35 секунд (1.04.2009 - 16:40) Sylex написал(а):
oskin
провели бы тесты на скорость, показали преимущества smile.gif

Спустя 8 минут, 24 секунды (1.04.2009 - 16:48) oskin написал(а):
между чем и чем

Спустя 18 минут, 13 секунд (1.04.2009 - 17:06) twin написал(а):
Вот не понимает человек, что первично, а что яйцо. Да и не поймет наверное никогда. Зачем... и так работает в полный рост. А то, что приходится всяким извратом плана %ТЫР_ПЫР% пользоваться, что ресурсы не считаются (ну видно просто посетителей мало, что экономить), это всё побоку. PHP это приложение, это дополнение к серверу, а не основа основ. Первичен сервер, а ему глубоко наплевать, что там где хранится. Он делает свое дело - выдает в поток файл. И если в этм файле встречается специальная вставка - <??> то в дело вступает php процессор. А не наоборот. А у тебя СНАЧАЛА в работу включается php, разбирает и без того готовый к отправке файл и долго долго что то с ним мутит, прежде чем выдать результат. Это если без кэширования. Ну а с кэшированием все тож самое, только однократно. Тэмплэйт, это УЖЕ готовый к применению файл, только напичканый всякой хренью, которую не может разобрать сервер. Зачем, если есть то, что он прекрасно понимает. Ведь PHP это и есть шаблонизатор по зхадумке и сути своей. Надо только грамотно использовать и не изобретать велосипедов. А так можно дойти до того, что будем изобретать крмпьютер, который будет тыкать по клавиатуре другого компьютера, причем на тарабарском языке, что бы тот перевел этот тарабарский язык в что то удобоваримое.

Спустя 5 часов, 46 минут, 51 секунда (1.04.2009 - 22:53) kirik написал(а):
oskin, правда, послушай что говорят. Шаблонизатор - это всегда ограничение возможностей + лишняя трата ресурсов. А помимо этого еще и время на разработку оного, багфиксинг (если используется готовый - на вникание в его синтаксис). Я когда писал свой первый более-менее серьезный проект тоже заменял переменные на %VAR%. А потом меня достало то, что чтобы вывести переменную нужно ее сначала назначить, и потом выводить. И я забил на это все и стал делать просто <?..?>. Да, пусть это не так красиво как в процентах, но это удобнее и быстрее.

Спустя 8 часов, 8 минут, 16 секунд (2.04.2009 - 07:01) Sylex написал(а):
а я если честно, тож не юзаю шаблонизатор...

Спустя 3 часа, 44 минуты, 43 секунды (2.04.2009 - 10:46) waldicom написал(а):
А я получается всегда не как все. Пользуюсь smarty, довольно удобно. Ресурсы дело важное, но и легкость поддержки и сопровождения кода для меня тоже важны.

Спустя 1 час, 56 минут, 31 секунда (2.04.2009 - 12:43) twin написал(а):
Любой шаблонизатор, написаный на шаблонизаторе по определению не может быть удобным. Хотя бы по тому, что нужно изучать два языка программирования, хотя вполне достаточно одного. А про этого монстра смарти вообще отдельная тема...

Спустя 2 часа, 2 минуты, 14 секунд (2.04.2009 - 14:45) oskin написал(а):
Кому то нравится работать через шаблоны ... а кому нет.

Каждый работает индивидуально, как ему удобнее.

---
имхо я сейчас использую шаблонизатор.
если опять про %ТЫР_ПЫР% или второй язык шаблонизатора .....

ну пишите в шаблоне на php ничто не мешает вам это.
как я сказал выше не пересекается %ТЫР_ПЫР% и php
PHP
<?php
//--
print time();


шаблоны дело вкуса...

удаляйте тему ((
критики масса помощи нету

Спустя 35 минут, 11 секунд (2.04.2009 - 15:20) twin написал(а):
Спсение утопающих- дело рук самих утопающих. Не хочешь воспользоваться советом, заталкивать тебя дальше в это болото - по меньшей мере неразумно. Как нибудь сам.

Спустя 4 часа, 26 минут, 5 секунд (2.04.2009 - 19:46) kirik написал(а):
Цитата (oskin @ 2.04.2009 - 06:45)
удаляйте тему ((
критики масса помощи нету

Что-то не внял.. Тема создавалась под заголовком
Цитата (oskin @ 1.04.2009 - 06:18)
..может кому понадобится может кто покритикует)

так вот это была вполне здоровая (нос мокрый, холодный, глаза блестят) критика по поводу шаблонизаторов smile.gif А помощи вроде как никто не просил.. smile.gif Не принимай все на свой счет!
В любом случае спасибо тебе, что уделил время выложить работу сюда!

Спустя 20 часов, 57 минут, 46 секунд (3.04.2009 - 16:44) Семён написал(а):
Я просто сторонник Smarty поэтому, мне эта тема не интересна.

Спустя 14 часов, 9 минут, 5 секунд (4.04.2009 - 06:53) Guest написал(а):
kirik>>>так вот это была вполне здоровая (нос мокрый, холодный, глаза блестят) критика по поводу шаблонизаторов

В принципе критику хотел услышать не по поводу шаблонизаторов вообще а по конкретного шаблонизатора, скажим что то оптимизировать или это .... лучше так:....

Семён >>>Я просто сторонник Smarty поэтому, мне эта тема не интересна.

ну епрст слов нет.
Если не интересно я не читаю.....
---

Спустя 21 минута, 56 секунд (4.04.2009 - 07:15) kirik написал(а):
Цитата (Guest @ 3.04.2009 - 22:53)
В принципе критику хотел услышать не по поводу шаблонизаторов вообще а по конкретного шаблонизатора, скажим что то оптимизировать

Окей, хотел - получай =)

1. $template_data[template] - индекс (template) нужно писать в кавычках (тем более ты распространяешь свой шаблонизатор) ((это относится ко всем массивам в скрипте))
2. file_get_contents() начинает работать только с php v.4.3.0
3. strtoUpper() (и прочие строковые функции) _не_ будут работать с русским в utf8
4. Цикл foreach() использовать плохо, т.к. он работает не с самим массивом, а с его копией (съедает в 2 раза больше памяти)
5. preg_replace() умеет работать с массивами, те. можно все заменить на
PHP
$replace = array(
        
"/%IF[ \t]+([A-Z0-9_]+)%/is" => "<?php\n\n\tif( \$template_data['vars']['".$partition."']['\\1'] ) {\n\n?>",
        
"/%IF[ \t]+NOT[ \t]+([A-Z0-9_]+)%/is" => "<?php\n\n\tif( empty(\$template_data['vars']['".$partition."']['\\1']) ) {\n\n?>",
        
"/%END[ \t]IF%/is" => "<?php\n\n\t}\n\n?>",
        
"/%([A-Z0-9_]+)%/is" => "<?php\n\n\tprint \$template_data['vars']['".$partition."']['\\1'];\n\n?>",
        
"/%VAR[ \t]+([A-Z0-9_]+)%/is" => "<?php\n\n\tprint (defined('$1') ? $1 : \$$1 );\n\n?>",
        
"/%MODULE[ \t]+([A-Z0-9_]+)sad.gif[A-Z0-9_]+)%/is" => "<?php\n\n\tif( file_exists( PATH_MODULE . '\\1/\\2.php')) {\n\t\tif(!function_exists('\\2')) include( PATH_MODULE . '\\1/\\2.php');\n\t\tprint ((function_exists('\\2')) ? \\2() : '');\n\t}\n\n?>",
        
"/%FUNCTION[ \t]+([A-Z0-9_]+)%/is" => "<?php\n\n\tprint ((function_exists('\\1')) ? \\1() : '<!-- function \\1 not found//-->');\n\n?>",
        
"/%INCLUDE[ \t]+([A-Z0-9_]+)sad.gif[A-Z0-9_]+)%/is" => "<?php\n\n\tif( file_exists( PATH_MODULE . '\\1/\\2.php')) include( PATH_MODULE . '\\1/\\2.php');\n\n?>",
        
"/%MENU[ \t]+([A-Z0-9_]+)%/is" => "<?php\n\n\tif( file_exists( PATH_MENU . '\\1.php' ) ) {\n\t\trequire_once( PATH_MENU . '\\1.php' );\n\t\tprint ( function_exists('\\1') ) ? \\1() : '';\n\t}\n\telse\n\t\tprint menu_result( '\\1' );\n\n?>",
        
"/%TEMPLATE[ \t]+([A-Z0-9_]+)%/is" => "<?php\n\n\tprint template_parse( '$1' );\n\n?>",
        
//..............
);

$text preg_replace(array_keys($replace), array_values($replace), $text);

Немного аккуратней смотрится? Да и функция выполняется всего один раз.

Спустя 1 минута, 56 секунд (4.04.2009 - 07:17) kirik написал(а):
Цитата (Guest @ 3.04.2009 - 22:53)
ну епрст слов нет.
Если не интересно я не читаю.....

Ну это правильно =) Зачем засорять кэш не нужной информацией? cool.gif

Спустя 3 дня, 1 час, 31 минута, 29 секунд (7.04.2009 - 08:48) glock18 написал(а):
2oskin: похвально стремление сделать что-то свое, но я бы посоветовал (если вообще использовать template engine) готовый. Из готовых могу посоветовать smarty, хотя другие я толком не знаю smile.gif

2twin: проблема скорости выполнения в php вещь очень важная, разумеется. Но! Нет такого места, где ее нельзя было бы увеличить. Грамотный template engine из скомпилированного воспроизведет результат без лишних затрат времени (затраты на компиляцию вообще в расчет не беру, ибо имхо делается 1 раз после изменения шаблона).

шаблоны вообще были придуманы, что дизайнеры могли не учить php/perl/т.п. при создании html кода.

А к вопросу о скорости выполнения и ее оптимизации почитайте:

http://dklab.ru/chicken/nablas/49.html. (на примере zend framework)

А теперь: так ли значительны одноразовые потери в производительности шаблонизатора при компиляции? Насколько я понимаю, что многих затраты на инициализацию ZendFramework не особо заботят

Впрочем, я ни в коем случае не убеждаю использовать template engine. Это дело вкуса, и я сам с недавних пор предпочитаю использовать plain php, но причины здесь несколько иные, нежели медлительность TE.

Спустя 1 год, 4 месяца, 24 дня, 16 часов, 59 минут, 32 секунды (2.09.2010 - 01:48) incom написал(а):
Цитата (twin @ 1.04.2009 - 13:06)
Да вопрос даже не в этом. Поражает другое. Ну ладно, я понимаю, начитаются люди всяких разных непонятных книжек аля Попов и пытаются изобрести что то своё, как кажется красивое и вкусное. Это похвально в плане саморазвития. Но ведь многие серьёзные программисты стопроцентно уверенны, что именно так и н только так можно разделить мухи с котлетами. Вот человек пыхтел, старался, а по идее весь этот супершаблонизатор можно уместить всего в четыре строчки. Если чётко понимать что такое php и для чего собственно этот язык придуман. Вот эти четыре строчки:

ob_start();
include("template.html");
$contents = ob_get_contents();
ob_end_clean();


Просто вместо этого безобразного %IF NOT ПЕРЕМЕНАЯ% нужно писать СПЕЦИАЛЬНО придуманные php теги: <?php echo $var ?> и всё. А потом скомпелированный темплэйт выводить в поток, совать в каталог, писать в базу, кэшировать или складывать в мешок. Что в голову взбредет.

Гениальное решение. После этих строчек перестал гуглить инфу о шаблонизаторах. То что надо! Моё почтение...

Спустя 42 минуты, 39 секунд (2.09.2010 - 02:30) incom написал(а):
Сделал "Шаблонизатор" прошло всего 10 минут. Почувствовал себя великим программистом. Пошёл доволным спать.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.