Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Шаблоны

Ответить
Настройки темы
Шаблоны

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


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

-------
http://ivank.ru


Отправлено: 10:34, 31-01-2002

 

Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


Плюсы и минусы в отношении дизайна более или менее ясны.
А как со скоростью работы таких конструкций дела будут обстоять? Этот форум и так не очень быстрый. Если уже что-то есть - давай потестим.

(Отредактировал(а) vasketsov - 11:07 31-01-2002)

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 11:06, 31-01-2002 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


vasketsov
это не для форума.... Форум BigMac хочет оставить прежней. Но если уж это будет использовать, то медленнее не будет -- такое впечатление что IkonBoard это первая программа её автора. Если смотреть на исходники, то это просто нечитабельная каша... И не быстрая....

На счёт тестов:
на моей машине ( Целерон 600, 256 рам, частота шины 75, Апач 1.3.22 ПХП 4.1.0 ) приведённый пример всреднем выполняется 70 раз в секунду. Т.е. 70 * 60 * 60 * 24 = 6 048 000 посещений при полной загрузке сервера на базе моей машины. Хотя, конечно, реальные страницы будут раз в 3-5 помедленнее скорее всего. Как появятся более жизненые примеры, приведу результаты.

Добавлено:

я ошибся -- неправильно тесты проводил. 137 раз в секунду оно крутится.

Добавлено:

Статичесски хтмл того же размера выводится 806 раз. отсюда вывод: мой движок будет работать в 6 раз медленнее статического html...

Добавлено:

тут есть кто-нибудь пишущий на перл? Хочу посмотреть, как будет работать перловая реализация с аналогичными возможностями...

Добавлено:

пиковое значенеи для html -- 950, для моего двига 140...... нда. мне ещё есть над чем работать. Флудю я безбожно , ща замечание схлопочу

-------
http://ivank.ru


Отправлено: 11:22, 31-01-2002 | #3


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


Насчет перла. Я у себя на машине (в локальной сети) поднял апач (1,3,22), у меня там только html с прибамбасами и перл. На перле я немножко не так делаю, я просто беру и вставляю полностью файл, не изменяя код. Получается, страница собирается из нескольких файлов+между ними что-то в скрипте добавляется. То есть, это не совсем шаблон, но работает быстро. А вот так, чтоб с переменными - не думаю, что будет медленнее, только это ж писать надо, а в PHP уже есть.

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 12:44, 31-01-2002 | #4


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


откровенно говоря.... я так подумал и понял что это чухня -- это называется PHP своими руками Т.е. всё что я написал в php уже есть! Причём намного хуже чем родная имплементация... Ну ладно пусть будет...

-------
http://ivank.ru


Отправлено: 13:24, 31-01-2002 | #5


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


вообще в качестве шаблонов лучьше использовать XSL вот здесь затронут этот вопрос: http://forum.oszone.net/thread-54773.html

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 23:14, 03-06-2006 | #6


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Ребят, а вы не слишком извращаетесь?
Конструкция конечно хороша, но зачем?

На perl-e юзаю примерно такие шаблоны(допустим пустая хтмлка с формой поста):
Код: Выделить весь код
<html>
 <head>
  <title>$title</title>
 </head>
 <body>
  $postarea:80,15,stdform$
 </body>
</html>
Т.е. если прямая замена, то $имя_переменной. Если с опциями, то $имя_переменной:параметр1,параметр2,параметр3$
Просто переменные заменяются s/\$var_name/$var_value/ или более динамично(но медленнее) s/\$(var_name)/$vars{$1}/
Комплексные s/\$var_name[a-z0-9]),([a-z0-9]),([a-z0-9])\$/код_замены_со_вставкой_переменных($1,$2,$3,..)/, если более динамично, то в 2 замены(или поиск+замена) с промежуточной обработкой...

Шаблоны в перле работают быстро - это все знают. Так зачем извращаться?

1 файл - 1 шаблон, а зачем пачку шаблонов в один файл?

Отправлено: 00:50, 04-06-2006 | #7


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


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

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 00:56, 04-06-2006 | #8


Новый участник


Сообщения: 24
Благодарности: 1

Профиль | Отправить PM | Цитировать


Vlad Drakula, согласен, как только крупные "блоки" меняют местами - лезем в код. С другой стороны отрабатывает почти мгновенно
Каждому свое

Отправлено: 01:41, 04-06-2006 | #9


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


На дату первого поста гляньте. Этому топику четыре года. Наврняка в моём мировозрении что-то за это время поменялось, не находите?

-------
http://ivank.ru


Отправлено: 02:08, 04-06-2006 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Шаблоны

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Шаблоны и исходники проекта prokazzza Проект WinStyle 26 16-12-2009 23:39
Административные шаблоны Dr.FRECH Microsoft Windows NT/2000/2003 0 18-10-2007 09:38
MSFT SQL Server - Шаблоны отчетов dzhserv Программирование и базы данных 1 04-09-2007 17:51
перегруженные шаблоны papam Программирование и базы данных 1 28-11-2005 11:29
Шаблоны сайтов.... Guest Вебмастеру 2 25-05-2004 17:55




 
Переход