|
|
|
| Копаю интернет в поисках внятного описания конструирования системы шаблонов. Толи никто не хочет делиться наработками, толи тех кому есть чем поделиться можно перечесть по пальцам, но статьи сводятся к следующему: рассказывают какие-то азы, а затем подразумевается что сам резберешься, либо все сводится к обзору существующих, и продвигается мысль о никчемности изобретания веловипеда.
У меня сейчас следующий код:
<?
//функция обработки шаблона
function tpl($data, $shablon)
{
$page="";
$page=file_get_contents($shablon);
foreach ($data as $key=>$val)
{
$page=str_replace("{".$key."}", $val, $page);
}
return $page;
}
?>
|
а в коде программы вызываются шаблоны и передаются данные:
<?
//формирование новостей
foreach ($newsdata as $tmp)
{
$news_item['DATA']=$tmp;
$news['NEWS_ITEM'].=tpl($news_item, "news_item");
}
//формирование блока новости
$main_page['NEWS']=tpl($news, "news");
//вставка новостей в главный шаблон страницы
$page=tpl($main_page, "index");
//отображение страницы
echo $page;
?>
|
в файле шаблона обычный html, а там где будет новости стоит тег {NEWS}
Естественно, циклические штуки типа меню или новостей рисуются функциями.
Все работает замечательно... но вот смущает меня не очень хорошая читабельность кода, его, на мой взгляд, обилие и недостаточная автоматизация. А так же мне кажется что не может система шаблонов состоять из функции в три строчки:)
Если у кого есть мысли по дальнейшему развитию такого подхода - просьба поделиться. Или ветвь тупиковая и я этого тупика уже достиг?:) | |
|
|
|
|
|
|
|
для: Loki
(21.11.2005 в 22:03)
| | Ну, я в своё время делал сайт на шаблонах :) Т.е. у меня весь HTML-код хранился в базе. Было две таблицы - таблица html-кодов основных страниц и таблица мини-шаблонов. Т.е. основной код берётся из базы и в нём заменяется так называемый replacement text на соответствующий шаблон из второй таблицы, если таковой находится. Вот собственно основной код (прост до безобразия):
Код на выводимой странице (index.php):
<?
include("admincp/config.php");
$result = mysql_query("SELECT html FROM $dirstable WHERE filename='index.php'");
$page_code = mysql_result($result, 0, "html");
include("parser.php");
$page_code = parser("$page_code", "$globtemplatestable");
#### Тут идут вякие функции для данной страницы ###
echo $page_code;
|
И вот собсна parser.php, который производит замену заменяемого текста на соотв. шаблоны из базы:
<?
function parser($page_code, $globtemplatestable) {
$replaces = mysql_query("SELECT replacetext, content FROM $globtemplatestable;");
WHILE ($reptext = mysql_fetch_array($replaces)) {
if($reptext['replacetext'] != "") {
$page_code = str_replace($reptext['replacetext'], $reptext['content'], $page_code);
}
}
return $page_code;
}
?>
Вот так вот :) Работает безотказно, что могу сказать... а усложнить эту систему, в принципе, уже не трудно...
|
| |
|
|
|
|
|
|
|
для: DDK
(21.11.2005 в 22:48)
| | Если я правильно понимаю, то для каждого раздела сайта должен быть свой шаблон?
Кроме того, дизайн, как таковой, никуда не вынесен: то есть его нельзя просто дать дизайнеру для правки?
Если так, то моя система представляется мне значительно более гибкой. | |
|
|
|
|
|
|
|
для: Loki
(21.11.2005 в 22:03)
| | Чего-то не очень понятно... т.е. в качестве первого параметра функции tpl может выступать либо массив, либо обычный скаляр? | |
|
|
|
|
|
|
|
для: cheops
(22.11.2005 в 01:23)
| | Нет. Первый параметр - ассоциированный массив, ключ которого, является тегом для замены.
То есть
$news['NEWS_ITEM']="что-то";
|
в шаблоне заменит тег
А... вижу. В первом сообщении я действительно потерял строчку. поправил | |
|
|
|
|
|
|
|
для: Loki
(22.11.2005 в 09:35)
| | Я делал так:
В файлешаблона в первой строчке писал теги, которые надо заменить
{NEWS}||{CHTO-TO TAM}||{I TD I TP}
|
Затев в функцию обработки шаблона передавались два параметра, имя шаблона и массив содержащий значания кторые надо вставить вместо тегов(массив должен содержать значения в том же порядке что и теги). Принцип тот же , что и описан выше | |
|
|
|
|
|
|
|
для: PantiL
(22.11.2005 в 12:37)
| | Но массив же все равно надо формировать руками? Да еще и следать за порядком следования значений... или я что-то понял неправильно? | |
|
|
|
|
|
|
|
для: Loki
(22.11.2005 в 09:35)
| | Понятно... сложно потому, что вы плавно с императивного стиля программирования переходите на функциональный :))). Так как с функциональным программированием сталкиваются только при решения специфических задач - оно не сильно развито и тяжело воспринимается, так как программисты с ним почти не сталкиваются. К этому просто нужно привыкнуть как к стилю регулярных выражений или SQL. | |
|
|
|
|
|
|
|
для: cheops
(22.11.2005 в 14:18)
| | С функциональному стилу пришлось прибегнуть мне, когда писал CMS для одного сайта (сейчас дописываю). Я просто выносил каждую ф-ю в отдельный инклуд-файл, и если при запросе к скрипту админке требуется та или инаю функция, то скрипт парсинга нужного действия подгружает только инклуды с нужными функциями... Просто, фунцкий у меня около 70 и каждая выполняет свою задачу. Если их грузить все сразу, то это сильно нагружает скрипт и соотв. сервер и тормозит... Вот например отрывок из скрипта парсинга действий:
if(empty($QUERY_STRING)) {
include("welcome.php");
welcome();}
elseif(!empty($action)) {
##########################################
if($action=="globtempl_edit") {
include("function_globtempl_edit.php");
globtempl_edit();}
elseif($action=="globtempl_do_edit") {
include("function_globtempl_do_edit.php");
globtempl_do_edit();}
elseif($action=="globtempl_write") {
include("function_globtempl_write.php");
globtempl_write();}
...
else {
include("welcome.php");
welcome();}
} else {
include("welcome.php");
welcome();}
|
| |
|
|
|
|
|
|
|
для: cheops
(22.11.2005 в 14:18)
| | Какими страшными словыми вы ругаетесь:)
Можно чуть более развернуто? Быть может и не стоит к нему, стилю-то, переходить? | |
|
|
|
|
|
|
|
для: Loki
(22.11.2005 в 15:12)
| | Я уже всё это позабыть успел... Имеется несколько видов языков: языки вроде Pascal, C, PHP и т.п. относятся к императивным языкам программирования. Это не единственный способ организации языка - он может быть логическим, функциональным и т.п. Конечно полностью функционального стиля добиться на PHP нельзя - язык организован не так... но такие системы существуют - программы выглядит как одна функция в качестве параметров которых передаются другие функции, им в качестве параметров передаются ещё функции, иногда в качестве параметров проскальзывают циклы и блоки if. В аттаче очень характерный пример - первый блок for включает второй, а он в свою очередь включает if - при этом тело у операторов отсутствует... | |
|
|
|
|
|
|
|
для: cheops
(23.11.2005 в 01:54)
| | Душераздирающее зрелище! Неужели мой код похож на это?! Впрочем, судя по его читаемсоти - так все и обстоит:) | |
|
|
|
|
|
|
|
для: Loki
(23.11.2005 в 10:27)
| | За вашу задумку расплата идёт сложностью: код получается компактным, но сложность возрастает - тут ничего не поделаешь... | |
|
|
|
|
|
|
|
для: cheops
(23.11.2005 в 13:22)
| | Потренировался на досуге: если аккуратно давать названия массивам и от этих правил не отступать, то все становится достаточно прозрачно и понятно... Главное, чтобы я продолжал так думать к концу проекта:) | |
|
|
|