создание модульной системы управления логикой и дизайном сайта (XML+XSLT)

jer

...
создание модульной системы управления логикой и дизайном сайта (XML+XSLT)

Почитал я тут прошлогодний тред неимоверной длинны про CMS и концепцию постороения сайтов.
Которая переросла в споры насчет IE vs NN ;(

Так вот, предлагаю обсудить тему немного уже.
Во первых давайте разобъем управление сайтом на такие подсистемы:

Пусть вся система будет называться Back-Office, которая в свою очередь будет состоять из следующих основных подсистем:

1. CMS (Content Manager System) - подсистема наполнения сайта контентом (под контентом имеется в виду чистые данные, без какого-либо дизайна);
2. DMS (Design Manager System) - подсистема структуры и дизайна (что сложно отделить друг от друга), в идеале биснес-логики в чистом виде.

дальше могут идти подсистема статистики и другие вспомогательные подсистемы - это не так интересно (пока)


a) на данном этапе интересует вторая подсистема (DMS, может есть какое-то устоявшееся название? попровьте меня...).
b) разделение данных и их представления предполагается реализовывать через XML+XSLT
c) система должна быть универсальной, в том смысле что она должна быть модульной. т.е. есть ядро которое взаимодействует с модулями, а сами модули непосредственно реализуют те или инные функции. (т.о. получается что функциональность сайта будет зависеть от набора необходимых модулей)

( ...я сейчас реализую подобную систему, уже процентов на 50 готово... )

у меня получается следующая структура системы:

- система содержит набор модулей (которые можно удалять и инсталлировать)
- каждый модуль содержит блоки
- каждый блок имеет набор входных параметров + xslt шаблон (по умолчанию)

/*
пример:

новости (модуль)
- список новостей (блок)
- одна новость (блок)
*/

модули реализуются в виде классов, блоки в виде методов, например:

PHP:
class news
{
   function news_list($args,$params) // $args - аргументы берутся из базы и передаются ядром при вызове блока
   {                                 // $params - это переменные из стоки http-запроса
     ... здесь генерится xml код (данные берутся из sql-базы)
   }
   function news_one($args,$params)
   {
     ... здесь генерится xml код (данные берутся из sql-базы)
   }
}
- сайт имеет набор страниц
- страница имеет имя + xslt шаблон (оперирующий xslt-шаблонами блоков установленных на странице) + надор блоков установленных на странице
- блок установленный на странице представляет из себя копию исходного блока со своими параметрами + xslt-шаблон (копию не класса или метода, а настроек блока)

вся конфигурация этой системы хранится в базе и при запросе страницы из базы выбирается блоки установленные на данной странице, собираются в единый xml-файл, xslt-куски блоков собираются тоже вместе.
потом выбирается xslt страницы, к нему присовокупляется xslt-блоков

потом делаем xml+xslt->html и плюем клиенту

я описал свою систему достаточно упрещенно, но для затравки думаю хватит. ;)
--------------------------------------------------------------------------------------------------

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

т.о. получается, что надо ввести приоритетность выполнения блока
кто и как унифицирует интерфейс таких достаточно разных модулей?

и кто как реализовывал (если реализовывал вообще) wysiwyg javascript-редактор для xslt?

Интересуют мнения как практиков, кто уже создавал и имеют работающую систему, так и теоретиков думающих о ее создании.
Если кто-то писал/пишет подобную систему, интересны Ваши решения...

ps: Просьба не флеймить на околотематические темы...
 

CM

Guest
Мои две копейки

Для нас сделали корпоративный сайт именно на такой связке - база данных + XML + XSLT = статический HTML контент. Правда на виндовой платформе. Так я уже готов застрелиться от того, как все это работает. Это такое издевательство над клиентом, что даже говорить об этом страшно :mad: .

