Автор Тема: Работа с шаблонами  (Прочитано 9461 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с шаблонами
« : 07 Августа 2003, 15:42:37 »
Интересно услышать мнение других программистов по поводу реализации решения.

Статья...

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #1 : 07 Августа 2003, 16:52:48 »
Советую посмотреть сначало готовые решения, а потом уже создавать свой велосипед.
ИМХО наиболее удачная реализация шаблонов (не считая XSLT) с точки зрения построения самих шаблонов  это - pear::html::template::sigma (очень напомниает phplib::template) - это все на пхп (чесно говоря похожих по организации шаблонов - на перл не встречал)


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

%npp%


%name_goods%


%price_goods%


First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #2 : 07 Августа 2003, 16:54:13 »
Цитировать
Phoinix:
Интересно услышать мнение других программистов по поводу реализации решения.

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

Про сам код я не говорю, я пхпшник
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с шаблонами
« Ответ #3 : 08 Августа 2003, 09:47:56 »
Макс
Цитировать

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


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

Tronyx
Цитировать

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


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

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


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

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


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

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #4 : 08 Августа 2003, 10:28:49 »
Цитировать
Phoinix:
IMHO если обработку делать абстрактно, то раздувается код, и потом я использую шаблоны под конкретные задачи, соответственно я и внедряю в него конкретные значения...

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

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

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

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

А ты сделай неограниченую вложеность и не будет ни какой загвоздки.
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #5 : 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;

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

ЗЫ
это всего лишь мое имхо
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с шаблонами
« Ответ #6 : 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

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #7 : 08 Августа 2003, 21:30:59 »
Цитировать
Phoinix:
Ну вообщем-то подобный обработчик не подразумевается как отдельный модуль, а как дополнение к существующим скриптам

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

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

PS так как это теория и алгоритмы не нужно останавливаться на реализации на пёрле, описывайте алгоритм словами.
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с шаблонами
« Ответ #8 : 09 Августа 2003, 11:29:12 »
Tronyx
Цитировать
Если у тебя сделано не рационально это не значит, что так и подразумевается делать

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

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

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

Но IMHO все же проще адаптироваться под конкретные задачи...

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #9 : 09 Августа 2003, 12:13:23 »
Цитировать
Phoinix:
Данная обработка предполагается для конкретных задач следовательно универсальность кода ни к чему, универсальность принципа обработки IMHO присутствует;

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

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

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

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

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

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

Да без проблем! Можно например использовать рекурсию - ишешь один блок, обрабатываешь его и снова запускаешь функцию только уже для поиска блока внутри блока, ишешь дальше...
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с шаблонами
« Ответ #10 : 09 Августа 2003, 13:07:06 »
Tronyx
Цитировать
Рационально было бы написать один единственный обработчик который сможет обрабатывать любые шаблоны.

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

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

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

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

P.S. %main_url% я заменил, ибо картинки и стили не загружаются...
« Последнее редактирование: 09 Августа 2003, 13:21:02 от Phoinix »

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с шаблонами
« Ответ #11 : 09 Августа 2003, 13:09:30 »
Tronyx
Цитировать
но максимально прост в реализации

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

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #12 : 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% кнопка редактирования кнопка удаления



ИМХО все твои проблемы именно из-за неправильной организации блоков. Универсальный модуль сделать можно (хотя бы потому что на ПХП таких полно и некоторые из-них достаточно универсальны).
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с шаблонами
« Ответ #13 : 09 Августа 2003, 14:25:23 »
Макс
Цитировать
через несколько проэктов тебе надоест по 10 раз все это переписывать и ты задумаешься об оформлении шаблонизатора в виде модуля

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

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


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

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

Чест слово, ну нету у меня проблем в этом. :) все просто замечательно работает. :)

Оффлайн Tronyx

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 826
  • +0/-0
  • 2
    • Просмотр профиля
Работа с шаблонами
« Ответ #14 : 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");

Вот это и есть пример работы с "рациональным обработчиком шаблонов".
С уважением, Владимир Гончаренко - COPI# 93
Ролевая онлайн игра

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28