Не заметил данной темы и создал подобную в соседней ветке.
Концепции современной CMS
Модераторы, за что им спасибо, перенесли ее из оффтопика в данный раздел.
Вкратце расскажу о своей идеи (более подробно можно почитать в упомянутой выше теме).
Имеется некий движок, содержащий DBAL, классы для упрощения работы с БД, Create / Delete / Update класс ect. Добавление, удаление, изменение данных по стандартному принципу. А вот для отображения информации следующая технология.
1. Каждый модуль имеет отдельный класс, содержащий методы отображения. Если использовать маски (об этом ниже), зачастую хватает 3-4 методов на целый класс.
2. Шаблоны не привязаны ни к одному модулю. Принадлежность может использоваться лишь для того, чтоб облегчить их поиск и редактирование.
3. Для каждого действия (action) по отображению (!) необходимо зарегистрировать обработчик, а так же указать правила для передаваемых параметров. Действие НЕ связано ни с одним из модулей. В общем случае в обработчике производится дополнительная проверка параметров либо какие-то другие нетривиальные действия. В частном случае – просто указывается карта (начальный шаблон) для парсинга.
4. В карте можно использовать методы отображения любого модуля. Методы могут возвращать шаблоны, содержащие вызовы других методов (ограничений по вложенности нет).
Преимущества такого способа:
1. Шаблоны не зависят от конкретного модуля.
2. При помощи разных шаблонов и одного и того же метода отображения можно строить различный контент, без необходимости правки кода.
3. В соответствие действиям (action) ставятся не с модули, а с шаблоны.
4. Нужные классы подключаются динамически. Всегда вызывается сначала конструктор, затем метод сам отображения. Объекты можно кэшировать для увеличения производительности.
Простой пример с лентой новостей (для просты без разделения на категории).
Создаем методы отображения:
News::List - список новостей.
News::Full - данные об одной новости.
Регистрируем экшены (для простоты все параметры упущу):
main – главная страница, содержащая аннотации к последним 5 новостям, и заголовки с 5 по 10.
full – полная новость по заданному ID и список новостей по теме.
archive – заголовки всех новостей.
И создаем нужные шаблоны:
Для main:
{# News::List("main_news_list", undef, { Limit => [0, 5]) } #}
{# News::List("main_news_title_list"), undef, { Limit => [5, 10] #}
Для full:
{# News::Full("full_news_all", { news_id => {# param.id #} } #}
{# News::List("full_news_title_list"), { theme_id => { # news.theme_id# } } #}
Для archive:
{# News::List("archive_news_title_list") #}
Шаблоны main_news_list, main_news_title_list и т.д. не описываю. Это тройные шаблоны (верх, повторяющаяся строка, низ) которые могут содержать вызовы методов отображения. full_news_all – обычной одинарный шаблон.
Вот так вот двумя методами можно создать систему новостей. Расширяется она ток же просто – никто не мешает зарегистрировать дополнительный обработчики для экшенов, создать новые или расширить существующие методы отображения.
Более сложный пример с кодом приведен здесь:
http://feotast.net/wcp.html