Как стать автором
Обновить

ZZZ CMS: проверенная временем простая технология создания сайтов

Предисловие


Когда-то в студенческие годы мы с другом подрабатывали фрилансом. И, как большинство фрилансеров, занимались разработкой сайтов. А началось все с того, что нам предложили за месяц разработать сайт для конкурса инновационных проектов. На сайте должно было уместиться три конкурса, и у каждого конкурса должен был быть свой форум. Мы тогда в сайтостроении были не очень сильны и такие требования нас немного напугали. Кинулись смотреть, что есть на эту тему в интернете. Наткнулись на кучу CMS систем вроде Joomla, Drupal, Wordpress… Но у нас не было времени вникать во все тонкости этих замечательных (без сарказма) систем. Тогда было решено взять себя в руки написать простую и нам понятную систему (как и в большинстве случаев). Так появилась ZZZ CMS, которая прошла путь от

image

до

image

Все это лежит в открытом доступе на zzzcms.codeplex.com. Так что если эта статья кому-то понравится, то не примените заглянуть.
Хочу поделиться с вами нашей технологией создания сайтов.

Основная идея


Основная идея состояла в том, чтобы не делать еще одну Joomla. Вот что я имею ввиду: есть frontend, который разработан специально под конкретного клиента. Этот frontend берет свои данные из базы, структура которой тоже разработана под предметную область конкретного клиента. А есть backend-редактор этой базы данных, своеобразное CRUD-приложение. Сейчас для создания такого редактора можно воспользоваться замечательной технологией ADO.NET Entity Framework. Но три года назад про нее было мало известно, да и сыровата она тогда была. Начну с самых низов, а именно

Структура базы


Все таблицы делятся на два вида:
  1. Системные таблицы (начинаются с префикса zzz_)
  2. Таблицы пользователя

Каждая таблица пользователя должна иметь обязательные два поля: Id и Title. Id – естественно, для идентификации записи, Title – для отображения в DropDownList контролах для внешних ключей и CheckBox контролах для отношений типа многие ко многим. Id должно быть autoincrement.
Составные ключи можно использовать в таблицах с префиксом zzz_. Но эти таблицы не видно в backend. Эти таблицы разработчики делают только для себя. Вот несколько предустановленных системных таблиц
  • zzz_Applications, zzz_Personalization, zzz_Profile, zzz_Roles, zzz_Users, zzz_UsersInRoles – таблицы для стандартной системы пользователей. В коде вам будет доступна стандартная система авторизации и аутентификации.
  • zzz_SiteFiles – таблица, где указываются поля других таблиц, являющиеся путями к файлам. В backend это выглядит как FileUpload контрол.
  • zzz_RelationsIDs, zzz_Relations – таблицы для отношений многие ко многим. А о них расскажу поподробнее…

zzz_RelationsIDs выглядит примерно так:

image

Здесь говорится, что баннеры со страницами связаны отношением многие-ко-многим по их Id. Еще есть представление RelationsIDs.
Если вызвать “select * from RelationsIDs” то мы увидим:

image

Как видно, это одна и та же связь, но с разным Direction. Направление нужно, чтобы знать, что означает запись в следующей таблице zzz_Relations:

image

Для случаев, где Direction = 0, Item_id – это Id баннера, а Linked_item_id – Id страницы. Для случаев, где Direction = 1, все наоборот. Это было сделано для того, чтобы не плодить лишние записи в таблице zzz_Relations, потому что она одна на все отношения многие ко многим.
Для облегчения программирования таких связей был создан объект Many2ManyLinkFacade.

Шаблоны полей


Вначале выводится список всех таблиц. Каждая таблица является гиперссылкой, при нажатии на которую попадаешь на ее содержимое. Рядом с каждым полем есть кнопка Выбрать. При ее нажатии попадаешь на страницу редактирования контента. Для каждого поля в таблице в зависимости от его типа существует свой контрол для редактирования.

image

Все шаблоны хранятся в CMS\FieldTemplates.

Пару слов о структуре решения


BusinessObjects – содержит объекты колонки, внешнего ключа и отношения многие-ко-многим. Его можно дополнять объектами из предметной области заказчика.
Facade – обертки для методов из DataObjects.
DataObjects – объекты для взаимодействия с базой данных. Планируется сделать поддержку SQL Server, но пока доступна лишь SQLite
SQLiteMembershipProvider – название говорит за себя.
Transactions – управление транзакциями из кода.
Log – здесь тоже все понятно.
QueryBuilders – вам эти объекты никогда не понадобятся. Они нужны лишь для обновления записей в базе, при редактировании ее через backend.
zzzCMS – веб приложение с backend.
zzzWebSiteExample – пример того, как можно спроектировать базу, чтобы можно было легко управлять ею через backend.

Сайты


Сами сайты можно делать как угодно. Можно разрабатывать для них свои бизнес объекты и бизнес логику, можно использовать Silverlight или Flash, можно просто писать из codebehind Db.Execute(“select * from Banners”), а можно вообще писать сайт на PHP. Здесь никто и ничто не ограничивает полет фантазии дизайнера, разработчика и бюджет менеджера проекта: хочешь — нанимай более дорогих программистов на ASP.NET, а хочешь – более дешевых на PHP. Дешевле не значит хуже! Откуда я взял, что программисты на PHP дешевле? Посмотрел на hh.ru.

BTW


Мне так понравилась статья mace про использование консоли при отладке ASP.Net приложений, что вместо сторонних библиотек вроде log4net и стандартных встроенных средств в виде Trace, я решил использовать именно его логгер ;)
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.