шаблонизация дизайна сайта
я впервые реализовал шаблонизацию и поэтому у меня возникли некоторые вопросы:
код xml документа(код. 1)
<document>
<head>
<title>%TITLE%</title>
<meta>%META%</meta>
</head>
<body>
<top_panel>
<date>%DATE%</date>
<panel>%PANEL%</panel>
</top_panel>
<logo>
<logotype />
<menu>%MENU%</menu>
<script>%SWFObject%</script>
</logo>
<work>
<work_top />
<word>%WORD%</word>
<copyright>%COPY%</copyright>
</work>
<dottom_menu>
<menu>%MENU%</menu>
</dottom_menu>
</body>
</document>
php код обработчик(код. 2)
/* ----- GROUP REPLASE TEMPLATE XML ----- */
var $replace_temp_pat_doctype = "/<\?xml version=\"[0-9\.]*\" encoding=\"(.*?)\"\?>
<document>
<head>/";
var $replace_temp_rep_doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=\\1\" />";
var $replace_temp_pat_document = "</document>";
var $replace_temp_rep_document = "</html>";
var $replace_temp_pat_meta = "<meta>%META%</meta>";
var $replace_temp_rep_meta = "%META%";
var $replace_temp_pat_body = "<body>";
var $replace_temp_rep_body = "<body%OPTION%>";
var $replace_temp_pat_top_panel = "<top_panel>";
var $replace_temp_rep_top_panel = "<div id=\"top_panel\">";
var $replace_temp_pat_top_panel_end = "</top_panel>";
var $replace_temp_rep_top_panel_end = "</div>";
var $replace_temp_pat_logotype = "<logotype />";
var $replace_temp_rep_logotype = "<div id=\"logo_img\"><img src=\"%LOGO%\" alt=\"\" /></div>";
var $replace_temp_pat_date = "<date>%DATE%</date>";
var $replace_temp_rep_date = "<div id=\"date_panel\">%DATE%</div>";
var $replace_temp_pat_panel = "<panel>%PANEL%</panel>";
var $replace_temp_rep_panel = "<div id=\"mini_panel\">%PANEL%</div>";
var $replace_temp_pat_logo = "<logo>";
var $replace_temp_rep_logo = "<div id=\"logo\">";
var $replace_temp_pat_logo_end = "</logo>";
var $replace_temp_rep_logo_end = "</div>";
var $replace_temp_pat_menu = "<menu>%MENU%</menu>";
var $replace_temp_rep_menu = "<div class=\"menu\">%MENU%</div>";
var $replace_temp_pat_script = " <script>%SWFObject%</script>";
var $replace_temp_rep_script = "%SWFObject%";
var $replace_temp_pat_work = "<work>";
var $replace_temp_rep_work = "<div id=\"work\">";
var $replace_temp_pat_work_end = "</work>";
var $replace_temp_rep_work_end = "</div>";
var $replace_temp_pat_work_top = "<work_top />";
var $replace_temp_rep_work_top = "<div id=\"work_top\"></div>";
var $replace_temp_pat_word = "<word>%WORD%</word>";
var $replace_temp_rep_word = "<div id=\"work_word\">%WORD%</div>";
var $replace_temp_pat_copyright = "<copyright>%COPY%</copyright>";
var $replace_temp_rep_copyright = "<div id=\"copyright\">%COPY%</div>";
var $replace_temp_pat_dottom_menu = "<dottom_menu>";
var $replace_temp_rep_dottom_menu = "<div id=\"dottom_menu\">";
var $replace_temp_pat_dottom_menu_end = "</dottom_menu>";
var $replace_temp_rep_dottom_menu_end = "</div>";
/* ----- END GROUP REPLASE TEMPLATE XML ----- */
}
class Design_Tamplate extends Constant_group {
/* Replace template(xml) */
function template_replace(){
$template = $this->template;
/* xml <tag> */
$template = preg_replace($this->replace_temp_pat_doctype, $this->replace_temp_rep_doctype, $template);
$template = str_replace($this->replace_temp_pat_document, $this->replace_temp_rep_document, $template);
$template = str_replace($this->replace_temp_pat_top_panel, $this->replace_temp_rep_top_panel, $template);
$template = str_replace($this->replace_temp_pat_top_panel_end, $this->replace_temp_rep_top_panel_end, $template);
$template = str_replace($this->replace_temp_pat_meta, $this->replace_temp_rep_meta, $template);
$template = str_replace($this->replace_temp_pat_body, $this->replace_temp_rep_body, $template);
$template = str_replace($this->replace_temp_pat_logotype, $this->replace_temp_rep_logotype, $template);
$template = str_replace($this->replace_temp_pat_date, $this->replace_temp_rep_date, $template);
$template = str_replace($this->replace_temp_pat_panel, $this->replace_temp_rep_panel, $template);
$template = str_replace($this->replace_temp_pat_logo, $this->replace_temp_rep_logo, $template);
$template = str_replace($this->replace_temp_pat_logo_end, $this->replace_temp_rep_logo_end, $template);
$template = str_replace($this->replace_temp_pat_menu, $this->replace_temp_rep_menu, $template);
$template = str_replace($this->replace_temp_pat_script, $this->replace_temp_rep_script, $template);
$template = str_replace($this->replace_temp_pat_work, $this->replace_temp_rep_work, $template);
$template = str_replace($this->replace_temp_pat_work_end, $this->replace_temp_rep_work_end, $template);
$template = str_replace($this->replace_temp_pat_work_top, $this->replace_temp_rep_work_top, $template);
$template = str_replace($this->replace_temp_pat_word, $this->replace_temp_rep_word, $template);
$template = str_replace($this->replace_temp_pat_copyright, $this->replace_temp_rep_copyright, $template);
$template = str_replace($this->replace_temp_pat_copyright, $this->replace_temp_rep_copyright, $template);
$template = str_replace($this->replace_temp_pat_dottom_menu, $this->replace_temp_rep_dottom_menu, $template);
$template = str_replace($this->replace_temp_pat_dottom_menu_end, $this->replace_temp_rep_dottom_menu_end, $template);
}
}
результат после обработки(код. 3)
[HTML]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>%TITLE%</title>
%META%
</head>
<body%OPTION%>
<div id="top_panel">
<div id="date_panel">%DATE%</div>
<div id="mini_panel">%PANEL%</div>
</div>
<div id="logo">
<div id="logo_img"><img src="%LOGO%" alt="" /></div>
<div class="menu">%MENU%</div>
%SWFObject%
</div>
<div id="work">
<div id="work_top"></div>
<div id="work_word">%WORD%</div>
<div id="copyright">%COPY%</div>
</div>
<div id="dottom_menu">
<div class="menu">%MENU%</div>
</div>
</body>
</html>[/HTML]
и соответственно php код обработчик(код. 4)
/* ----- GROUP XML ----- */
var $rss_xml = "%RSS%";
var $url_xml = "%URL%";
var $title_xml = "%TITLE%";
var $meta_xml = "%META%";
var $option_xml = "%OPTION%";
var $logo_xml = "%LOGO%";
var $date_xml = "%DATE%";
var $panel_xml = "%PANEL%";
var $menu_xml = "%MENU%";
var $SWFObject_xml = "%SWFObject%";
var $word_xml = "%WORD%";
var $copy_xml = "%COPY%";
var $description_xml = "%DESCRIPTION%";
var $pointer_orange_xml = "%P_ORANGE%";
var $pointer_gray_xml = "%P_GRAY%";
var $pointer_green_xml = "%P_GREEN%";
var $hr_xml = "%HR%";
var $indent_xml = "%INDENT%";
var $flash_xml = "%FLASH%";
/* ----- END GROUP XML ----- */
}
class Design_Tamplate extends Constant_group {
/* Replace template(xml) */
function template_replace(){
/* xml %ID% */
$template = str_replace($this->title_xml, $this->title, $template);
$template = str_replace($this->meta_xml, $this->meta, $template);
$template = str_replace($this->option_xml, $this->body_option, $template);
$template = str_replace($this->logo_xml, $this->logo_image, $template);
$template = str_replace($this->date_xml, $this->today_date, $template);
$template = str_replace($this->panel_xml, $this->panel, $template);
$template = str_replace($this->menu_xml, $this->menu, $template);
$template = str_replace($this->SWFObject_xml, $this->SWFObject, $template);
$template = str_replace($this->word_xml, $this->word, $template);
$template = str_replace($this->copy_xml, $this->copyright, $template);
$this->template = $template;
}
}
Вопрос первый:
У меня вполне симпотичный xml шаблончик(код 1), но вся работа производится с к кодом 3, 4.
Возникает вопрос - может стоит код 3 сразу записывать в xml шаблон, тогда не придется выполнять замену(код 2)?
Но кодом 3 смотрится не так как кодом 1. Что делать?
Вопрос второй:
Нормальная ли у меня реализация в целом?
PS напоминаю, я первый раз реализовываю шаблонизацию
PSS в коде 2, 4 совпадают названия классов и функции. насамом деле это один код из двух классов и одной функции.
<document>
<head>
<title>%TITLE%</title>
<meta>%META%</meta>
</head>
<body>
<top_panel>
<date>%DATE%</date>
<panel>%PANEL%</panel>
</top_panel>
<logo>%LOGO%</logo>
<work>
<word>%WORD%</word>
<copyright>%COPY%</copyright>
</work>
<dottom_menu>%MENU%</dottom_menu>
</body>
</document>
и обработку упростить(код 2)
/* ----- GROUP REPLASE TEMPLATE XML ----- */
var $replace_temp_pat_doctype = "/<\?xml version=\"[0-9\.]*\" encoding=\"(.*?)\"\?>
<html>
<head>/";
var $replace_temp_rep_doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=\\1\" />";
var $replace_temp_pat_word = "<document>
<head>
<title>%TITLE%</title>
<meta>%META%</meta>
</head>
<body>
<top_panel>
<date>%DATE%</date>
<panel>%PANEL%</panel>
</top_panel>
<logo>%LOGO%</logo>
<work>
<word>%WORD%</word>
<copyright>%COPY%</copyright>
</work>
<dottom_menu>%MENU%</dottom_menu>
</body>
</document>";
var $replace_temp_rep_word = "<html>
<head>
<title>%TITLE%</title>
%META%
</head>
<body%OPTION%>
<div id=\"top_panel\">
<div id=\"date_panel\">%DATE%</div>
<div id=\"mini_panel\">%PANEL%</div>
</div>
<div id=\"logo\">
<div id=\"logo_img\"><img src=\"%LOGO%\" alt=\"\" /></div>
<div class=\"menu\">%MENU%</div>
%SWFObject%
</div>
<div id=\"work\">
<div id=\"work_top\"></div>
<div id=\"work_word\">%WORD%</div>
<div id=\"copyright\">%COPY%</div>
</div>
<div id=\"dottom_menu\">
<div class=\"menu\">%MENU%</div>
</div>
</body>
</html>";
/* ----- END GROUP REPLASE TEMPLATE XML ----- */
}
class Design_Tamplate extends Constant_group {
/* Replace template(xml) */
function template_replace(){
$template = $this->template;
/* xml <tag> */
$template = str_replace($this->replace_temp_pat_word, $this->replace_temp_rep_word, $template);
$template = preg_replace($this->replace_temp_pat_doctype, $this->replace_temp_rep_doctype, $template);
}
}
результат тот же
хотя такой вариант не так эластичен как предыдущий
как раньше об этом не подумал незнаю
код 2:
отдельный файл
/* ----- GROUP REPLASE TEMPLATE XML ----- */
var $replace_template_doctype_pat = "/<\?xml version=\"[0-9\.]*\" encoding=\"(.*?)\"\?>
<document>
<head>/";
var $replace_template_doctype_rep = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=\\1\" />";
var $replace_template = array(
array("</document>", "</html>"),
array("<meta>%META%</meta>", "%META%"),
array("<body>", "<body%OPTION%>"),
array("<top_panel>", "<div id=\"top_panel\">"),
array("</top_panel>", "</div>"),
array("<logotype />", "<div id=\"logo_img\"><img src=\"%LOGO%\" alt=\"\" /></div>"),
array("<date>%DATE%</date>", "<div id=\"date_panel\">%DATE%</div>"),
array("<panel>%PANEL%</panel>", "<div id=\"mini_panel\">%PANEL%</div>"),
array("<logo>", "<div id=\"logo\">"),
array("</logo>", "</div>"),
array("<menu>%MENU%</menu>", "<div class=\"menu\">%MENU%</div>"),
array(" <script>%SWFObject%</script>", "%SWFObject%"),
array("<work>", "<div id=\"work\">"),
array("</work>", "</div>"),
array("<work_top />", "<div id=\"work_top\"></div>"),
array("<word>%WORD%</word>", "<div id=\"work_word\">%WORD%</div>"),
array("<copyright>%COPY%</copyright>", "<div id=\"copyright\">%COPY%</div>"),
array("<dottom_menu>", "<div id=\"dottom_menu\">"),
array("</dottom_menu>", "</div>"),
);
/* ----- END GROUP REPLASE TEMPLATE XML ----- */
}
ядро
function template_replace(){
$template = $this->template;
if (isset($this->replace_template_doctype_pat)){
$template = preg_replace($this->replace_template_doctype_pat, $this->replace_template_doctype_rep, $template);
}
for($i=0; $i < count($this->replace_template); $i++){
$template = str_replace($this->replace_template[$i][0], $this->replace_template[$i][1], $template);
}
$this->template = $template;
}
}
и как результат функция ядра(обработчик шаблона) от шаблона практически не зависит
а XML константы из кода 4 можно переработать в логический массив, что тоже очень сильно упрощает дело
/* ----- GROUP XML ----- */
var $xml = array(
'rss' => "%RSS%",
'url' => "%URL%",
'title' => "%TITLE%",
'meta' => "%META%",
'option' => "%OPTION%",
'logo' => "%LOGO%",
'date' => "%DATE%",
'panel' => "%PANEL%",
'menu' => "%MENU%",
'SWFObject' => "%SWFObject%",
'word' => "%WORD%",
'copy' => "%COPY%",
'description' => "%DESCRIPTION%",
'pointer orange' => "%P_ORANGE%",
'pointer gray' => "%P_GRAY%",
'pointer green' => "%P_GREEN%",
'hr' => "%HR%",
'indent' => "%INDENT%",
'flash' => "%FLASH%"
);
/* ----- END GROUP XML ----- */
}
// пример $xml['copy'] вернет %COPY%
и все же
Где великие умы этого форума?
Дайте бедному ламеру толковый совет
Шаблонизатор, по-моему, должен быть проще.
Т.е. есть файл шаблона test.tpl:
[HTML]<html>
<body>
Привет, <b>%Name%</b>
</body>
</html>[/HTML]
В коде пишем то-то типа:
'Name' => "Вася"
));
Получаем на выходе:
[HTML]<html>
<body>
Привет, <b>Вася</b>
</body>
</html>[/HTML]
вобще никакого лишнего xml файла нет
xml файл всего один и в нем записан код 1, а код 3 лишь демонстрация промежуточного этапа который остается в программе и никто его его не видит, тоесть код 1 преабразуется в код 3 и сразу без остановки преобразуется в тот код который увидет пользователь
Т.е. есть файл шаблона test.tpl:
[HTML]<html>
<body>
Привет, <b>%Name%</b>
</body>
</html>[/HTML]
В коде пишем то-то типа:
'Name' => "Вася"
));
Получаем на выходе:
[HTML]<html>
<body>
Привет, <b>Вася</b>
</body>
</html>[/HTML]
недоконца понимаю твою мысль(я вроде зделал все тоже самое).
если же ты подразумевал выкинуть нафиг код 1 и код 2, а в xml документ записывать код 3, то так и надо было говорить
PS это и есть мой основной вопрос([post=212142]Вопрос первый[/post])
Мне кажется проще делать по принципу смарти
$view->display('template.tpl');
Зачем писать? Потому что я не знал другого способо
Теперь знаю Smarty. Покапал немного, интересная система, но мне непонравилось и шаблоны какието некрасивые.
Впринцыпи, смысл ее использовать? Кто я? Тупая блондинка или програмист?
Если я буду пользоваться готовыми шаблонами навязанными мне то какой из меня програмист?
Это из серии: "все уже давно написано, давайте не будем писать"
Если мне не будет хватать этого, то перейду на blitz.
Вопрос второй:
Нормальная ли у меня реализация в целом?
PS напоминаю, я первый раз реализовываю шаблонизацию
Независимо от того, какой раз вы реализуете шаблонизацию, то, что у вас получилось никуда не годиться. Основным предназначением шаблонизации является возможность независимой работы программиста и дизайнера. То есть дизайнер должен знать только HTML(и может быть CSS) чтобы менять что-то во внешнем виде сайта. Если используется Smarty, то дизайнер может править CSS и шаблоны Smarty c почти чистым HTML не залазя в код php. У вас он вынужден будет ковырятся в php-скрипте редактируя значения строковых переменных и str_replace который эту переменную обрабатывает. В итоге непонятно чего вообще вы добились использованием этого шаблонизатора.
Используйте готовые качественные решения и не тратьте время на создание бесполезных вещей. Нет ничего зазорного в том чтобы использовать чужие свободно распространяемые разработки в своих проектах. Более того, это оптимальный вариант, т.к. экономятся и время, и нервы.
p.s. я жив-здоров и вполне нормально работаю несмотря на то, что никогда не создавал шаблонизаторов.
Используйте готовые качественные решения и не тратьте время на создание бесполезных вещей. Нет ничего зазорного в том чтобы использовать чужие свободно распространяемые разработки в своих проектах. Более того, это оптимальный вариант, т.к. экономятся и время, и нервы.
p.s. я жив-здоров и вполне нормально работаю несмотря на то, что никогда не создавал шаблонизаторов.
под словом шаблонизация мы понимаем немножечко разные вещи
нет если говорить глобально то Smarty бесспорно хороший шаблонизатор, а мой код это полный бред, но...
я не добивался полной шаблонизации как в Smarty, а лишь отделения верстки от кода программы, тоесть:
- в файле template.xml общяя структура страницы
- в файле meta.xml набор оснавных мета тегов
- в файле style.css набор всех стилей
- в файлах style_ie.css, style_ff.css, style_saf.css, style_nn.css набор стилей для оптимезации под браузеры
- в файле _constant.php набор констант большая часть которых отвечает за дизайн(эти данные позднее будут перенесены в БД)
а систематизировать управление данными при такой структурой проще некуда
если правельно систематизировать, то даже тупой юзвер справится
PS по такой же системе структурированны форумы
PSS не воспринимайте мои слова в штыки, я лишь говорю о том что такой вариант решения задачи тоже имеет право на существования и более того им пользуются
А вот это вообще ужасно. Сядь и подумай на эту тему. Если покажется, что ты прав, то думай до тех пор, пока не поймёшь обратное. PHP вообще ничего не должен знать об дизайне!!!! Шаблонизаторы сделали люди, отделить логику от представления (мой идеал это MVC :)). Для дизайна существует CSS и не пытайся перевернуть это представление (уже пытались и не раз).
А вот это вообще ужасно. Сядь и подумай на эту тему. Если покажется, что ты прав, то думай до тех пор, пока не поймёшь обратное. PHP вообще ничего не должен знать об дизайне!!!! Шаблонизаторы сделали люди, отделить логику от представления (мой идеал это MVC :)). Для дизайна существует CSS и не пытайся перевернуть это представление (уже пытались и не раз).
сейчас начнем долго и утомительно спорить:( зачем это?
в моем случае PHP ничего небудет знать о дизайне
пример переменной из _constant.php
"%P_GREEN%",
"%HR%",
...
);
var $html = array(
"<img src=\"design/images/pointer_green.png\" alt=\"\" />",
"<div class=\"hr_line\"></div>",
...
);
for ($i=0;$i<count($xml); $i++){
$text = str_raplase($xml, $html, $text);
}
как ты думаешь это будет плохо выглядить в бд, табличка из трех столбцов(id - xml - html)?
php нужно знсть только название таблицы
например в админке форума IPB есть табличка(есть ли такое в vBulletin непомню)
xml код1 - картинка1
xml код2 - картинка2
xml код3 - картинка3
и можно изменить картинку для указанного xml кода
так же можно написать код который будет позволять изменять исходный xml код и добовлять новые кодовые обозначения
чем плох такой вариант непонимаю?
хотя верю что есть вариант лучше
Мне кажется проще делать по принципу смарти
$view->display('template.tpl');
Можно, конечно и так. То был лишь один из вариантов.
Как говорится, изобретение своего велосипеда повышает квалификацию программиста. :D
Сейчас использую самописную систему шаблонизации, т.к. она наиболее оптимальная для моего движка, очень гибкая и быстрая. Аналогов не знаю, потому и писал. Правда рождалась она в муках. :D
если только для опыта... и в свободное время ;)
2 dead_star:
чёт я это, подумал (что уже доказывает следующее :D), и решил ))) что я нихрена не блондинка ))) хоть и юзал смарти в одном из движков.
написать своё - потратить время, в моём случае точно ) потому что времени нет, а работу делать надо, по сему отвлекаться на написание шаблонизатора.... кхкх, в общем, я лично не стану ) если не прибьёт )
а вы, сударь, судите слишком категорично -)))
никто вам не сказал что смарти кул, а ваш код дерьмо )) но согласитесь, он требует не малой доработки (соглашусь с shaelf, отделить логику от представления)...
в общем - Желаю УДАЧИ и терпения! =) мож чего-нить и выйдет ;)
PS: благо мне на PHP мало приходится писать... и редко :)