ivank
31-01-2002, 10:34
Кто-нибудь использует что-нибудь подобное для своих сайтов? Давайте делиться реализациями, вот это я сегодня целый час писал (как долго... =).
файл templates.php:
<?
// (c)2002 Иван Коростелёв aka ivank
// mailto: ivank@beep.ru
// http://ivank.hut.ru
// Функции работы с шаблонами.
include 'settings/templates.txt';
function insert_template( $name, $params = array() )
{
* *if( !array_key_exists( $name, $GLOBALS['html_templates'] ) )
* * * *return;
* *$template = strtr(
* * * *$GLOBALS['html_templates'][$name],
* * * *array( '{{' => "\x01", '}}' => "\x02" ) );
* *preg_match_all( "/\{[!#$%][^\}]+\}/" , $template, $matches );
* *//print_r( $matches );
* *if( sizeof( $matches[0] ) == 0 )
* *{
* * * *echo $template;
* * * *return;
* *}
* *for( $i=0; $i < sizeof( $matches[0] ); ++$i )
* *{
* * * *$match = $matches[0][$i];
* * * *// Выводим, то что до темплейта.
* * * *$match_pos = strpos( $template, $match );
* * * *echo substr( $template, 0, $match_pos );
* * * *// Удаляем, то что вывели и сам темплейт из текста
* * * *$template = substr(
* * * * * *$template,
* * * * * *strlen( $match ) + $match_pos,
* * * * * *strlen( $template ) );
* * * *do_real_work( $match, $params );
* *}
* *echo $template;
}
function do_real_work( &$match, &$params )
{
* *// А тут уже занятия собственно выводом шаблона
* *$type = substr( $match, 1, 1 );
* *$match = substr( $match, 2, strlen( $match )- 3 );
* *switch( $type )
* *{
* *case '!':
* * * *template_call_function( $match, $params );
* * * *break;
* *case '#':
* * * *// Вставка другого шаблона
* * * *template_insert_template( $match, $params );
* * * *break;
* *case '$':
* * * *// Вставляем переменную.
* * * *echo get_variable( $match, $params );
* * * *break;
* *case '%':
* * * *template_parse_expression( $match, $params );
* * * *break;
* *}
}
function get_variable( $name, $params )
{
* *if( substr( $name, 0, 1 ) == '$' )
* * * *$name = substr( $name, 1, strlen( $name ) );
* *preg_match_all( "/[^\[\] ]+/", $name, $match );
* *if( array_key_exists( $match[0][0], $params ) )
* * * *$cur_var =& $params[ $match[0][0] ];
* *elseif( array_key_exists( $match[0][0], $GLOBALS ) )
* * * *$cur_var =& $GLOBALS[ $match[0][0] ];
* *if( !isset( $cur_var ) )
* * * *return "";
* *for( $j = 1; $j < sizeof( $match[0] ); ++$j )
* * * *$cur_var =& $cur_var[ $match[0][$j] ];
* *return $cur_var;
}
function template_call_function( &$match, &$params )
{
* *preg_match_all( "/[^\(\),]+/", $match, $match );
* *$func_params = array();
* *for( $j = 1; $j < sizeof( $match[0] ); ++$j )
* *if( substr( $match[0][$j], 0, 1 ) == '$' )
* * * *$match[0][$j] = get_variable( $match[0][$j], $params );
* *if( function_exists( $match[0][0] ) )
* * * *if( sizeof( $match[0] ) == 1 )
* * * * * *call_user_func( $match[0][0] );
* * * *else
* * * * * *call_user_func_array( $match[0][0], array_slice( $match[0], 1 ) *);
}
function template_parse_expression( &$expr, &$params )
{
* *preg_match( "/(\w+)\s*\(\s*([^\)]+)\)\s*(.+)/", $expr, $match );
* *switch( $match[1] )
* *{
* *case 'if':
* * * *preg_match_all( '/[^ ]+/', $match[2], $expr );
* * * *for( $i = 0; $i < sizeof( $expr[0] ); ++$i )
* * * * * *if( substr( $expr[0][$i], 0, 1 ) == '$' )
* * * * * * * *$expr[0][$i] = get_variable( $expr[0][$i], $params );
* * * *$do_it = true;
* * * *switch( $expr[0][1] )
* * * *{
* * * * * *case '==':
* * * * * * * *if( $expr[0][0] == $expr[0][2] )
* * * * * * * *$do_it = true;
* * * * * *break;
* * * *case '!=':
* * * * * * * *if( $expr[0][0] !== $expr[0][2] )
* * * * * * * *$do_it = true;
* * * * * *break;
* * * *}
* * * *if( $do_it )
* * * *{
* * * * * *$match[3] = '{'.$match[3].'}';
* * * * * *do_real_work( $match[3], $params );
* * * *}
* * * *break;
* *}
}
function template_insert_template( &$match, &$params )
{
* *preg_match_all( "/[^\(\),]+/", $match, $match );
* *$template_params = array();
* *for( $j = 1; $j < sizeof( $match[0] ); ++$j )
* *{
* * * *preg_match_all( "/[^=]+/", $match[0][$j], $param );
* * * *if( substr( $param[0][1], 0, 1 ) == '$' )
* * * * * *$param[0][1] = get_variable( $param[0][1], $params );
* * * *$template_params[ $param[0][0] ] = $param[0][1];
* *}
* *insert_template( $match[0][0], $template_params );
}
?>
Сами шаблоны лежат в файле templates.txt:
<?
// Шаблоны. это такие чтучки, что б дизайн делать :)
$html_templates = array();
// Общие настройки дизайна.
// Модкль отображается в нормально режиме -- с менюхами итп.
$html_templates['normal'] = <<<HTML
{#header}
<center><table width=100%><tr><td width=150 valign=top>
{#side_module(name=Навигация,template=menu)}
{%if( \$request[0][0] != main ) if( \$request[0][0] != not_found ) *#side_module(name=В&nbsp;разделе,template=submenu)}
</td><td width=100% valign=top>{!module_output()}</td></tr></table></center>
{#footer}
HTML;
$html_templates['header'] = <<<HTML
{!do_cookies()}<html><head><title>Here's title</title><head><body bgcolor=999999>
<center><table width=90% bgcolor=cccccc><tr><td>
<h2 align=center>Welcome to the SHE test site!</h2>
HTML;
$html_templates['footer'] = <<<HTML
</td></tr></table></center></body></html>
HTML;
// Ну это для... не знаю как объяснить. Пока...
$html_templates['side_module'] = <<<HTML
<table width=100% bgcolor=black><tr><td>
<table width=100% bgcolo=ccccc0 cellspacing=1>
<tr bgcolor=9999cc><td><center><b>..::{\$name}::..</b></center></td></tr>
<tr bgcolor=cccc99><td>{!insert_template(\$template)}</td></tr></table>
</td></tr></table>
HTML;
// Настройка меню.
$html_templates['menu'] = <<<HTML
<p align=right>Главная<br>
Дайджест<br>
О проекте<br>
Ссылки</p>
HTML;
$html_templates['submenu'] = <<<HTML
<p align=right>{!insert_sub_menu()}</p>
HTML;
$html_templates['submenu_item'] = <<<HTML
<a href="{\$url}">{\$title}</a><br>
HTML;
?>Код плохо закоментирован, не бейте, я сейчас занимаюсь как раз его комментированием
Теперь в основном файле мне достаточно подключить требуемый модуль, написать:
insert_template( 'normal' );
и он сам обрастёт требуемым дизайном.
Каждый шаблон должен начинаться так:$html_templates['имя шаблона'] = <<<HTML
И заканчиваться просто:
HTML;
Всё что находится между фигурными скобками является указанием препроцессору:
{\$имя переменной} Вставляет значение переменной. Сначала смотрит в переданных параметрах, если нет то в глобальных переменных.
{#имя шаблона} -- вставляет соответствующий шаблон
{#имя шаблона(имя параметра=значение параметра[,имя параметра= итд ]} Вставляет шаблон, передавая ему параметры с соответствующими именами. Если значение параметра начинается с \$, то препроцессор ищет переменную с таким именем.
{!функция[(параметр[,параметр[итд]]]} Вызывает функцию. Если параметр начинается с \$, то считается что это переменная.
Семейство {%что-то} предназначено для написания простых инструкций а ля язык программрования. Пока есть только:
{%if( выражение ) Что выполнить.}
Выражение пока может быть только ( что-то == что-то ) или ( что-то != что-то ), разумеется можно использовать переменные. Если выражение истина, то выполняется то, что идёт после выражения, как-будто было бы написано {Что выполнить}
примечание: То что в квадратных скобках, это необязательные параметры.
Примеры этих конструкций выделены жирным в templates.txt
Нравится? На этом будет построен новый движок oszone.net :)
файл templates.php:
<?
// (c)2002 Иван Коростелёв aka ivank
// mailto: ivank@beep.ru
// http://ivank.hut.ru
// Функции работы с шаблонами.
include 'settings/templates.txt';
function insert_template( $name, $params = array() )
{
* *if( !array_key_exists( $name, $GLOBALS['html_templates'] ) )
* * * *return;
* *$template = strtr(
* * * *$GLOBALS['html_templates'][$name],
* * * *array( '{{' => "\x01", '}}' => "\x02" ) );
* *preg_match_all( "/\{[!#$%][^\}]+\}/" , $template, $matches );
* *//print_r( $matches );
* *if( sizeof( $matches[0] ) == 0 )
* *{
* * * *echo $template;
* * * *return;
* *}
* *for( $i=0; $i < sizeof( $matches[0] ); ++$i )
* *{
* * * *$match = $matches[0][$i];
* * * *// Выводим, то что до темплейта.
* * * *$match_pos = strpos( $template, $match );
* * * *echo substr( $template, 0, $match_pos );
* * * *// Удаляем, то что вывели и сам темплейт из текста
* * * *$template = substr(
* * * * * *$template,
* * * * * *strlen( $match ) + $match_pos,
* * * * * *strlen( $template ) );
* * * *do_real_work( $match, $params );
* *}
* *echo $template;
}
function do_real_work( &$match, &$params )
{
* *// А тут уже занятия собственно выводом шаблона
* *$type = substr( $match, 1, 1 );
* *$match = substr( $match, 2, strlen( $match )- 3 );
* *switch( $type )
* *{
* *case '!':
* * * *template_call_function( $match, $params );
* * * *break;
* *case '#':
* * * *// Вставка другого шаблона
* * * *template_insert_template( $match, $params );
* * * *break;
* *case '$':
* * * *// Вставляем переменную.
* * * *echo get_variable( $match, $params );
* * * *break;
* *case '%':
* * * *template_parse_expression( $match, $params );
* * * *break;
* *}
}
function get_variable( $name, $params )
{
* *if( substr( $name, 0, 1 ) == '$' )
* * * *$name = substr( $name, 1, strlen( $name ) );
* *preg_match_all( "/[^\[\] ]+/", $name, $match );
* *if( array_key_exists( $match[0][0], $params ) )
* * * *$cur_var =& $params[ $match[0][0] ];
* *elseif( array_key_exists( $match[0][0], $GLOBALS ) )
* * * *$cur_var =& $GLOBALS[ $match[0][0] ];
* *if( !isset( $cur_var ) )
* * * *return "";
* *for( $j = 1; $j < sizeof( $match[0] ); ++$j )
* * * *$cur_var =& $cur_var[ $match[0][$j] ];
* *return $cur_var;
}
function template_call_function( &$match, &$params )
{
* *preg_match_all( "/[^\(\),]+/", $match, $match );
* *$func_params = array();
* *for( $j = 1; $j < sizeof( $match[0] ); ++$j )
* *if( substr( $match[0][$j], 0, 1 ) == '$' )
* * * *$match[0][$j] = get_variable( $match[0][$j], $params );
* *if( function_exists( $match[0][0] ) )
* * * *if( sizeof( $match[0] ) == 1 )
* * * * * *call_user_func( $match[0][0] );
* * * *else
* * * * * *call_user_func_array( $match[0][0], array_slice( $match[0], 1 ) *);
}
function template_parse_expression( &$expr, &$params )
{
* *preg_match( "/(\w+)\s*\(\s*([^\)]+)\)\s*(.+)/", $expr, $match );
* *switch( $match[1] )
* *{
* *case 'if':
* * * *preg_match_all( '/[^ ]+/', $match[2], $expr );
* * * *for( $i = 0; $i < sizeof( $expr[0] ); ++$i )
* * * * * *if( substr( $expr[0][$i], 0, 1 ) == '$' )
* * * * * * * *$expr[0][$i] = get_variable( $expr[0][$i], $params );
* * * *$do_it = true;
* * * *switch( $expr[0][1] )
* * * *{
* * * * * *case '==':
* * * * * * * *if( $expr[0][0] == $expr[0][2] )
* * * * * * * *$do_it = true;
* * * * * *break;
* * * *case '!=':
* * * * * * * *if( $expr[0][0] !== $expr[0][2] )
* * * * * * * *$do_it = true;
* * * * * *break;
* * * *}
* * * *if( $do_it )
* * * *{
* * * * * *$match[3] = '{'.$match[3].'}';
* * * * * *do_real_work( $match[3], $params );
* * * *}
* * * *break;
* *}
}
function template_insert_template( &$match, &$params )
{
* *preg_match_all( "/[^\(\),]+/", $match, $match );
* *$template_params = array();
* *for( $j = 1; $j < sizeof( $match[0] ); ++$j )
* *{
* * * *preg_match_all( "/[^=]+/", $match[0][$j], $param );
* * * *if( substr( $param[0][1], 0, 1 ) == '$' )
* * * * * *$param[0][1] = get_variable( $param[0][1], $params );
* * * *$template_params[ $param[0][0] ] = $param[0][1];
* *}
* *insert_template( $match[0][0], $template_params );
}
?>
Сами шаблоны лежат в файле templates.txt:
<?
// Шаблоны. это такие чтучки, что б дизайн делать :)
$html_templates = array();
// Общие настройки дизайна.
// Модкль отображается в нормально режиме -- с менюхами итп.
$html_templates['normal'] = <<<HTML
{#header}
<center><table width=100%><tr><td width=150 valign=top>
{#side_module(name=Навигация,template=menu)}
{%if( \$request[0][0] != main ) if( \$request[0][0] != not_found ) *#side_module(name=В&nbsp;разделе,template=submenu)}
</td><td width=100% valign=top>{!module_output()}</td></tr></table></center>
{#footer}
HTML;
$html_templates['header'] = <<<HTML
{!do_cookies()}<html><head><title>Here's title</title><head><body bgcolor=999999>
<center><table width=90% bgcolor=cccccc><tr><td>
<h2 align=center>Welcome to the SHE test site!</h2>
HTML;
$html_templates['footer'] = <<<HTML
</td></tr></table></center></body></html>
HTML;
// Ну это для... не знаю как объяснить. Пока...
$html_templates['side_module'] = <<<HTML
<table width=100% bgcolor=black><tr><td>
<table width=100% bgcolo=ccccc0 cellspacing=1>
<tr bgcolor=9999cc><td><center><b>..::{\$name}::..</b></center></td></tr>
<tr bgcolor=cccc99><td>{!insert_template(\$template)}</td></tr></table>
</td></tr></table>
HTML;
// Настройка меню.
$html_templates['menu'] = <<<HTML
<p align=right>Главная<br>
Дайджест<br>
О проекте<br>
Ссылки</p>
HTML;
$html_templates['submenu'] = <<<HTML
<p align=right>{!insert_sub_menu()}</p>
HTML;
$html_templates['submenu_item'] = <<<HTML
<a href="{\$url}">{\$title}</a><br>
HTML;
?>Код плохо закоментирован, не бейте, я сейчас занимаюсь как раз его комментированием
Теперь в основном файле мне достаточно подключить требуемый модуль, написать:
insert_template( 'normal' );
и он сам обрастёт требуемым дизайном.
Каждый шаблон должен начинаться так:$html_templates['имя шаблона'] = <<<HTML
И заканчиваться просто:
HTML;
Всё что находится между фигурными скобками является указанием препроцессору:
{\$имя переменной} Вставляет значение переменной. Сначала смотрит в переданных параметрах, если нет то в глобальных переменных.
{#имя шаблона} -- вставляет соответствующий шаблон
{#имя шаблона(имя параметра=значение параметра[,имя параметра= итд ]} Вставляет шаблон, передавая ему параметры с соответствующими именами. Если значение параметра начинается с \$, то препроцессор ищет переменную с таким именем.
{!функция[(параметр[,параметр[итд]]]} Вызывает функцию. Если параметр начинается с \$, то считается что это переменная.
Семейство {%что-то} предназначено для написания простых инструкций а ля язык программрования. Пока есть только:
{%if( выражение ) Что выполнить.}
Выражение пока может быть только ( что-то == что-то ) или ( что-то != что-то ), разумеется можно использовать переменные. Если выражение истина, то выполняется то, что идёт после выражения, как-будто было бы написано {Что выполнить}
примечание: То что в квадратных скобках, это необязательные параметры.
Примеры этих конструкций выделены жирным в templates.txt
Нравится? На этом будет построен новый движок oszone.net :)