Шаблоны, PHP + XML

arz_user

Guest
Шаблоны, PHP + XML

Я взялся писать движек для сайта. Полностью разработал админ-интерфейс, занялся выводом информации и понял, что нужно делать более универсальную шаблонную систему, на основе которой можно было бы сделать совершенно все.
Вот к чему я пришел:
Мне нужно написать XML разборщик шаблонов.
Например, когда я пишу в шаблоне вот так:
<scs type=Content name=Date> нужно, чтобы пхп выводил мне дату написания данной статьи,
если бы я написал так:
<scs type=Shablon class=PrintMenu name=MainMenu>, то он бы выводил шаблон под названием MainMenu, который находится в разделе шаблонов PrintMenu...и т.д.
Может я ставлю слишком сложные задачи, но только так можно сделать движек наиболее гибким..
Подскажите пожалуйста как это можно сделать..
 

arz_user

Guest
Тоесть должен быть некий тэг <scs> с обязательными параметрами (name, type) и необязательными (class и др)
При обработке шаблона это все должно учитываться и вместо тега подставляться определенная переменная.
 

SergeR

Новичок
Если не принимать во внимание невалидный код, то что именно тебе непонятно? :)

Можно наваять SAX-парсер твоих тэгов, можно разбирать твой документ с помощью функций DOM-экстеншена.
 

Unna:tZ

Guest
Можно самому парсер написать или использовать готовые решения. Готовые решения хуже тем, что нужно дополнительно время (которого обычно не хвататет) на изучение. В "красной библии ПХП" таких решений аж 3 штуки вроде упомянуто. На мой взгяд, для данной задачи их богатых возможностей слишком жирно будет.
Даже имея посредственные знания PHP и XML можно справиться своими силами, т.е. написать свой парсер. Так как сам сейчас занимаюсь похожей работой, поделюсь парочкой мыслей.
На твоём месте я бы сделал макет на XML и обрабатывал бы его с помощью стилей XSL. Выглядит
так:
Макет (простейший):
Код:
<!--maket.xml-->

<maket>
  <scs method="menu" />
  <topic />
</maket>
и таблица стилей:

Код:
<!--maket.xsl-->

<xsl:template match="maket">
<html>
<head>...
...<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
...
и т.д. для всех элементов, которые будут в макете.

Используя всю МОЩЩ регулярных выражений мы сначала обрабатываем стили (aka XSL) например таким
шаблоном:
Код:
~<xsl:template match="(\w+)">([\S\s+?])</xsl:template>~
, а потом с помощью них же заменяем
соответствующие элементы.

Чуть не забыл! <scs method="menu" /> - это элемент, найдя который, парсер обратиться к функции
menu() и полученную от него строку отпарсит с помощью XSL или если в ней нет элементов оставит
как есть.

Кстати, стуктуру разделов тоже очень удобно хранить в виде XML, так как и тут и там мы имеем
дело с древовидной структурой.

Если чего упустил - высказывайте претензии, тема-то очень полезная!

Если кому-то вышенаписанные строки покажутся дилетанством - пишите исключительно на моё мыло [email protected], так как в форуме это писать не обязательно... не о том тут.
=((( Сервер чудит, текстовый редактор мутит, я тормозю... это так, мысли вслух...
 

arz_user

Guest
Unna:tZ
Очень интересно.
Спасибо.
Только вот я не совсем понял как что и кчему должно обращаться?
 

slach

Новичок
Unna:tz ??? и зачем тебе XSLT ??? если ты все через regexp делаешь ???

человеку правильно сказали, для его задачи сгодится SAX модель парсинга

ИДЕМ вот сюда:
http://www.php.net/manual/en/ref.xml.php
читаем примеры
потом вот сюда
http://www.php.net/manual/en/function.xml-set-object.php
читаем наиболее "правильный" пример...

пишем свой парсер наследуя класс...
вуаля...
 

Unna:tZ

Guest
arz_user
к функции menu(), которую пишем сами. Все, что она делает - возращает строку, например такого вида:
<main_page>
<news/>...
...<info/>
</main_page>
и т.д.
slach
Но вообще здесь действительно нужно использовать именно SAX (нам по сути и не нужно знать структуру документа и выполнять с ней какие-либо операции). Но использовать именно для преобразования при помощи стилей XSL. Речь не идёт о XSLT - это слишком круто. Простая замена элементов. Я выбрал описанный выше подход только из-за его простоты. Но как теперь вижу - есть ещё проще и удобнее.
RI
Вот правильная ссылка http://www.w3.org/TR/xslt, а вот перевод: http://pyramidin.narod.ru/xml/xsl/xslt.htm.
 
Сверху