Если ты это делаешь для себя и у тебя есть соотвествующие знания, доступ к самому серверу и все остальное - то это может быть и хороший вариант. Но если ты планируешь это в качестве CMS для пользования другими людьми - подумай о том, насколько это будет им удобно. Когда разработка только начиналась, планировалось, что все это будет достаточно легко и просто для того, чтобы этим могла пользоваться любая секретарша. В результате получилось НЕЧТО, пользоваться чем могут только реально очень квалифицированные люди. В офисе таких оказалось всего 2 из 30 человек :(.

То есть работает, конечно, но с такими жуткими ограничениями и сложностями, что нормально пользоваться этим невозможно. Я уже готов на то, чтобы полностью переписать все это просто на PHP + MySQL с темплейтами - по крайней мере поддерживать будет удобнее, раз уж все равно "обычные" люди с этой системой работать не смогут.

Сорри, что не совсем в тему, просто наболело... :(
 

slach

Новичок
ну, собственно идея понятна, но не сильно удобна...

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

каким образом у тебя в XML документе будут уживаться ф форуме и анонсы новостей и корзина покупателя и подписка на разные рассылки ???

по твоей схеме это реализовать ОЧЕНЬ сложно.

IMHO тебе надо подумать над тем, чтобы выносить отдельные куски XML кода в статику (с перегенерацией при UPDATE в том или ином модуле) и хранить их допустим в базе (естественно надо иметь SQL таблицу ссылок ID-блока->в какой библиотеке цеплять), а потом цеплять в результирующем XML документе =)
 

slach

Новичок
ну и в догонку...

если идет речь о DESIGN management SYSTEM

то предлагается сделать ВЕБ-конкруктор, который генерит XML шаблон такого типа

PHP:
<document>
 <obj name="shop_basket" phplib="shop_basket.lib.php" xsltemplate="shop_basket_one.xslt">
   <param name="cmd" value="show_brief">
 </obj name>

 <obj name="news_list" align="left" phplib="news.lib.php" xsltemplate="show_news_announcements.xslt">
   <param name="cmd" value="show_news_announcements">
 </obj name>

</document>
т.е. конструктор должен отображать все это дело ВИЗУАЛЬНО как дерево объектов и свойств (с иконками) сделать такое на клиенте MSIE юзая Behaviors + MSXML или под Mozilla XUL не очень сложно (хотя долго)...

алгоритм построения результирующего HTML кода при этом достаточно простой
через DOMXML через Xpath выбираем //obj
оттуда вытаскиваем имя библиотеки и инклудим ее, она в свою очередь заменяет в XML документе этот самый obj в зависимости от параметров <param> (которые не сложно преобразовать в php ассоциативный массив) и содержимого $_GET\$_POST на XML-данные которые уже могут браться как из статики с кешированием, так и из SQL базы

плюс к этому параллельно эта же библиотека формирует часть XSL шаблона в котором содержатся только
PHP:
<xsl:template match="//obj[@name='shop_basket']">
получается очень удобно -> создай шаблон -> определи в нем какие будут блоки и какие будут у них параметры (вплоть до привязке к конкретной зоне на странице top|bottom|left|right)

и определи базовый XSLT шаблон, в котором будут будет скелет HTML и всяческие <xsl:apply-templates select=""> в нужных местах...

причем что хорошо... любая библиотека может реагировать на одни и теже данные пришедшие из $_GET/$_POST по разному....
 

slach

Новичок
>и кто как реализовывал (если реализовывал вообще) wysiwyg javascript-редактор для xslt?

ууу... пробовал, отказался, лучше уж попробовать взять какой нибудь XMLSpy MSIE Plugin... но тоже мороки многовато...
 

jer

...
2CM: ну во первых я не обсуждаю делать или нет, а обсуждаю как е делать... 2-е: делаю не только для себя, поэтому и хочу многие вещи сделать максимально визуальными и абстрагироваться от html и xslt-шаблонов.

2slach:

задумайся вот над чем, как ты собираешься делать перекрестные ссылки между разными модулями??
вроде уже сделал, просто у каждого блока в качестве аргументов (настроек блока) могут быть ссылки на страницы (на идентификатор страницы), а внутри блока ссылки формируются автоматически, вроде достаточно удобно выходит.
каким образом у тебя в XML документе будут уживаться ф форуме и анонсы новостей и корзина покупателя и подписка на разные рассылки ???
этот xml формируется автоматически из xml-кусков которые формируют блоки установленные на странице. например:
<page>
<newslist>
<news id="1"><title></title><date></date><desc></desc></news>
<news id="2"><title></title><date></date><desc></desc></news>
<news id="3"><title></title><date></date><desc></desc></news>
</newslist>
<basket>
<prod id="1">...</prod>
<prod id="2">...</prod>
<prod id="3">...</prod>
</basket>
<forum>
... структура данных форума ...
</forum>
</page>

примерно так...
?
по твоей схеме это реализовать ОЧЕНЬ сложно.

IMHO тебе надо подумать над тем, чтобы выносить отдельные куски XML кода в статику (с перегенерацией при UPDATE в том или ином модуле) и хранить их допустим в базе (естественно надо иметь SQL таблицу ссылок ID-блока->в какой библиотеке цеплять), а потом цеплять в результирующем XML документе =)
зачем хранить xml? у меня база, например из 10 000 товаров, и что мне столько кусков xml-ля хранить? это бред ИМХО.
пусть генерятся каждый раз автоматом, не так уж это долго.

