Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Кто о чем, а вшивый о бане:) (еще раз о шаблонах)
 
 автор: Loki   (21.11.2005 в 22:03)   письмо автору
 
 

Копаю интернет в поисках внятного описания конструирования системы шаблонов. Толи никто не хочет делиться наработками, толи тех кому есть чем поделиться можно перечесть по пальцам, но статьи сводятся к следующему: рассказывают какие-то азы, а затем подразумевается что сам резберешься, либо все сводится к обзору существующих, и продвигается мысль о никчемности изобретания веловипеда.
У меня сейчас следующий код:

<?
//функция обработки шаблона
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}
Естественно, циклические штуки типа меню или новостей рисуются функциями.

Все работает замечательно... но вот смущает меня не очень хорошая читабельность кода, его, на мой взгляд, обилие и недостаточная автоматизация. А так же мне кажется что не может система шаблонов состоять из функции в три строчки:)
Если у кого есть мысли по дальнейшему развитию такого подхода - просьба поделиться. Или ветвь тупиковая и я этого тупика уже достиг?:)

   
 
 автор: DDK   (21.11.2005 в 22:48)   письмо автору
 
   для: 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($result0"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;
}
?>
Вот так вот :) Работает безотказно, что могу сказать... а усложнить эту систему, в принципе, уже не трудно...

   
 
 автор: Loki   (22.11.2005 в 09:44)   письмо автору
 
   для: DDK   (21.11.2005 в 22:48)
 

Если я правильно понимаю, то для каждого раздела сайта должен быть свой шаблон?
Кроме того, дизайн, как таковой, никуда не вынесен: то есть его нельзя просто дать дизайнеру для правки?
Если так, то моя система представляется мне значительно более гибкой.

   
 
 автор: cheops   (22.11.2005 в 01:23)   письмо автору
 
   для: Loki   (21.11.2005 в 22:03)
 

Чего-то не очень понятно... т.е. в качестве первого параметра функции tpl может выступать либо массив, либо обычный скаляр?

   
 
 автор: Loki   (22.11.2005 в 09:35)   письмо автору
 
   для: cheops   (22.11.2005 в 01:23)
 

Нет. Первый параметр - ассоциированный массив, ключ которого, является тегом для замены.
То есть

$news['NEWS_ITEM']="что-то";

в шаблоне заменит тег

{NEWS_ITEM}


А... вижу. В первом сообщении я действительно потерял строчку. поправил

   
 
 автор: PantiL   (22.11.2005 в 12:37)   письмо автору
 
   для: Loki   (22.11.2005 в 09:35)
 

Я делал так:
В файлешаблона в первой строчке писал теги, которые надо заменить

{NEWS}||{CHTO-TO TAM}||{I TD I TP}

Затев в функцию обработки шаблона передавались два параметра, имя шаблона и массив содержащий значания кторые надо вставить вместо тегов(массив должен содержать значения в том же порядке что и теги). Принцип тот же , что и описан выше

   
 
 автор: Loki   (22.11.2005 в 13:32)   письмо автору
 
   для: PantiL   (22.11.2005 в 12:37)
 

Но массив же все равно надо формировать руками? Да еще и следать за порядком следования значений... или я что-то понял неправильно?

   
 
 автор: cheops   (22.11.2005 в 14:18)   письмо автору
 
   для: Loki   (22.11.2005 в 09:35)
 

Понятно... сложно потому, что вы плавно с императивного стиля программирования переходите на функциональный :))). Так как с функциональным программированием сталкиваются только при решения специфических задач - оно не сильно развито и тяжело воспринимается, так как программисты с ним почти не сталкиваются. К этому просто нужно привыкнуть как к стилю регулярных выражений или SQL.

   
 
 автор: DDK   (22.11.2005 в 15:10)   письмо автору
 
   для: 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();}

   
 
 автор: Loki   (22.11.2005 в 15:12)   письмо автору
 
   для: cheops   (22.11.2005 в 14:18)
 

Какими страшными словыми вы ругаетесь:)
Можно чуть более развернуто? Быть может и не стоит к нему, стилю-то, переходить?

   
 
 автор: cheops   (23.11.2005 в 01:54)   письмо автору
 
   для: Loki   (22.11.2005 в 15:12)
 

Я уже всё это позабыть успел... Имеется несколько видов языков: языки вроде Pascal, C, PHP и т.п. относятся к императивным языкам программирования. Это не единственный способ организации языка - он может быть логическим, функциональным и т.п. Конечно полностью функционального стиля добиться на PHP нельзя - язык организован не так... но такие системы существуют - программы выглядит как одна функция в качестве параметров которых передаются другие функции, им в качестве параметров передаются ещё функции, иногда в качестве параметров проскальзывают циклы и блоки if. В аттаче очень характерный пример - первый блок for включает второй, а он в свою очередь включает if - при этом тело у операторов отсутствует...

   
 
 автор: Loki   (23.11.2005 в 10:27)   письмо автору
 
   для: cheops   (23.11.2005 в 01:54)
 

Душераздирающее зрелище! Неужели мой код похож на это?! Впрочем, судя по его читаемсоти - так все и обстоит:)

   
 
 автор: cheops   (23.11.2005 в 13:22)   письмо автору
 
   для: Loki   (23.11.2005 в 10:27)
 

За вашу задумку расплата идёт сложностью: код получается компактным, но сложность возрастает - тут ничего не поделаешь...

   
 
 автор: Loki   (23.11.2005 в 13:48)   письмо автору
 
   для: cheops   (23.11.2005 в 13:22)
 

Потренировался на досуге: если аккуратно давать названия массивам и от этих правил не отступать, то все становится достаточно прозрачно и понятно... Главное, чтобы я продолжал так думать к концу проекта:)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования