Forum Webscript.Ru

Программирование => Теория, алгоритмы и стандарты => Тема начата: Phoinix от 07 Августа 2003, 15:42:37

Название: Работа с шаблонами
Отправлено: Phoinix от 07 Августа 2003, 15:42:37
Интересно услышать мнение других программистов по поводу реализации решения.

Статья... (http://web.pyaticom.ru/texno.shtml)
Название: Работа с шаблонами
Отправлено: Макс от 07 Августа 2003, 16:52:48
Советую посмотреть сначало готовые решения, а потом уже создавать свой велосипед.
ИМХО наиболее удачная реализация шаблонов (не считая XSLT) с точки зрения построения самих шаблонов  это - pear::html::template::sigma (очень напомниает phplib::template) - это все на пхп (чесно говоря похожих по организации шаблонов - на перл не встречал)


ИМХО не очень удобно верстать:

%npp%


%name_goods%


%price_goods%


Название: Работа с шаблонами
Отправлено: Tronyx от 07 Августа 2003, 16:54:13
Цитировать
Phoinix:
Интересно услышать мнение других программистов по поводу реализации решения.

ИМХО Плохо и неудобно.
1. Зачем делать блоки такими неудобными? Куча комментариев с какими-то циферками... Разве нельзя сделать хотябы так:{block:some_name}...{/block:some_name}
2. Обработка шаблона это отдельный разговор... Она должна проходить абстрактно, а у тебя всё сделано под конкретные значения.

Про сам код я не говорю, я пхпшник
Название: Работа с шаблонами
Отправлено: Phoinix от 08 Августа 2003, 09:47:56
Макс
Цитировать

ИМХО не очень удобно верстать:


А в чем неудобство-то? Web-мастер просто не трогает все что между % и все. Наши web-мастера, ничего не понимающие в Perl особых проблем при верстке не испытывали...

Tronyx
Цитировать

Зачем делать блоки такими неудобными? Куча комментариев с какими-то циферками... Разве нельзя сделать хотябы так:
{block:some_name}...{/block:some_name}


Можно, но я же написал в статье почему так не делаем...

Цитировать
Почему мы поставили комментарии напротив каждой строки, а не, скажем, просто метки начала и конца блока? Да потому, что в случае вывода строки списка номеров страниц, нам требуется «выкусить» часть блока, а потом, после обработки, вставить обратно, нам бы пришлось этот блок разбивать не на 3 части а на 4 (начало блока, текущая страница, ссылка на другую страницу, конец блока).


Вся загвоздка из-за блоков вложенных в блоки...

Цитировать
2. Обработка шаблона это отдельный разговор... Она должна проходить абстрактно, а у тебя всё сделано под конкретные значения


IMHO если обработку делать абстрактно, то раздувается код, и потом я использую шаблоны под конкретные задачи, соответственно я и внедряю в него конкретные значения...
Название: Работа с шаблонами
Отправлено: Tronyx от 08 Августа 2003, 10:28:49
Цитировать
Phoinix:
IMHO если обработку делать абстрактно, то раздувается код, и потом я использую шаблоны под конкретные задачи, соответственно я и внедряю в него конкретные значения...

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

Цитировать
Phoinix:
 не на 3 части а на 4

Это не проблема. Проблема это неудобные блоки. ИМХО.

Цитировать
Phoinix:
Вся загвоздка из-за блоков вложенных в блоки...

А ты сделай неограниченую вложеность и не будет ни какой загвоздки.
Название: Работа с шаблонами
Отправлено: Макс от 08 Августа 2003, 15:30:02
Phoinix
ИМХО ты не совсем правильно делаешь обработку блоков.
Предположим сделал я такой шаблон :


 
   
     
     
   
 
%col1% %col2%



Как нужно такой блок обрабатывать ? Вырезаешь ВЕСЬ блок (все что между комметариями BEGIN rows_block и END rows_block)
Парсишь этот блок и полученный HTML вставляешь на его место.
Примерно так:

# это шаблон с блоком
$a = \'Begin template

I am %name% %surname%

end template\';
$_ = $a;

# получаем текст блока
$_ =~ /(.+?)/s;
# в этой переменной будет текст блока
$block_code = $1;
# а сюда будем записывать результирующий ХТМЛ
$block_html = \'\';

# парсинг блока
$_ = $block_code;
$_ =~ s/%name%/Maxim/s;
$_ =~ s/%surname%/Matyukhin/s;
$block_html .= $_;

$_ = $block_code;
$_ =~ s/%name%/Vladimir/s;
$_ =~ s/%surname%/Putin/s;
$block_html .= $_;

# заменяем блок на его результирующий HTML-код
$a =~s/(.+?)/$block_html/s;
print $a;

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

ЗЫ
это всего лишь мое имхо
Название: Работа с шаблонами
Отправлено: Phoinix от 08 Августа 2003, 20:14:04
Tronyx
Цитировать
Код будет как раз таки меньше и сможет обрабатывать все шаблоны, а тебе приходится каждый раз заново писать новый обработчик, это не логично + частично теряется смысл использования шаблонов

Ну вообщем-то подобный обработчик не подразумевается как отдельный модуль, а как дополнение к существующим скриптам

Макс

С этим не спорю, как альтернатива можно делать и так, но IMHO для меня проще свой вариант. Тем паче, что загрузку файла в Perl\'е я произвожу в массив, каждая строка - ячейка массива, следовательно твое решение не подойдет, т.к. маркировки начала и конца блока в разных ячейках массива и одним регулярным выражением забрать весь блок не получится...

Получится примерно так:

код шаблона:


 
   
     
     
   
 
%col1% %col2%



код скрипта:

open (TMP, $file); @template = ; close (TMP);

foreach (@template) {
  if (m//gi) {$block_on = 1;}
  if (m//gi) {$block_on = 0;}
  if ($block_on eq 1) {$block_code .=$_; $_ = "";}
}

и т.д.

т.е. по сути тоже самое, может даже хуже...

Но можно сделать по-другому открытие файла:

open (TMP, $file);
while () {
  $template .=$_;
}
close (TMP);

Тогда конечно проще делать "нарезку" регулярными выражениями как предлагает Макс.
Название: Работа с шаблонами
Отправлено: Tronyx от 08 Августа 2003, 21:30:59
Цитировать
Phoinix:
Ну вообщем-то подобный обработчик не подразумевается как отдельный модуль, а как дополнение к существующим скриптам

Если у тебя сделано не рационально это не значит, что так и подразумевается делать.

Цитировать
Phoinix:
маркировки начала и конца блока в разных ячейках массива и одним регулярным выражением забрать весь блок не получится...
Ну и что? Ты же сам написал как получится???

PS так как это теория и алгоритмы не нужно останавливаться на реализации на пёрле, описывайте алгоритм словами.
Название: Работа с шаблонами
Отправлено: Phoinix от 09 Августа 2003, 11:29:12
Tronyx
Цитировать
Если у тебя сделано не рационально это не значит, что так и подразумевается делать

А как же тогда сделать это более рационально? :)
Что-то я уже начал запутываться %) надо разобраться
1. Данная обработка предполагается для конкретных задач следовательно универсальность кода ни к чему, универсальность принципа обработки IMHO присутствует;
2. По поводу выделения блоков HTML кода - все зависит от реализации загрузки файлов:
а. если файл выгружается в массив, то IMHO мой способ выделения блоков наиболее рационален;
б. если файл выгружается не в массив, то более рационален способ выделения блоков которые предложили Макс и Tronyx;
3. По поводу выделения вложенных блоков, честно говоря, если идти по способу 2.б., то определить алгоритм что-то не получается... тем более реализовать предложение Tronyx по поводу:
Цитировать
А ты сделай неограниченую вложеность и не будет ни какой загвоздки.

Если только (но для массивов):
1. определять в цикле начальные метки, до тех пор пока не появится конечная (запоминая месторасположение меток в массиве);
2. делать выборку блока между последней начальной и найденой конечной;
3. определять последнюю начальную метку на предыдущую;
4. возврат в п.1.

при этом учитываем имена блоков, а потом в соответствии сними расставляем обратно...

Но IMHO все же проще адаптироваться под конкретные задачи...
Название: Работа с шаблонами
Отправлено: Tronyx от 09 Августа 2003, 12:13:23
Цитировать
Phoinix:
Данная обработка предполагается для конкретных задач следовательно универсальность кода ни к чему, универсальность принципа обработки IMHO присутствует;

Ты хошешь писать новый обработчик каждый раз когда используешь новый шаблон? Рационально было бы написать один единственный обработчик который сможет обрабатывать любые шаблоны. И это не ИМХО!

Цитировать
Phoinix:
2. По поводу выделения блоков HTML кода - все зависит от реализации загрузки файлов:

Всё так зависит только у тебя. У меня в шаблонизаторе файл загружается в массив и используются "нормальные" блоки, сейчас они у меня работают по другому, но в одной из прошлых версий работали так же.

Цитировать
Phoinix:
а. если файл выгружается в массив, то IMHO мой способ выделения блоков наиболее рационален;

А вот тут слово рационаленен точно не нужно. ;) Больше подходит - довольно не удобен, но максимально прост в реализации.

