примерно вот так (если я правильно понял вопрос): PHP: <?php function parsetpl($file) { $tpl = @file_get_contents($file); $content = @preg_replace('/{([a-zA-Z_0-9]+)}/e', '$GLOBALS[${1}]', $tpl); return $content; } ?>
то есть набор символов начинающийся и заканчивающийся фигурными скобками заменяется на переменную $Globals?
Кстати, на счёт http://www.massassi.com/php/articles/template_engines/ Кто что скажет ? Я вот считаю что код в статье мог бы быть более аккуратным, однако в целом ИМХО лучшая статья на эту тему.
Vladson, последняя фраза 100 баллов! «In short, the point of template engines should be to separate your business logic from your presentation logic, not separate your PHP code from your HTML code.» О чем всю жизнь твержу...
Мне там больше всего нравится сам шаблонизатор (для себя правда я подправил его немного) все его плюсы очевидны: - Выполняет все свои функции - Настолько простой что запутаться в нём просто невозможно продолжать можно долго Но главное что шаблонизатор даже без самой статьи говорит всё сам за себя, до того как прочитал статью я сначала глянул на пример использования и на сам шаблонизатор, после чего статья читалась уже просто "для галочки" Прочитав статью любой новичок может понять что такое шаблонизация. (а если не новичок в коде, но есть проблемы с английским то достаточно глянуть код и всё станет понятно)
У меня появилась такая идея отделения кода от дизайна. Имеем, например документ template.html, выглядит так: Код (Text): <html> <head> <title>Title</title> <meta name=keywords content=Ключевые слова> </head> <body> <p>It's like comparing apples to oranges. </body> </html> Пишу такой примерно код: PHP: <? $title = "New replaced title"; # Новый заголовок $keywords = "New keywords"; # Новые ключевые слова $pat = "/<html>(.*)<body>/iUs"; # Шаблон для поиска верхней части # Шаблон для поиска заголовка и ключевых слов $head_pat = "/(<title>)(.*)(<\/title>)(.*)(<meta name=keywords content=)(.*)(>)/iUs"; # Ищем совпадения с шаблоном if(preg_match($head_pat, file_get_contents("template.html"), $matches)) { # Заменяем, найденный по шаблону текст $longstr = preg_replace($head_pat, $matches[1].$title.$matches[3].$matches[5].$keywords.$matches[7], file_get_contents("template.html")); } else { print 'Промах'; } # Отделяем верхнюю часть if(preg_match($pat, $longstr, $matches)) { print $matches[0]; } else { print 'Промах'; } ?> <div align=center> Здесь вставляем нужный контент </div> <? print stristr($longstr, "</body>"); # Выводим нижнюю часть ?> Хочу узнать мнение профессионалов. Стоит, ли развивать дальше такую идею, или она в чём-то ущербна?
Davil, проблемы нет. Просто я учусь и меня интересует критика опытных людей, исключительно в образовательных целях.
Jahont тогда посмотри исходники готовых шаблонизаторов и подумай что в них удобно, а что - нет. Когда уясняеш для себя сам - это лучше чем слушать непонятную критику других людей. Думай по своему. Не надо подстраиваться под мнение других.
Вот читаю и читаю но понять не могу то что кабы «элементарное» Например: Я храню интерфейс в каком-то файле типа interf.inc мне нужно подставить под {MENUPASS}…и т.д. нужные для этих участков данные, но не могу понять той логики которая выполняется в данной статье. По какому же этапу и вообще выполняются подобного рода действии, объясните для совершенно не въезжающего?
Например: PHP: <?<html> <head> <title>{%TITLE%}</title> <link type="text/css" rel="StyleSheet" href="114.css"> </head> <body bgcolor="#FFFFFF" topmargin="0" leftmargin="0" rightmargin="0" bottommargin="15" marginwidth="0" marginheight="0" style="padding:10px;"> <!-- Header --> <table border="0" cellpadding="0" cellspacing="0" width="800" align="center" > <tr><td bgcolor="#EBEBEB" width="11"><img border="0" src="t1.gif" width="11" height="21"></td> <td bgcolor="#EBEBEB" width="670" background="bg.gif" class="copy"> </td> <td bgcolor="#EBEBEB" width="119"><img border="0" src="d2.gif" width="119" height="21"></td></tr> </table> <table class="topBorder" border="0" cellpadding="0" cellspacing="0" width="800" height="60" align="center"> <tr> <td bgcolor="#383838" background="tbg.gif"> </td> </tr> </table> <table border="0" cellpadding="0" cellspacing="0" width="800" align="center"> <tr> <td bgcolor="#EBEBEB" width="119"><img border="0" src="d3.gif" width="119" height="21"></td> <td bgcolor="#EBEBEB" width="670" background="bg.gif" align="right" class="copy"> </td> <td bgcolor="#EBEBEB" width="11"><img border="0" src="t2.gif" width="11" height="21"></td></tr> </table> <!-- /Header --> <br> <table border="0" cellpadding="0" cellspacing="0" width="800" align="center"> <tr> <td width="200" valign="top"> <table border="0" cellpadding="0" cellspacing="0" width="190"> <tr><td> <table border="0" bgcolor="#E4E4E4" cellpadding="0" cellspacing="0" width="100%"> <tr> <td width="2%"><img border="0" src="t1.gif" width="11" height="21"></td> <td width="70%" background="bg.gif"> <div class="blockTitle"></div> </td> <td width="28%"><img border="0" src="b3.gif" width="54" height="21"></td> </tr> </table> </td> </tr> <tr> <td class="topBorder" style="padding:3px;" bgcolor="#F4F4F4"> <div align="center">{%MENU%}</div> </td> </tr> <tr><td bgcolor="#E4E4E4"><img border="0" src="b2.gif" width="190" height="21"></td></tr> </table> <div style="padding:3px"></div> <!-- /Site Menu --> </td> <td valign="top" height="100%"> <table border="0" cellpadding="0" cellspacing="0" width="600" height="100%"> <tr> <td bgcolor="#E4E4E4" height="21"><img border="0" src="d1.gif" width="119" height="21"></td> <td bgcolor="#E4E4E4" width="362" background="bg.gif" align="center" height="21"> <div class="blockTitle" align="center"></div> </td> <td bgcolor="#E4E4E4" height="21"><img border="0" src="d2.gif" width="119" height="21"></td> </tr> <tr> <td colspan="3" class="topBorder" style="padding:3px;" width="600" valign="top" height="100%">{%TEXT%}</td> </tr> <tr> <td bgcolor="#E4E4E4" height="21"><img border="0" src="d3.gif" width="119" height="21"></td> <td bgcolor="#E4E4E4" width="362" background="bg.gif" align="center" class="copy" height="21"> </td> <td bgcolor="#E4E4E4" height="21"><img border="0" src="d4.gif" width="119" height="21"></td> </tr> </table> </td> </tr> </table> </body> </html>?> Визуально вот
в твоем случае 1. надо поменять {%TITLE%} на {TITLE} 2. загрузить в буфер шаблон и распарсить его $TITLE = 'Заголовок'; $BODY = new Buffer('template.inc'); $BODY->parse(); $BODY->Show();
Pasha можешь посмотреть мою функцию-шаблонизатор: http://www.php.ru/forum/viewtopic.php?t=1629&start=30 она проще чем у 440hz p.s. функция рабочая, но я не рекомендую её к использованию. скорее я написал её, чтобы показать идею.
Как-то мне не очень нравится что класс создания шаблона работает с глобальными переменными неявно. На мой взгляд, это источник ошибок.
Почему отказывается выводить вот такую структуру: PHP: $microtime = explode(" ",microtime()); $time = round($microtime[0], 4); в шаблоне стоит - {time} еще три десятка переменных отпарсены нормально. если убрать округление, то вывод нормальный. если вывести переменную с помощью echo и print_r, то выводится ожидаемое число. пробовал переприсваивать его значение еще одной переменной, эффект тот же.. пробовал после этого значения (оно последнее) выводить другие - выводится нормально..
DarkElf, не понятно в каком виде хочешь вывести число. Как целое или с плавающей точкой и нулями после точки? Функция round() выдает тип float, т.е. $time это float. Если хочешь целого, то нужно его intval()-ом, например.
DarkElf Потому что в коде шаблонизатора стоит проверка - вывод только строк и целых чисел. 440Hz Как и предрекали в первом посте темы, этот код будут использовать все кому не лень
кому не лень, тот внимательно прочитает и будет понимать что к чему. кому действительно лень вникать и Copy+Paste любимые команды помочь ничем не могу. Это клиника.
# выбираем только строки и числа if(is_string($val) OR is_int($val)) { прочти внимательно и осмысли почему? если не понятно $tmie = 'строка'; вывод $time = 777; вывод $time = 0.0; фтопку ...