Свой шаблонизатор

Romashov

экспериментатор
Свой шаблонизатор

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

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

Обнаружил недостатки:
- куча файлов, что неудобно
- сложность реализации иерархии (точнее огромный объём рутинной работы)
Страница => Логические блоки => Повторяющиеся части блока => Повторяющиеся элементы оформления.

Хотелось бы иметь один файл шаблона, размеченный приблизительно следующим образом:
Код:
<TOP> 
                //соответственно вместо файла, отвечающего за верх страницы
              _TITLE_ //в котором встречаются элементы для автозамены
</TOP>

<NEWSDESCRIPTION>//начало повторяющегося блока
           _TEXT_
           <TOPICLINKS>
                                 _LINK_
           </TOPICLINKS>//удобно реализуется иерархия
</NEWSDECRIPTION>

<SOFT>
           _LINK_ - _TEXT_
</SOFT>


<BOTTOM>
_END_
</BOTTOM>
То есть чистейшей воды аналог XML.
Вопрос один: как его пропарсить, так чтобы в массиве, например, template оказались соответствующие элементы. То есть $template['bottom'] содержал _END_ , а $template['newsdescription']=array("_TEXT_", "topшсlinks"=>array("_LINKS_"));
Очевидна несостыковочка с ключами (некоторые без них, как так?), но пока больше ничего не придумал.
Обработка была бы достаточно несложной - последовательный обход всего массива. Очень надеюсь на помощь, особенно по части регулярных выражений и идеи с ключами.
 

440hz

php.ru
Romashov
рекурсивно обработать с верхнего уровня выкусывая регуляркой теги и то, что между ними?
 

Romashov

экспериментатор
не могли бы подсказать регулярку выкусывания и условие выхода из цикла?
 

Royal Flash

-=MaestrO=-
1. Весь контент не выводить, а записать в переменные.
($top, $body, $menu, $bottom)
2. Создать 3 шаблона с дизайном, листами стилей и т.д. в которых уже собственно, и выводить контент.
<html>
<head>
<?
echo $top;
?>
</head>
<body>
<?
echo $top;
?>
......
 

Romashov

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

Смысл в том, что встречаются различно оформленные иерархические структуры. Например повторение описания софта в одних разделах, в другом - новости, в третьем - просто текст. Один иерархически построенный файл будет охватывать всё многообразие функций сайта.

Цель двига будет - получать данные и размещать их согласно шаблону для текущего модуля/раздела/элемента.
 

[Gisma]

Новичок
что-то вроде такого?
$szResult = $parser->getBlock($szBlockName);
$parser->setVariable($aHeader);
$szResult = $parser->__parse($szResult);
а шаблон вида
<!-- BEGIN list -->
бла-бла (а/я ;)){placeholder} <a href=xxx.php?id={id}>bla-bla</a>
<!-- END list -->
 

Romashov

экспериментатор
ещё бы ориентироваться в работе с классами ;) и знать применённые методы...
 

Steamroller

Новичок
Romashov, а зачем кстати писать свой шаблонизатор? Чем например XSLT не устраивает?
 

Фанат

oncle terrible
Команда форума
а зачем кстати писать свой шаблонизатор?
затем, чтобы научиться хоть что-то писать.
затем, чтобы узнать, как работают шаблонизаторы.
затем, чтобы после перехода на смарти, этот движок оказался не микроскопом в руках обезьяны, а осмысленным предметом.

не понимаю я этого, когда на форумах постоянно тащат за штаны вниз - "не пиши своего! готовое есть!".
Следует понять, что не все здесь присутствующие - негры, от которых требуется давать вал по плану. Не для всех важно получить любыми средствами конечный результат. Для некоторых важен процесс. И человеку надо ПОМОЧЬ. А не бить по рукам велосипедом.
 

Screjet

Новичок
Почитай ман на предмет XML парсера.
Кстати XML Sapiens, Sablotron = это готовый шаблонизатор/парсер.
Если скилов не хватит освоить XML, рекомендую изучить простенькие ПХП шаблоны, типа:
PHP:
<?#это файлик 0.tpl.php?>
<HTML>
<HEAD>
	<TITLE><?=$TITLE?></TITLE>
	<?foreach($METAS as $name => $content):?>
		<META name="<?=$name?>" content="<?=$content?>">
	<?endforeach?>		
</HEAD>
<H3>Мой базовый шаблончик</H3>
<?include $TPL?>
</BODY>
</HTML>

<?#это файлик 1.tpl.php?>
<H3>Мой первый шаблон на ПХП</H3>
<table>
<?foreach($cells_of_rows as $row):?>
	<tr>
		<?foreach($row as $cell):?>
			<td><a href="<?=$cell["link"]?>"><?=$cell["text"]?></a></td>
		<?endforeach?>
	</tr>
<?endforeach?>
</table>

<?php
# а это 1.php :-)
$TITLE = "Мой первый шаблончик";
$METAS["Description"] = "Добро пожаловать в шаблонизаторы!";
// шаблон для первого конроллера :-)
$TPL = "1.tpl.php";

// готовим данные для шаблона
$cells_of_rows = array(
	array(
		array(
			"link" => "http://yandex.ru",
			"text" => "Яндекс.РУ"
		),
		array(
			"link" => "http://rambler.ru",
			"text" => "Рамблер.РУ"
		)
	),
	array(
		array(
			"link" => "http://google.com",
			"text" => "Гугль.КОМ"
		),
		array(
			"link" => "http://yahoo.com",
			"text" => "Яху!.КОМ"
		)
	)
);

