Архитектура CMS на фреймворке Yii.
Я написал на Yii один крупный проект, несколько мелких, и сейчас заканчиваю еще один крупный проект. Познакомился я с Yii год назад. Не сказал бы что я досконально с ним разобрался, но все же опыт какой то появился.
Вот хотел бы поделиться тем, как я организую приложение на Yii.
И так, архитектура папок у меня такая
assets libs protected components/ config/ controllers/ data/ extensions/ messages/ models/ modules/ runtime/ tests/ public themes
Ну во, вроде ничего лишнего нет.
Теперь к сути. Не пойму, зачем по умолчанию в Yii в корневом каталоге есть папки css, js и images. Ведь есть же папка для тем themes, пусть там и лежат. Ведь все это относится только к темам. Да, я согласен, что иногда, JS тоже выполняет операции не только визуального оформления, но в основном такие скрипты принадлежат конкретному модулю и находятся в папке assets данного модуля, либо мы выносим этот файл(ы) в библиотеку.
Папка assets, всем понятно для чего, там хранятся временные файлы.
В папке libs я собираю JS библиотеки и JS скрипты которые требуются в разных частях приложения, такие как uploadify, lightbox, jquery.bxSlider и другие. В основном это сторонние разработки. Почему меня не устроило название папки JS и я его переименовал в libs спросите вы. Дело в том, что в этой папке хранится целиком и полностью вся библиотека со стилями и картинками для нее. А дает это нам то, что при добавлении новой библиотеки не придется ее расчленять(стили в 1 папку, скрипты в другую, картинку в третью) и потом в стилях, и не дай бог в JS, менять пути к картинкам.
В папке public у меня для каждого модуля создается папка(если необходимо) и там лежат все публичные файлы. Картинки товаров для интернет-магазина, файл загруженные пользователем и т.д.
В папке components у меня тоже не все стандартно, там лежат 2 класса
MasterBackEndController
MasterFrontEndController
Оба они унаследованы от основного класса Controller. В каждом модуле есть папка components и там 2 класса. Как вы правильно догадались BackEndController и FrontEndController. Они унаследованы от MasterBackEndController и MasterFrontEndController соответственно. Таким образом для Админки мы можем задавать общие функции и переменные для всех модулей, и для каждого модуля в отдельности, что по моему очень хорошо. Вот у меня в MasterBackEndController и MasterFrontEndController сразу стоят разные layout. И в MasterBackEndController стоит фильтр по правам доступа.
return array('rights');
}
Честно признаюсь, что я еще не думал как реализовать разные темы для back и front режимов, но это необходимо сделать. Просто руки не доходят.
Таким образом, получается, что все мое приложение состоит из модулей в которых контроллеры, отвечающие за back функционал унаследованы от BackEndController а контроллеры, отвечающие за front, унаследованы от FrontEndController.
Да я делаю разделение. Весь контроллер отвечает либо за back, либо за front.
Суть: админка у каждого модуля своя!
Как жеж так спросите вы. А все очень просто. У меня есть модуль Admin. Его задача формировать меню панели администратора.
Мы создаем меню, допустим такого вида:
-Контент ---Статьи // модуль article ---Новости // модуль news ---Информ. Страницы // модуль page
У каждого такого пункта меню есть поля:
1) Права (Тут мы назначаем видимость данного пункта конкретной роли. Допустим так Manager, или так Article.Admin.*. Формат модуля Rights )
2) Корневому пункту меню(в данном случае “Контент”) мы еще списком присваиваем названия модулей на которых это меню отображается. Допустим мы присвоили такую строку “article, news”.
Это означает, что если мы в данный момент находимся в БэкЕнде модуля news то нам отображаются все дети меню “Контент” с учетом прав доступа.
Да, тут есть свои ограничения. По сути, мы просто группируем модули в логические разделы.
Подытожим:
У меня всю приложение состоит из модулей. В каждом модуле есть FrontEnd и BackEnd контроллеры унаследованные от соответствующих контроллеров.
Один модуль администрирования, который управляет пунктами меню в панели администрирования. Все сторонние JS библиотеки лежат в папке libs, все что касается визуального оформления лежит в темах.
Есть какие-нибдь мысли по этому поводу? Делитесь в комментариях.
Я бы тоже хотел освоить Yii, но там столько всего по напихали что сидеть разбираться месяцами я не хочу. Уже пытался.
Пользуюсь fuelphp – а если что то надо я просто могу переделать строннюю библиотеку под себя и все.
Выражаю вам свое подчение за знание yii, что бы его выучить надо иметь очень большое желание и много времени.
Спасибо =)
Да нет, на самом деле ничего сложного. Достаточно написать несколько проектов, более менее сложных и все, вы хорошо освоили Yii. А если еще и просто мануалы почитать так вообще замечательно.
Хотя мне просто может сравнивать не с чем, Это мой первый PHPшный фреймворк.
Вы не задумывались над идеей создания CMS на yii? Лично я собираюсь приступить к выполнению этой задачи после окончания 2011 года, а пока курю мануалы лазаю по блогам и пишу первый проект каталог недвижимости.
Нет, не задумывался.
Что бы написать нормальную CMS нужно очень много времени. Если писать ее одному, то пока половину напишешь, уже что-то новое выйдет, и будешь изменять, изменять и так бесконечно.
Время на написание CMS к сожалению не оплачивается, так что давайте оставим эту работу профи, которые за разработку CMS ежедневно получают деньги.
Если вы студент, или школьник, или у вас просто есть свободное время то тогда вам рекомендуется написать свою CMS, так как это огромный опыт.
Да я студент. У меня тема диплома написание CMS для блогов. Выбрал YII хотя сначала думал писать на Zend.
Ну тогда вам очень повезло =)
У меня тема диплома была “Разработка технологического процесса и производства вала-шестерни редуктора привода двух-спирального классификатора”
Ого. А обоснование разработки новой cms будете делать? Т.е. какие сильные стороны будут у вашей cms по сравнению с тем же wordpress?
Боже упаси делать конкурента вордпресу.
Под CMS я подразумеваю систему оправления контентом. По сути любой сайт где есть админка позволяющая менять информацию на сайте есть CMS.
Я не хочу, и надеюсь что никогда не буду писать универсальные CMS. И вам не советую. Только для получения опыта.
В статье я поделился видением архитектуры файлов и папок под фреймворк Yii, для написания какого либо сайта, который будет расширять свой функционал модулями и виджетами.