а насчет хранения структуры страницы, которую ты предложил делать в xml, у меня в принципе функционально похожая вещь (очень, и парамерты передаются в виде ассоциотивных массивов, в виде двух, в одном аргументы (настройки блока), во втором входные параметры GET и POST), но реализована несколько подругому, у меня структура страницы (набор блоков и настройки этих блоков) хранится в sql-базе. вроде тоже удобно (да и работает это наверное быстрее), вот насчет ее отображения и редактирования - твой вариант наверное удобней... хотя это гемморно на javascript-е реализовывать (для меня по крайней мере), пока пишу на php.
это у меня пилотная версия, напишу работающую, а потом посмотрю что и как можно улучшить...

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

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

еще ты сказал что идея не сильно удобна... у тебя есть более удобные варианты?
 

Konstantin

Guest
Мы делали, что-то похожее. Суть такова.
Есть набор объектов на ПХП. Каждая страница состоит из несколькоих объектов, главного XSL -шаблона с указаним куда нужно вставлять результаты выполнения этих объектов, и набора шаблонов которые привязанны к данным объекта на это й странице.
В результате стоиться общее XML-дерево со всеми выводами объектов,и один XSL-шаблон, составляемый из главного и мелких шаблорнов для каждого модуля.
 

Konstantin

Guest
Плюс для повышения производительности используеться кеширование
 

jer

...
вот-вот, можешь поподробнее описать про взаимодействие "ядра" с модулями, про разнотипные модули (новости, статьи, база товаров, корзина, голосование, авторизация, регистрация, например) как вы их унифицировали (их интерфейс). и вообще саму систему целиком. ???
 

jer

...
и что из этого у вас вышло? удобная система? и насколько гибкая?
 

[DAN]

Старожил PHPClub
И я пару копеек добавлю :)
В качестве ориентира рекомендую присмотреться к http://www.struts.ru/
Я вытащил оттуда идею (и идеологию).

Теперь про DMS. slach в своем первом посте вполне четко описал приемлимый вариант.
Можно еще нагенерить кучу шаблонов и просто подключать их.
Имхо, заказчику не надо давать возможность редактирования дизайна, иначе он такое натворит, что сайт на хоумпагу станет похож.
 

slach

Новичок
[DAN], а я и не хотел делать инструмент для секретарши
я хотел сделать интрумент для весьма квалифицированного сотрудника и проэктировщика... чтобы можно было используя простейшие шаблоны (базовые)... сформировать более или менее работающий сайт без дизайна... и чтобы верстальщик потом только скелет и templates делал...
 

jer

...
да, этот инструмент большей частью будет для разработчика, но если продвинутый заказчик захочет, то сможет сам что-то поменять/добавить... а разнраничить доступ к этому инструменту - это уже другая проблема.
посмотрел http://www.struts.ru/, интересная вещица. но мне надо нечто более узкое и с удобным интерфейсом (в идеале визуальным). а за ссылку спасибо, думаю оттуда можно массу интересных идей подчерпнуть. еще почитаю...

[DAN], а что у тебя за система получилась?

[DAN] и slach, есть возможность посмотреть на ваши системы или на доку хотя бы?
 

jer

...
заказать чтоли? %) .. хоть посмотрю...

можешь хотя бы с пяток скриншотов основных кинуть?
 

[DAN]

Старожил PHPClub
Автор оригинала: jer
[DAN], а что у тебя за система получилась?
Пока что всё находится в заключительной стадии проектирования.
Как только будет готова, выложу на всеобщее обозрение.
 

Илья2

Guest
я тоже добавлю своего "слона" :)
это генерация в статике сайта из xml посредством xslt,
идея там в том что вначале по шаблонам (точнее по объектам которые отвечают за содеражние элементов) формируется xml, и потом на него накладывается xslt
http://xml-sm.phplab.net на основе него я сделал http://www.eya.ru доработал некоторые модули, чтобы можно было информацию по постерам брать из внешнего xml файла (который генерится из сохраненного Excel файла).

А по поводу редактирования Xml файлов (настроечных), у меня давно витает идея использовать UML редакторы, которые сохраняют в XMI (это формат хранения UML). Года два назад я даже написал небольшой конвертор (точнее это xslt трансформация которая генерила txt Файл который закачивался программой) из XMI Файла сохраненного из Rational Rose который формировал вложенные xml тэги в соответствие со структурой UML классов (это могут быть и "страницы сайта") нарисованные мною. В общем это вполне реально. Надо только свободное время.
пример http://www.objectsbydesign.com/projects/xmi_to_html.html
 
Сверху