Цитировать
Phoinix:
3. По поводу выделения вложенных блоков, честно говоря, если идти по способу 2.б., то определить алгоритм что-то не получается...

Да без проблем! Можно например использовать рекурсию - ишешь один блок, обрабатываешь его и снова запускаешь функцию только уже для поиска блока внутри блока, ишешь дальше...
Название: Работа с шаблонами
Отправлено: Phoinix от 09 Августа 2003, 13:07:06
Tronyx
Цитировать
Рационально было бы написать один единственный обработчик который сможет обрабатывать любые шаблоны.

Рационально писать один единственный обработчик для обработки стандартных функций, например UBB-код, но как написать универсальный обработчик который выводит:
- статичные страницы (информеры) последних новостей в новостийном скрипте;
- динамичную страницу с выводом новостей по дням, месяцам, годам в новостийном скрипте;
- динамичный список категорий доски объявлений в скрипте доски объявлений;
- постраничный динамичный список объявлений определенной категории в скрипте доски объявлений;
- статичный список категорий статей в скрипте статей;
- динамичный список статей определенной категории в скрипте статей;
- статичные страницы статей в скрипте статей;
и т.д.

Все эти страницы генерятся либо динамично отображаются с использованием шаблонов разными скриптами, у каждого скрипта свое количество переменных которые вставляются в шаблоны...
Да, такие переменные как UBB-код будут одинаковы во всех скриптах, но я продразумеваю не это решение...
Написание универсального обработчика приведет как минимум в ограничении использования некоторых возможностей в сриптах при обработке шаблонов, т.к. мне прийдется довольствоваться только установленными функциями или дописывать новые, что приведет, опять же, к раздуванию скрипта... Но хорошо, если мы разобрались с нарезкой, то со вставкой уже готового кода в шаблон у нас опять возникают проблемы: как например произвести нарезку и вывод страницы подобной этой?
http://www.pyaticom.ru/test/statica.htm (http://www.pyaticom.ru/test/statica.htm)
6 различных строк которые выводятся так как нужно... а это шаблон:
http://www.pyaticom.ru/test/stat_viw.htm (http://www.pyaticom.ru/test/stat_viw.htm)

