Здравствуйте, вообщем я пишу движок для сайта, предполагается что в дальнейшем двиг будет использоваться и на других сайтах, поэтому встал вопрос о шаблонах, как лучше реализовать такую систему? Предполагается наличие парсера, желательный вид например главного шаблона: PHP: <html> <title><% TITLE %></title> </head> <body> <% CONTENT %> </body> </html> Т.е. проще говоря должны будут заменяться спец.теги на нужную информацию.
! не использовать <% %> - это теги ASP вроде как... у меня реализованно криво, но могу подсказать как все переменные {tpl:ИМЯ_ПЕРЕМЕННОЙ} блоки в виде <!--BEGIN имя_блока--> и <!--END имя_блока--> ну и соответственно набор функций для замены. их могу выложить и описать работу, но еще раз скажу, что реализация кривая, хотя мои нужды она выполняет. *приятного мне аппетита*
Ganzal Ты бы ещё посоветовал молотком по монитору постучать Onyx Почитай вот это http://www.massassi.com/php/articles/template_engines/ и многое станет ясно Если не знаешь английского почитай топик на этом форуме, длинная тема тут есть про шаблоны...
посоветовал бы да не додумался - жрать хотелось Onyx, если поискать то можно реально много реализаций найти. когда я писал свою систему шаблонов мне просто хотелось чтобы она была понятна мне как мои 5 пальцев. это наверное единственный ее плюс если очень нада могу и показать...
"кривой" класс Template PHP: <? //<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> class Template{ var $s; // исходники var $troot; // адрес корня каталога шаблона var $wd; // рабоч function Template( $templateName ) { global $SITE_ROOT; $this->s = array(); $this->wd = array(); $this->troot = $SITE_ROOT . "templates/" . $templateName ."/"; if(! is_dir( $this->troot ) ) { // ошибка - не найден шаблон } } function LoadSource( $alias, $fileName ) { $this->s[$alias] = @file_get_contents($this->troot.$fileName); if(! $this->s[$alias] ) {}// ошибка - не найден файл шаблона else $this->ProcessTPL( $alias ); } function SetVars( $alias, $data=array() ) { if(!isset ($this->wd[$alias])) { if(isset($this->s[$alias]) ) $this->wd[$alias] = $this->s[$alias]; else {}// ошибка - мы еще не загрузили шаблона с таким алиасом } foreach($data as $var => $val) { if( is_array( $val ) ) { $tmp =""; foreach ($val as $ele) { $tmp.= $ele; } $this->wd[$alias] = str_replace("{tpl:".$var."}", $tmp, $this->wd[$alias]); }else { $this->wd[$alias] = str_replace("{tpl:".$var."}", $val, $this->wd[$alias]); } } } function SetBlock ( $alias, $data=array() ) { if(!isset ($this->wd[$alias])) { if(isset($this->s[$alias]) ) { $this->wd[$alias] = array(); }else {}// ошибка - мы еще не загрузили шаблона с таким алиасом } $i = count($this->wd[$alias]); $this->wd[$alias][$i] = $this->s[$alias]; foreach($data as $var => $val) { $this->wd[$alias][$i] = str_replace("{tpl:".$var."}",$val,$this->wd[$alias][$i]); } } function ProcessTPL( $alias ) { $source = $this->s[$alias]; preg_match_all("<!--BEGIN ([0-9A-Za-z_]+)-->",$source,$output); foreach($output[1] as $block) { $pos1 = strpos ($source, "<!--BEGIN $block-->"); $pos2 = strpos ($source, "<!--END $block-->", $pos1); $do = substr($source, 0, $pos1); $posle = substr($source, $pos2+(11+strlen($block)), strlen($source)); $newAliasSource = substr($source, $pos1+(13+strlen($block)), $pos2-$pos1-(13+strlen($block))); $source = $do . "{tpl:" . $block . "}" . $posle; /// create new alias $this->s[$block] = $newAliasSource; $this->ProcessTPL($block); } $this->s[$alias] = $source; } function Show ( $alias = "main") { if(isset($this->wd[$alias])) { $this->wd[$alias]=ereg_replace("\{tpl:([0-9A-Za-z_]+)\}","",$this->wd[$alias]); print($this->wd[$alias]); } else {} // ошибка - мы еще не загрузили шаблона с таким алиасом } } ?> как пользуюсь 1. Код (Text): $tpl = new Template(тема); если папка тема есть то работаем дальше иначе - место для ошибки оставлено 2. Код (Text): $tpl->LoadSource("alias", "filename"); если найден файл filename с шаблоном, то его содержимое заносится в $tpl->s[alias] и тут же производится аля парсинг на предмет наличия блоков. пример файла с темплейтом HTML: <table width="100%" height="100%" bgcolor="{tpl:tablebgcolor}"> <!--BEGIN table--> <tr><td>{tpl:tablerow}</td></tr> <!--END table--> </table> при парсинге получим следущее блок от <!--BEGIN table--> до <!--END table--> будет вырезан в отдельный исодник с алиасом равным имени этого блока (в нашем случае table) а на его месте в исходнике появится место для переменной {tpl:table} то есть мы получим $tpl->s['alias'] HTML: <table width="100%" height="100%" bgcolor="{tpl:tablebgcolor}"> {tpl:table} </table> и $tpl->s['table'] HTML: <tr><td>{tpl:tablerow}</td></tr> причем если каждый блок распарсивается рекурсивно далее при помощи Код (Text): $tpl->SetBlock("table", array("tablerow" => "текст строки таблицы" )); мы заполняем шаблон данными причем при вызове функции SetBlock первым делом точная копия $tpl->s["table"] скопируется в массив $tpl->wd["table"][] и замена будет происходить именно в нем. соответственно нада передать все данные для блока сразу. далее мы заполняем получившимся набором строк блока table нужное место в шаблоне alias Код (Text): $tpl->SetBlock("alias", array("table" => $tpl->wd['table'] )); и последним действием выводим данные на экран Код (Text): $tpl->Show() ! тут если не передать названия алиаса будет совершена попытка выдать алиас по-умолчанию: main при этом мы удалим все лишние {tpl:ПЕРЕМЕННЫЕ} то есть на выходе мы получим следующий код HTML: <table width="100%" height="100%" bgcolor=""> <tr><td>текст строки таблицы</td></tr> </table> обратите внимание что я не передавал значение переменной tablebgcolor и на ее месте ничего нет... (самая моя частая ошибка - верстка летит на раз-два) вот... извините за плохое объяснение, но я старался...
Написал свой класс Template, в отличии от твоего получилось значительно проще и меньше кода. Все работает
http://php.ru/forum/viewtopic.php?p=45997#45997 Там есть и класс по работе с шаблонами. Легко и просто
ты не поверишь... я позавчера выяснил что и у меня он хренова работает.... пришлось вносить кучу изменений...