Перед тем как начать, хотел бы предупредить, что довольно много теории я описал в своей статье «Модульное программирование в Zend Framework»,
поетому очень рекомендую сначала прочитать ту статью, а потом перейти к
чтению этого материалла. В той статье просто выложено основные
теоретические понятия о подобном программировании — это избавит Вас от
лишних вопросов. Итак, причины, преимущества и недостатки модульного
программирования можно считать выяснили. Переходим к практике.
Практическое решение
Модульную информационную систему можно показать в виде наглядной диаграммы взаимосвязей:

Программировать модульную систему управления контентом нелегко, ведь задача сводится к эфективной связке компонентов системы между собой. На поданой выше диаграмме, Вы видите организационную структуру модульной CMS-системы поданой в общих чертах. Центром всей системы является ядро, к котрому подсоединяются дополнительные модули.
Способы и методы реализации подобных вещей могут быть очень разнообразные, но сегодня я хочу показать Вам свою программную реализацию.
Суть построения движка, заключается в создании ядра и строго стандартизированного модуля. Каждая из частей такой системы имеет свои наборы моделей, контроллеров, видов. При старте нашего приложения, все управление системой перенимает на себя бутстрап-файл, где происходит её конфигурация и подключение плагинов фронт-контроллера.
Дальше управление передается плагину фронт-контроллера, который осуществляет маршрутеризацию для модулей. Т.е. у меня вся структура сайта хранится в БД по алгоритму вложенных множеств и к каждой ветке сайта прикрепляется метка и модуль, который отвечает за содержимое в данной ветке. Таким образом не нарушается целостность системы и остается техника ЧПУ.
Допустим Вы прошли по адресу http://web-blog.org.ua/news. Плагин разбирает, что за ветка сайта запрошена по заданой метке (news) и передает управление модулю (articles), отвечающего за вывод содержимого, предварительно загрузив с модуля нужные роуты для корректной дальнейшей обработки запросов системой.
Приблизительно, это выглядит так:
Код хорошо документирован, поэтому я не буду больше объяснять.
При программировании модульной CMS-системы, нужно использовать Zend_Layout, для шаблонизации. Но объяснение этих нюансов выходит за рамки статьи…
Далее по ходу действий, управление передается модулю, который должен «знать» текущую ветку (через Zend_Registry) и выдать необходимое содержимое, привязанное к ветке. Т.е. таким нехитрым образом реализуется возможность использовать один модуль, допустим, для 5-ти разных веток сайта и у каждой своё содержимое (пример: на блоге - «Статьи» и «Новости» управляются одним модулем - articles и у каждой свое содержимое), при этом таблица в БД — одна для всех веток.
Далее все происходит стандартно:
- Обрабатывается действие модуля
- Генерируется ХТМЛ конкретного действия
- Вставляется в Layout
- И вуаля — контент на мониторе
При использовании своего CSS-фреймворка, хорошо стандартизированного, иногда смену дизайна можно свести к замене картинок и CSS-файлов.
Т.е. как видите, нужно только грамотно спроектировать наше приложение и программная реализвация не будет вызывать вопросов.
У меня, по-умолчанию, ядро тоже является модулем и исполняет функции обычных текстовых страниц.
Вопрос о программировании сайдбаров очень тонкий, но если использовать дополнительный контроллер, который занимается только выводом сайдбаров, то это тоже тривиальные вещи. Вытягивать срендереный сайдбар можно поблочно с помощью helper'a вида — Action.
Для контроля за выполняющимися в системе действиями (напр. добавление/удаление ветки) нужно ввести такое понятие как «триггеры действий». Для этих целей отлично подходит паттерн программирования Observer, но я, не имея времени, сделал это проще: вызываю строго именованные функции класса модуля (класса, который программно представляет собой модуль наследуюющий общий интерфейс системы).
Все полностью повторяется и для реализации админ-части приложения.
Все! Осталось только вникнуть в выше сказанное и написать необходимые модули. Система готова!
Итог
Статья даёт Вам возможность представить лишь один из множества вариантов решения данного вопроса и не претендует на полность его расскрытия. Все, что я выложил в этой статье, как видите, отлично работает ввиде этого блога…
Если у Вас есть какие-то другие варанты — пишите в камменты, обсудим.