// если нужно, выставляем чарсет
header("Content-Type: text/html; charset=windows-1251");
// в конце выводим базовый шаблон, который в свою очередь выводит основной шаблон
include "0.tpl.php";
/* 
ВАЖНО: в этом файлике никакого вывода нет и быть не должно,
весь вывод в шаблонах.
*/
?>
Кстати есть хорошая темка Фаната, где хороший пример четкого разделение мух от котлет.

зы. Если хорошо вникнуть в шаблоны ПХП, то другие, скороее всего, не понадобятся :)
 

Romashov

экспериментатор
Автор оригинала: Steamroller
Romashov, а зачем кстати писать свой шаблонизатор? Чем например XSLT не устраивает?
Тем, что в своём коде я должен и буду ориентироваться как рыба в воде.

Screjet, спасибо! Практически именно то, что мне нужно.

-~{}~ 16.11.05 18:50:

Только как теперь исполняемый шаблон заменить на шаблон, содержащий только формат оформления документа. То есть привести-таки в мою структуру?
 

Фанат

oncle terrible
Команда форума
а чем тебя исполняемый не устраивает?

-~{}~ 16.11.05 18:52:

а, главное - если не устраивает, то почему ты сказал перед этим, что всё зашибись?
 

Romashov

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

Лишить его исполняемых элементов и наоборот, оформление загонять в массив-структуру, которую использовать при оформлении и выводе данных сразу при работе скрипта.
 

Фанат

oncle terrible
Команда форума
загонять в массив-структуру, которую использовать при оформлении
прости, но эта фраза не несёт никакого смысла.
это потому, что ты неправильно выразился, или потому, что так и не понял, чего ты хочешь?

-~{}~ 16.11.05 19:05:

хочется копнуть глубже и сделать его максимально понятным
ты хоть понимаешь, что это ПРИНЦИПИАЛЬНО разные шаблоны?
Что из этого то, что ты хочешь, сделать сложнее, чем с нуля?
 

Romashov

экспериментатор
Не так выразился.
В примере понятней:
Допустим, работает модуль софт-обзоров. Скрипт сгенерировал название раздела $a - берёт значение $template['main']['soft']['header'] - и соответсвенно выводит на экран str_replace ('_HEADER_',$a',$template['main']['soft']['header']);
Сгенерировал массив параметров софта - взял соответствующий элемент оформления, сделал в нём подстановку (массив меняемых на массив сгенерированных) - выдал на экран.
Работает модуль новостей - скрипт соответственно использует элементы $template['main']['news']
Вот как хочется.
Если Вы видите ошибки и недостатки такого подхода - буду рад подсказке.

-~{}~ 16.11.05 19:14:

Да, я понял что это ПРИНЦИПИАЛЬНО разные подходы.
Но всё же, предложенный Screjetом вариант - позволяет реализовать требуемую иерархию, чем мне и понравился.

-~{}~ 16.11.05 23:04:

Подскажите, пожалуйста ответ на один вопрос:
Как надо обработать строку "<{top}>VALUE</{top}>", чтобы в итоге получилось $template['top']="VALUE";
Соответственно для любых <{*}>, не залезая внутрь VALUE (там тоже могут быть <{*}> - но они должны там и остаться). То есть, как получить только верхний уровень? Понимаю, что тут применяется регулярное выражение, но я не умею с ними работать. Надеюсь на подсказку.
 

Screjet

Новичок
{offtop subject="Romashov"}

Еще раз повторюсь: не хватает скилов = начни с простого.
Без обид: ты просто не понимаешь всей сложности "блочного" подхода: напр.: как ты собираешься реализовать вложенные блоки? Сегодня скажешь "это ненадо", а завтра на форум прибежишь?

Подсказать тебе реализацию = еще хуже сделать. Для тебя же. Непонимая принцов, начнешь чтото "лепить".

зы. Что за манера прыгать через три ступеньки. Так и шею свернуть недолго.. А если и решил прыгать, то прыгай самостоятельно. Никто не желает тебе зла.
{/offtop}
 

Romashov

экспериментатор
Что понимаешь под "вложенными блоками"?
Я подразумеваю как повторяющиеся элементы внутри других.
Если так, то я собираюсь их реализовать.
Поэтому шаблон и имеет вложенную, многоуровневую структуру
Код:
<MIDDLE>
       <NEWS>
                 <LINKI>
                  </LINKI>
                  <COMMENT>
                        _ID_ - _TEXT_
                </COMMENT>
       </NEWS>
</MIDDLE>
Для реализации мне не хватает знаний исключительно в его "разборе".
 

Screjet

Новичок
Romashov
Код:
<NEWS ID=10>
  Очень важная новость, связанные новости:
  <NEWS ID=8>
    Человек попытался реализовать вложенные блоки без понятия XML!
  </NEWS>
  <NEWS ID=9>
    Человека в итоге нашли [url="http://www.yuretz.ru/Pishu_na_Cpp_za_edu_p234.html"]тут[/url]
  </NEWS>
</NEWS>
 

Romashov

экспериментатор
;)
До конца недопонимаю.
Связанные новости - это ссылки на другие, но не сами целиком. Разве не так? Соответственно это уже не элемент NEWS, а нечто другое.
 
Сверху