CMS и бизнес логика

ps2007

Новичок
CMS и бизнес логика

Доброго времени суток, знатоки.

Пишу свою CMS общего назначения, вкратце она будет работать так:
- ФронтКонтроллер обрабатывает запрошенный URL и определяет, какой шаблон соответствует запрошенной странице,
а также извлекает параметры из URL (если они есть).
- Запускаются модули, которые необходимы для построения страницы (например для получения списка новостей).
Модули сами не генерируют HTML, а просто возвращают данные или выполняют определенные действия.
- После того, как отработали все модули полученные данные передаются шаблонизатору, который генерирует HTML.

Требования к CMS (по крайней мере хотелось так сделать):
- используется паттерн MVC;
- система должна быть достаточно гибкой (хотя это каждый понимает по своему);
- неограниченные возможности построения HTML;
- модуль ничего не знает о существовании других модулей;
- модуль ничего не знает, о том, как будут использоваться данные, которые он генерирует;
- шаблонизатор не знает, каким образом были приготовлены для него данные;
- для отображения страницы будут задействованы только необходимые модули, а не все установленные.

т.е. я хочу добиться разделения бизнес-логики и логики представления (пожалуйста не нужно флейма на эту тему).

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

Вопрос заключается в следующем:
Где и как организовать подобного рода логику ?

У меня есть два решения, но они меня не устраивают. Я специально не оглашаю их сейчас, сделаю это позже.

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


В форуме поднимались похожие вопросы, но на свой вопрос я не нашел ответа.

Спасибо
 

С.

Продвинутый новичок
Проблема в том, что бизнес-логика заключается не только в функционале модулей (может я ошибаюсь ?).
Совершенно верно. Есть еще логика отображения.
Где и как организовать подобного рода логику ?
В том, что отвечает за отображение - в шаблоне. Разве есть варианты?
 

ps2007

Новичок
В том, что отвечает за отображение - в шаблоне. Разве есть варианты?
Полностью с этим согласен, но вопрос не об этом, видимо я плохо описал задачу.

Совершенно верно. Есть еще логика отображения.
Я имел ввиду вопрос о бизнес-логике. Достаточно ли функционала модулей для решения любых задач ? Или должна быть какая-нибудь надстройка, специфическая для каждой страницы, которая вызывает модули, производит какие-нибудь вычисления или логические действия над результатами работы модулей а затем обработанные данные отправляет в шаблонизатор ?

Нет смысла делать такую CMS, ядро которой придется переделывать под каждый проект, поэтому хочу найти универсальное решение.
 

С.

Продвинутый новичок
Нет логики отображения самой по-себе. Логика отображения возникает при решении бизнес-задачи.

Модуль и так является надстройкой над страницей. Зачем там еще один этаж поверх модуля? Что там будет делаться?
 

Anarki

Новичок
Проблема в том, что бизнес-логика заключается не только в функционале модулей (может я ошибаюсь ?).
Например, если пользователь авторизован, то вывести какой-нибудь блок на странице,
если нет, то не показывать этот блок на странице.
Тут скорее всего класс авторизации должен быть включен в архитектуру CMS, хотя бы абстрактный. Потому как он достаточно глобальный. Модули, будут наследоваться от класса общего, который будет уже знать о том, что есть такая штука - авторизация и если нет прав(ACL), то модуль не запускается или не выдает данные.
 

С.

Продвинутый новичок
Будет авторизация частью контроллера или модели, здесь совершенно не важно. Важно, что где-то в шаблоне придется поставить "if", тем самым наполнив его логикой.
 

ps2007

Новичок
Зачем там еще один этаж поверх модуля? Что там будет делаться?
Пожалуй Вы правы, я не нашел ни одного примера, для того, чтобы в этом слое что-то выполнялось. Раньше я думал, что там должна выполняться логика авторизации, но Anarki подсказал более удачное решение.

Как я и обещал, рассказываю о своих 2-х решениях:
1) Примерно так у меня сейчас и работает.
Используются активные шаблоны и шаблон как правило состоит из нескольких файлов. К главному шаблону подключаюся другие шаблоны (список новостей, меню, прочее). В подшаблоне происходит вызов модуля и генерация HTML. В конечном итоге в главном шаблоне в нужных местах вставляются HTML блоки, которые сгенерировали подшаблоны.
Это решение меня не устраивает тем, что бизнес-логика и логика отображения может смешаться.

2) За каждым главным шаблоном "закреплен" некоторый PHP файл, который будет создавать программист при работе над сайтом. В нем будет происходить вызов модулей, выполняться какие-нибудь действия в случае необходимости и результат (данные) затем будет передан шаблонизатору.
Это решение меня не устраивает тем, что лишний слой выглядит как пятое колесо.
 

С.

Продвинутый новичок
Это решение меня не устраивает тем, что бизнес-логика и логика отображения может смешаться.
Если они физически в разных файлах, то как смешаются?

За каждым [под]шаблоном закреплен свой модуль. Все вполне логично.

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