Такие переменные как: %main_url%, %mod%, %user%, %pass% и другие я обрабатываю отдельным обработчиком т.к. эти переменные используются по-умолчанию во свех скриптах, но что делать с блоками выделенными ? Да я могу их вырезать в отдельном скрипте, но я уже не смогу их в нем же обработать т.к. дофига переменных своих да и принцип обработки блоков несколько иной... а потом самое главное куда я буду обработанные блоки вставлять, потому что все 6 строк после обработки становятся одним блоком и вставляются соответсвенно вместо , но это в данном случае, а когда конечный блок собирается из другого количества блоков и по другому принципу как быть тогда?

Поэтому может просто я неясно выразил мысль своей статьей:
Я не показываю в ней как обрабатывать стандартные выражения (пример UBB-код), а показываю как производить сложную обработку шаблона адаптированную к конкретным скриптам...
Хотя я и не отрицаю возможность существования других вариантв решений

P.S. %main_url% я заменил, ибо картинки и стили не загружаются...
Название: Работа с шаблонами
Отправлено: Phoinix от 09 Августа 2003, 13:09:30
Tronyx
Цитировать
но максимально прост в реализации

Не это ли главное... максимально просто реализовать и не стрелять из пушки по воробьям... :)
Название: Работа с шаблонами
Отправлено: Макс от 09 Августа 2003, 13:46:04
Phoinix
а почему ты файл в массив а не переменную читаешь ? (потому что писать меньше ? :))

ИМХО это все лучше оформит в виде модуля. Код типа

