Forum Webscript.Ru
Программирование => PHP => Тема начата: D1g174LM4n14c от 18 Апреля 2003, 17:50:53
-
Тема шаблонов в PHP поднимается часто...
Каждый раз кто-то предлагает свои классы, половина из которых сразу обливаются грязью и забываются.
Все же я не посмотрел на это. Зря наверно :)
Читал тут про FastTemplate и решил написать свой класс, похожий на FT. Зацените пожалуйста: что нравиться, что не нравиться, что нужно поменять...
Скажу честно, весь нижеприведенный код я писал 10-15 минут максимум... Не реализовал динамические блоки как в ФастТемплейте, но это неважно... надо будет - сделаю...
В общем, вот сам код:
class Template
{
var $path = \'templates\';
var $tpls = array();
var $vars = array();
var $rl = \'{\'; // variable limiters
var $ll = \'}\'; //
var $ext = \'.tpl\';
////////////////////////////////////////////////////////////////////////////////
function Template($path = 0)
{
$this->path = ($path === 0 ? $this->path : $path);
}
function define($tpl, $filename = 0)
{
if (is_array($tpl))
{
foreach ($tpl as $key => $val)
$this->tpls[$key] = $val;
}
else $this->tpls[$tpl] = $filename;
}
function assign($var, $value = 0)
{
if (is_array($var))
{
foreach ($var as $key => $val)
$this->vars[$key] = $val;
}
else $this->vars[$var] = $value;
}
function parse($var, $tpl)
{
$tpl = file_get_contents($this->path.\'/\'.$this->tpls[$tpl].$this->ext);
foreach ($this->vars as $key => $val)
$tpl = str_replace($this->rl.$key.$this->ll, $val, $tpl);
$this->vars[$var] = $tpl;
}
function output($tpl)
{
echo $this->vars[$tpl];
}
}
?>
гы. Какой-то он примитивный получился - но пашет как надо.
-
D1g174LM4n14c:
что нравиться
Ничего
D1g174LM4n14c:
что не нравиться, что нужно поменять
Всё. Можешь только имена функций не менять.
D1g174LM4n14c:
Скажу честно, весь нижеприведенный код я писал 10-15 минут максимум...
Что ты хотел получить? Или ты хотел всем показать что ты умеешь писать галимые и практически не функциональные шаблонизаторы? Я своего "зверя" уже наверное пол года пишу (просто мало времени ему уделял и раза три координально менял алгоритм работы) и только недавно закончил ядро и оснастил его "небольшой" функциональностью, а твои 15 минут не просто не существенны, а совершенно ни чего не значат. Лучше возьми какой-нибудь готовый или напиши хороший, хотя хороший шаблонизатор это ОЧЕНЬ спорное понятие.
-
Но почему же?
То что я написал работает как надо. Относительно быстро.
Да и код получается довольно выразительный.
toplevel.tpl
{TL_TITLE}
{HEADER}
{LEFT}
{CONTENT}
{RIGHT}
{FOOTER}
script.php
require \'inc/class.template.php\';
$tpl = new Template;
$tpl->define(array(\'TOPLEVEL\' => \'toplevel\',
\'HEADER\' => \'header\',
\'LEFT\' => \'left\',
\'CONTENT\' => \'content\',
\'RIGHT\' => \'right\',
\'FOOTER\' => \'footer\'));
$tpl->assign(\'TL_TITLE\', \'Заголовок страницы\');
$tpl->parse(\'MT_HEADER\', \'HEADER\');
$tpl->parse(\'MT_LEFT\', \'LEFT\');
$tpl->parse(\'MT_CONTENT\', \'CONTENT\');
$tpl->parse(\'MT_RIGHT\', \'RIGHT\');
$tpl->parse(\'MT_FOOTER\', \'FOOTER\');
$tpl->parse(\'TOPLEVEL\', \'TOPLEVEL\');
$tpl->output(\'TOPLEVEL\');
?>
-
Tronyx:
Или ты хотел всем показать что ты умеешь писать галимые и практически не функциональные шаблонизаторы?
конечно, согласен что это не совершенство... но я считаю, что если ты делаешь для себя какой-то класс, то нужно реализовать в нем ТОЛЬКО те функции, которыми ты пользуешься. Зачем писать больше? Это-же не стандартную библиотеку пишешь!
-
D1g174LM4n14c:
нужно реализовать в нем ТОЛЬКО те функции, которыми ты пользуешься
Я тоже так считаю. Но ты просил оценить, я оценил.
-
нет. за оценку, конечно, спасибо!
только я не понимаю, что можно сюда еще добавить кроме функциональности? Или есть способы реально оптимизировать реализованные функции? В частности str_replace заменить на что-то более быстрое...
-
Зацените.
малофункциональный (хотя признаю что быстрый)
-
функции - это так... главное чтобы работало хорошо и быстро. короче, как тебе надо! если надо что-то новое - добавить всегда можно. А так - просто и быстро :D
-
если хочешь скорости, возьми http://php-templates.sourceforge.net/
Там функциональность в порядке.
-
посмотрю... ради интереса... спасибо.
-
D1g174LM4n14c:
только я не понимаю, что можно сюда еще добавить кроме функциональности?
1. Разрешить php код в шаблоне.
2. Контроль ошибок ("блок не найден", "Неверный формат параметра" и т.п.), но это имеет смысл делать если у тебя функционал побольше.
3. Модульность(?)
4. Отказаться от assign (?) - сейчас меня Макс будет "ругать" за это ;)
D1g174LM4n14c:
В частности str_replace заменить на что-то более быстрое...
Компиляция в PHP код, тогда шаблон подключается обычным include`ом
-
Tronyx:
Контроль ошибок ("блок не найден", "Неверный формат параметра" и т.п.), но это имеет смысл делать если у тебя функционал побольше.
я же говорил, что это не библиотечный класс. Зачем делать обработку ошибок в своем же классе. Главное - внимательно писать код - тогда не нужно будет тратить время на обработку ошибок.
Tronyx:
Модульность(?)
а что ты имеешь ввиду под модкльностью в данном контексте?
Tronyx:
Компиляция в PHP код, тогда шаблон подключается обычным include`ом
ды, с таким же успехом можно обойтись вообще без шаблонизаторов. просто в нужных местах юзать include\\require операторы...
-
Tronyx:
Разрешить php код в шаблоне.
реально. вот как я это сделал:
вместо кода
$tpl = file_get_contents($this->path.\'/\'.$this->tpls[$tpl].$this->ext);я сделал так:
ob_start();
require $this->path.\'/\'.$this->tpls[$tpl].$this->ext;
$tpl = ob_get_contents();
ob_end_clean();
be simple! ;)
-
Tronyx
4. Отказаться от assign (?) - сейчас меня Макс будет "ругать" за это
неее, ругать буду за :1. Разрешить php код в шаблоне.
;) ИМХО это противоречит самой идеологии шаблонов
Дизайнер (или html-кодер) тебе там такого php-кода напишет :D
Насчет отказа от assign-а
ты имеешь ввиду сделать как в шаблонизаторе Britva-ы, где шаблонизатор использует для подстановки меток переменные из глобального пространства имен ? И таким образом не нужно делать assign.
-
Макс:
Разрешить php код в шаблоне
ну почему бы и нет? есть некоторые "моменты", которые намного прроще сделать со вставкой ПХП-кода в шаблон, чем геммороиться с подставляемыми переменными... хотя с другой стороны - ты прав. Это не абстрагирует html от php, а шаблоны как раз и преследуют эту цель.
Макс:
Насчет отказа от assign-а
ты имеешь ввиду сделать как в шаблонизаторе Britva-ы, где шаблонизатор использует для подстановки меток переменные из глобального пространства имен ? И таким образом не нужно делать assign.
м-да... мусора много и, как я уже говорил,
D1g174LM4n14c:
ды, с таким же успехом можно обойтись вообще без шаблонизаторов. просто в нужных местах юзать include\\require операторы...
-
а вообще смысл всего этого кода если в итоге получается надо писать то же самое что и в данном случае
$patterns = array (
"%tool%",
"%header%",
"%maintext%",
"%rootfolder%",
"%spacer%")
$replacements = array (
$tool,
$header,
$maintext,
$rootfolder,
$spacer);
$tpl = str_replace($patterns, $replacements, $tpl);
я не вижу смысла написания этого класса?
-
Tronyx:
1. Разрешить php код в шаблоне.
Вот это блин круто :))). Вообще-то вся фича PHP и состоит в том, что можно вставлять код в html-файл, если ты не в курсе ;).
А теперь ты предлагаешь шаблонизатор, который релизует функциональность, реализованую в самом интерпретаторе.
Зачем?
-
nagash:
я не вижу смысла написания этого класса?
да, но я все это дорабатываю, придаю выразительности, функциональности и т.д.
Croaker:
А теперь ты предлагаешь шаблонизатор, который релизует функциональность, реализованую в самом интерпретаторе.
а зачем изобретать колесо? можно, конечно, парсить html и искать php-код, а затем его в eval()... а смысл? если и так работает...
-
nagash:
а вообще смысл всего этого кода если в итоге получается надо писать то же самое что и в данном случае
$patterns = array (
"%tool%",
"%header%",
"%maintext%",
"%rootfolder%",
"%spacer%")
$replacements = array (
$tool,
$header,
$maintext,
$rootfolder,
$spacer);
$tpl = str_replace($patterns, $replacements, $tpl);
не совсем так... тут ты просто заменяешь одни "переменные" другими... а в том классе, что мы обсуждаем, переменным присваеваются результаты парсинга шаблонав, а затем они (переменные) используются в других шаблонах, потом в третьих и т.д. Структура ЕСТЬ!
-
Разрешите вставить свои пять копеек...;)
Енто всё конечно круто, но зачем собаке пятая нога?...( без обид...)
-
D1g174LM4n14c:
я же говорил, что это не библиотечный класс. Зачем делать обработку ошибок в своем же классе. Главное - внимательно писать код - тогда не нужно будет тратить время на обработку ошибок.
Если пишишь для себя то да, а если на продажу, где "за рулём" сидит НЕпрограммист... будешь дописывать свой класс? Нелегче ли сразу это сделать? :)
D1g174LM4n14c:
а что ты имеешь ввиду под модкльностью в данном контексте?
Если ты хочешь добавить какую-то фичу ты не лезешь в код класса, ты создаёшь файл-плагин. Посмотри как Smarty устроен (кстати пока я эту фичу видил только в нём)
D1g174LM4n14c:
ды, с таким же успехом можно обойтись вообще без шаблонизаторов. просто в нужных местах юзать include\\require операторы...
Ты не понял. Используется тот же класс и как в твоём случае, та же функция "output" только происходит не парсинг, а компиляция. Разницу видишь?
Макс:
ИМХО это противоречит самой идеологии шаблонов
Дизайнер (или html-кодер) тебе там такого php-кода напишет
Полностью согласен. Меня просили привести пример того как можно наворотить, а можно != нужно.
Макс:
ты имеешь ввиду сделать как в шаблонизаторе Britva-ы, где шаблонизатор использует для подстановки меток переменные из глобального пространства имен ? И таким образом не нужно делать assign.
Да. Только как это сделано у Бритвы мне не нравится, там ещё eval() с вызовом какой-то функции нужен, а посути это тот же assign(). У меня проще:
скрипт:
$QuickTemplate=new QuickTemplate(\'template.tpl\');
$var=\'Переменная\';
$QuickTemplate->PrintPage();
?>
Шаблон:
Var={$var}
Croaker:
Вот это блин круто )). Вообще-то вся фича PHP и состоит в том, что можно вставлять код в html-файл, если ты не в курсе
Вот это блин какой ты крутой и чертовски "умный". :D Попробуй например в шаблоне для FastTemplate(или каком-нибудь похожем) писать на PHP. Если не "заложить" эту функцию, то у тебя ничего не получится.
-
Tronyx:
Вот это блин какой ты крутой и чертовски "умный". Попробуй например в шаблоне для FastTemplate(или каком-нибудь похожем) писать на PHP. Если не "заложить" эту функцию, то у тебя ничего не получится.
В FastTemplate нельзя. Потому как основной смысл написания шаблонов - отделения html от PHP. А шаблон, в котором будет использоватся PHP вставка... Весь смысл пропадает (вместе со скоростью).
-
Макс:
ИМХО это противоречит самой идеологии шаблонов
Дизайнер (или html-кодер) тебе там такого php-кода напишет
------------------
Полностью согласен. Меня просили привести пример того как можно наворотить, а можно != нужно.
Croaker:
вместе со скоростью
Если применять компиляцию шаблонов(например как в Smarty) скорость совершенно не тереятся.
-
Tronyx
Да. Только как это сделано у Бритвы мне не нравится, там ещё eval() с вызовом какой-то функции нужен, а посути это тот же assign(). У меня проще:
Вообще я в последенее время тоже склоняюсь к идее отказа от assign, только ИМХО разумнее шаблонизатором не переменные использовать, а какой-то массив:
// первый параметр - папка с шаблонами
// имя массива со значениями меток
$tmpl = new Template(\'./templates/dir/\', \'_vars\');
...
// установка переменных шаблона
$_vars = array(\'label1\'=>\'text 1\', \'label2\'=>\'text2\');
echo $tmpl->toHtml(); // вывод пропарсенного шаблона
Так будет хотя бы какое-то разделение пространства имен.
А то дизайнер тебе напишет в шаблоне
{$dbhost}
{$dbuser}
{$dbpass}
{$dbname}
и любой увидит параметры доступа к БД
-
Макс:
А то дизайнер тебе напишет в шаблоне
{$dbhost}
{$dbuser}
{$dbpass}
{$dbname}
и любой увидит параметры доступа к БД
[OFF]
Руки таким дизайнерам надо отрывать :)
А вообще, дизайнер и программер - одна команда! Зачем друг-другу заподлянки устраивать :) ?
[/OFF]
-
FreeSpace
[off] это я просто пример привел, почему следует разделять переменные шаблонизатора от глобальных переменных скрипта [/off]
-
FreeSpace:
А вообще, дизайнер и программер - одна команда!
Иногда нет, Макс правильно говорит.
Макс:
Вообще я в последенее время тоже склоняюсь к идее отказа от assign
:beer: А я уж думал сейчас начнётся жудкий спор, как на Xpoint :)
Макс:
А то дизайнер тебе напишет в шаблоне
Всё схвачено. ;) Как правило опасными для вывода могут быть несколько переменных(данные для БД, пароль админа и т.п.) Мы их засовываем в массив $private или ещё какой-нибудь и пишем:
$tpl->BlockVar("private");
или
$tpl->BlockVar(array("admin_pass", "db_host", "db_user", "db_pass"));
И эти переменные в шаблоне нельзя использовать.