ps2007

Новичок
Если они физически в разных файлах, то как смешаются?
Смешать можно, если захотеть, или например по незнанию. Вот примеры:
- Контроллер передает цвет элемента;
- в Контроллере формируется кусок HTML (например выпадающий список select);
- в Виде отображается тот или иной кусок шаблона, в зависимости от того, пользовалель "admin" или нет.
<? if ($user === 'admin'): ?>
.....
<?endif?>

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

atv

Новичок
Это решение меня не устраивает тем, что бизнес-логика и логика отображения может смешаться.
Масло в огонь. Логика отображения - это тоже бизнес логика, только касающаяся ОТОБРАЖЕНИЯ данных, но всё равно она остаётся БИЗНЕС логикой (продиктована условиями бизнеса). А где быть бизнес логике, как не в контроллере :)

По поводу бизнес логики в ЦМС. Логика, это уже программирование. Программирование, это PHP (ну или любой другой ЯП), и это не для конечного пользователя ЦМС. Максимум, что ему можно предложить и позволить, это конфигурирование уже готовых компонентов.
 

itprog

Cruftsman
Логика отображения - это тоже бизнес логика, только касающаяся ОТОБРАЖЕНИЯ данных, но всё равно она остаётся БИЗНЕС логикой (продиктована условиями бизнеса).
не согласен. Бизнес логика это то что касается взаимодествия базы данных с интерфейсом. Потому логика отображения никак не может прямо влиять на бизнес логику
 

ps2007

Новичок
...уверены, что всё именно так и будет ?
Я же написал, что будет работать "примерно так", т.е. некоторые ненужные детали я опустил :) Пока архитектура CMS в разработке, т.е. может измениться.
Если точно, то сейчас это работает следующим образом:
- ФронтКонтроллер обрабатывает запрошенный URL и определяет, какой шаблон соответствует запрошенной странице и находит id документа. У меня будет сквозная идентификация документа (статьи, новости, картинки, опроса, прочего).
Также ФронтКонтроллер извлекает параметры из URL, если они есть (это еще не сделал).
- Запускается шаблон, который относится к запрашиваемой странице. В этом шаблоне происходит вызов модуля, который по id документа генерирует данные (контент). Есть возможность подключать подшаблоны в нужные места шаблона. Также есть возможность указывать Главный Шаблон, в который будет передан HTML, сгенерированный текущим шаблоном.

Как это работает можете посмотреть здесь:
http://mycms.rork.ru/

Скачать можно отсюда:
http://mycms.rork.ru/mycms.zip

Просьба сильно не пинать, я не хотел показывать недоделанную работу. Админку я даже и не начинал делать, и кроме того есть "косяки", о которых я помню, но нет времени или знаний устранить.

Логика отображения - это тоже бизнес логика, только касающаяся ОТОБРАЖЕНИЯ данных, но всё равно она остаётся БИЗНЕС логикой (продиктована условиями бизнеса). А где быть бизнес логике, как не в контроллере
Не знал, спасибо :) Раньше я думал, что это две разные сущности. Но никак не соглашусь с тем, что в контроллере должна быть логика отображения.

и это не для конечного пользователя ЦМС. Максимум, что ему можно предложить и позволить, это конфигурирование уже готовых компонентов.
Это понятно :) Но перед этим нужно написать ядро, которое позволит гибко взаимодействовать между компонентами CMS.
 

atv

Новичок
Бизнес логика это то что касается взаимодествия базы данных с интерфейсом.
Это очень узкое трактование бизнес логики. Упоминается и база данных и интерфейс.

Более широкое трактование, бизнес логика - это логика продиктованная условиями бизнеса. Например, отправка подтверждающего письма по почте, это тоже пример бизнес логики.

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

ps2007

Новичок
логика отображения может реализовываться разными способами, в том числе, используя неявную логику шаблонизатора.
Честно говоря не понял, о чем речь, можете показать пример ?
 

atv

Новичок
Ой, на форуме много обсуждалось по теме шаблонизаторов, а также неявной логики шаблонизатора. Поищи по форуму на тему xslt, неявная логика, шаблонизатор, логика отображения. Найдёшь для себя много чего полезного.
 

Anarki

Новичок
На самом деле плевать на эти термины, главное чтобы было удобно клиенту.
А вот с ифами в шаблонах рождаются верстальщики:
под cms1
под cms2
под cms3
под cms4

xlst тоже нечего для сайтов визиток пихать
 

valeraorg

Новичок
советую не придумывать велосипед, а почитать как устроена MVC у самых известных фреймверков. (Symfony и ZEND framework)
 

HraKK

Мудак
Команда форума
Так много умных слов, а такое гавно. Чем меня всегда поражают ПХП "программисты" - всегда расуждают о чем то высоком, считают всех вокруг полными ламерами и пишут свои цмс.
ps2007
Выкинь в фтопку свою цмс и займись чем-то полезным. Ок?
 
Сверху