$tmpl = Template->new("./template/dir/);
$tmpl->set_file("template.html",\'handle");
$tmpl->set_var("title", "My Hompage");
$tmpl->set_block("handle", "block_handle", "block_name");
for($i=0; $i<5; $i++) {
  $tmpl->set_var("number", $i);
  $tmpl->append("block_handle","block_name");
}
print $tmpl->parse("handle");
выглядит компактнее, красивее и читабельнее.

По поводу вложенных блоков.
Первое, что нужно понять, так это то, что блок - это просто "маленький" шаблон и ничем от основного шаблона не отличается. Он тоже может иметь свои метки и блоки.
Контроль за вложенными блоками ложится на программиста, который пишет скрипт (а не на того кто пишет шаблонный движок).
Наиболее просто (ИМХО) - указывать, где находится блок, который собираемся парсить - в самом документе или в каком-то блоке.
Цитировать
Но IMHO все же проще адаптироваться под конкретные задачи...
через несколько проэктов тебе надоест по 10 раз все это переписывать и ты задумаешься об оформлении шаблонизатора в виде модуля.
Цитировать
но как написать универсальный обработчик который выводит:
какая нам разница что он выводит. Шаблонизатору пофигу, выводить новости или корзину магазина. Ему лишь нужно задать шаблон или список шаблонов, указать значение меток,  пропарсить блоки и выдать готовый документ.

Цитировать
как например произвести нарезку и вывод страницы подобной этой?
http://www.pyaticom.ru/test/statica.htm
ничего сложного, просто вложенные блоки (весь код приводить не буду, просто блоки покажу):


 
 
   
   
   
 
   
   
     
     
     
   
   
   
%main_category_name% кнопка  редактирования шаблона  кнопка удаления категории
%subsection_name% кнопка редактирования кнопка удаления



ИМХО все твои проблемы именно из-за неправильной организации блоков. Универсальный модуль сделать можно (хотя бы потому что на ПХП таких полно и некоторые из-них достаточно универсальны).
Название: Работа с шаблонами
Отправлено: Phoinix от 09 Августа 2003, 14:25:23
Макс
Цитировать
через несколько проэктов тебе надоест по 10 раз все это переписывать и ты задумаешься об оформлении шаблонизатора в виде модуля

Уже думаю... :), но по поводу переписывания всего, могу поспорить... скрипты переделывал раза по 2-3 но эту часть не трогал, не было надобности...

Цитировать
ничего сложного, просто вложенные блоки (весь код приводить не буду, просто блоки покажу):


Нет там как раз вложенных блоков нет, просто сборка списка производится из шести блоков...

Цитировать
ИМХО все твои проблемы именно из-за неправильной организации блоков

Чест слово, ну нету у меня проблем в этом. :) все просто замечательно работает. :)
Название: Работа с шаблонами
Отправлено: Tronyx от 09 Августа 2003, 14:54:59
Цитировать
Phoinix:
Цитировать
но максимально прост в реализации

Не это ли главное... максимально просто реализовать и не стрелять из пушки по воробьям...

Ты забыл про другую часть моей фразы. ;)
Цитировать
Tronyx:
довольно не удобен, но максимально прост в реализации.


Цитировать
Phoinix:
Рационально писать один единственный обработчик для обработки стандартных функций, например UBB-код, но как написать универсальный обработчик который выводит:

Как сказал Макс
Цитировать
Шаблонизатору пофигу, выводить новости или корзину магазина.

Ты должен научить его выводить всего одну вещь - данные. А всё что ты перечислил без проблем все делают с помощью одного единственного обработчика шаблонов, ты просто что то не понимаешь. Повнимательнее посмотри вот на этот код, если не поможет - посмотри ещё раз
Цитировать
Макс:
$tmpl = Template->new("./template/dir/);
$tmpl->set_file("template.html",\'handle");
$tmpl->set_var("title", "My Hompage");
$tmpl->set_block("handle", "block_handle", "block_name");
for($i=0; $i<5; $i++) {
  $tmpl->set_var("number", $i);
  $tmpl->append("block_handle","block_name");
}
print $tmpl->parse("handle");

Вот это и есть пример работы с "рациональным обработчиком шаблонов".
Название: Работа с шаблонами
Отправлено: Phoinix от 09 Августа 2003, 15:36:15
Tronyx
Цитировать
довольно не удобен

Я не забыл, я просто считаю этот метод удобным, я ты нет, и спорить в данном случае бесполезно т.к. у каждого свое мнение... ;) А я никогда не считал мое решение панацеей от всех бед. Я просто поделился своим опытом - как это делаю я.

Цитировать
А всё что ты перечислил без проблем все делают с помощью одного единственного обработчика шаблонов

Ну не все... я, например, не делаю :). Просто как-то не задумывался об этом, но, чувствую, прийдется. %)

Что предложил Макс бесспорно интересно (я прочитал и понял, что он имеет в виду :)).

Цитировать
ты просто что то не понимаешь

Я все прекрасно понимаю, просто при попытке описать шлюпку для корабля, вы мне предложили, что шлюпки не пойдут, давай пустим рядом с остальными кораблями еще один спасательный корабыль, а шлюпки убрать вообще тем самым сэкономив место. Да это может быть наиболее правильное решение если кораблей дофига, но если кораблик всего один и тот не особо навороченный и экипаж у него 5 человек, может просто обойтись одной спасательной шлюпкой?

Насколько я понимаю из обсуждения, мое решение подходит для разработки маленьких проектов.

P.S. Парни но это же все-таки статья, и я никому не навязываю свое решение, просто описываю, как я это делаю.
Это решение не может быть неправильным т.к. оно работает.
Оно может показаться более или менее рациональным, чем какое-либо другое.
Это просто альтернатива не более того.
И будут разрабатываться другие решения, и у каждого будут свои плюсы и минусы...
Название: Работа с шаблонами
Отправлено: Макс от 09 Августа 2003, 18:55:15
Phoinix
Цитировать
Это просто альтернатива не более того.
а ты изучал существующие решения на перл ? Хотя бы тот же
HTML::Template (http://html-template.sourceforge.net)
ИМХО там , - лишние (кое-кто со мной не согласиться), а в остальном - нормальный стандартный шаблонизатор.

Цитировать
Нет там как раз вложенных блоков нет, просто сборка списка производится из шести блоков...
ну и... Что проще/легче/удобнее - обработать 2 блока (но вложенных) или 6 (но простых) ? :)

Цитировать
Насколько я понимаю из обсуждения, мое решение подходит для разработки маленьких проектов.
а чем большой проэкт отличается от маленького ? Если количеством файлов, то в случае большого проэкта тебе просто этот код нужно будет писать в большем количестве файлов.
Название: Работа с шаблонами
Отправлено: Phoinix от 10 Августа 2003, 11:11:10
Макс
Изучал, но они не подходит по разным причинам:
1-я причина хост на котором мы располагаемся проявляет откровенное нежелание устанавливать дополнительные модули Perl, а уйти мы с него не можем, поэтому приходится обходится, по-возможности, минимальным количеством модулей... :(
2-я причина, самая главная, требование Web-мастеров к возможности быстрого изменения шаблонов. Я привязываюсь не к просторе решения скриптов, а к шаблонам которые хотят редактировать (в каком виде), и к HTML файлам которые должны получится в результате. Код подправить в случае чего не проблема, проблема в том, что дальнейшую работу со скриптами и шаблонами произвожу не я, поэтому требования к реализации предоставляю тоже не я, а т.к. мы работаем командой, то навязывать свои решения, которые, может быть, более просты в реализации для меня, неправильно, я могу лишь подталкивать в нужном направлении, но повернуть - исключено...
Название: Работа с шаблонами
Отправлено: Макс от 10 Августа 2003, 15:58:56
1. http://forums.webscript.ru/showthread.php?s=&threadid=10853
2. HTML::Template я привел просто как пример модуля шаблонного движка, чтобы показать, что входит в обязаности шаблонизатора (получает шаблон[ы], получает значение меток, обрабатывает блоки и выдает готовый ХТМЛ + по желанию делает кеширование)
Мне самому не нравятся его
Название: Работа с шаблонами
Отправлено: Phoinix от 11 Августа 2003, 10:26:15
Макс
1. :) это я знаю, но системный администратор хоста уперся рогом мотивируя запрет установки модулей как возможность создания на сервере дыры. Переходить на более толковый хостинг мы не можем. Но ближайшее время мы хотим ставить свой сервер.
2. Я пробовал на локальном сервере этот подобный модуль (не помню точно какой, может даже и этот), но он не подошел, тем более свое решение уже как бы существовало, только недоработанное.
Единственные модули, которые я использую в большинсве случаев так это CGI и DBI. И CGI-модуль я как раз использую под той же причине из-за чего разгорелась дискуссия. Когда мой модуль обработки переданных параметров начал обрастать дополнительными функциями и обработками как яблоня яблоками в урожайный год, я понял, что скоро изобрету заново велосипед, правда я начал подозревать что у него будет крутится только одно колесо и поворачивать будет только в одну сторону :), и я сразу остановился...