- PVSM.RU - https://www.pvsm.ru -

Архитектура KodiCMS

Введение

Всем привет, в этой статье я постараюсь кратко рассказать о компонентах, которые составляют архитектуру CMS, их много (думаю все они не поместятся в статью), контроллерах, модулях, плагинах и организации подключения css, js файлов.

Основой KodiCMS является Kohana framework версии 3.3.2. Ядром системы является модуль “kodicms”, который содержит основную логику работы и расширяется с помощью наблюдателей (Observers) через модули и плагины.

Cписок модулей, которые были разработаны для CMS:

  • API — Работа с AJAX запросами, поддерживает типы запросов GET, POST, PUT, DELETE. Ответ в формате json, либо HTML
  • Behavior — расширение поведения Frontend страниц
  • Dashboard — рабочий стол и все что с ним связано
  • Datasource — основа для создания разделов данных (с помощью него созданы разделы Гибридные данные [1], Категории [2], Рейтинг документов [3]), отключаемый
  • elFinder — файловый менеджер, отключаемый
  • Email, Email _Queue — отправка почты, массовая рассылка почты, разделы Email в Backend и tasks для менеджера задач, отключаемый
  • FileSystem — классы для работы с ФС
  • Installer — Инсталлятор системы
  • KodiCMS — Ядро системы
  • Navigation — Навигация в Backend
  • Page_Parts — Части страниц (Связан со модулем Pages через Observer), отключаемый
  • Pages — модуль страниц сайта, теоретически отключаемый
  • Plugins — модуль плагинов, организует расширение системы плагинами, отключаемый
  • Reflinks — помощник генерации временных ссылок, например Вспомнить пароль [4] или Подтверждение регистрации [5]
  • Scheduler — Календарь для Backend, а также менеджер задач Cron, отключаемый
  • Search — поиск по сайту, содержит драйвер полнотекстового поиска, список можно дополнять собственными драйверами
  • Sidebar [6], отключаемый
  • Snippet — модуль организации кусков кода, которые можно вставлять в шаблон, также используется модулем “Widget” для шаблонов видежтов, отключаемый
  • Tags — организация тегов в модуле страницы и Гибридных данных, отключаемый
  • Update — модуль обновления системы, отключаемый
  • Users — пользователи системы, ACL
  • Widget — Виджеты, блоки помещаемые на страницы сайта, выводят какую либо информацию, отключаемый

*отключаемый — возможно отключение в application/init.php [7]

В системе помимо разработанных мной модулей есть стандартные модули и сторонние разработки

  • Assets — для организации CSS, JavaScript
  • Breadcrumbs — генерация хлебных крошек, используется виджетом “Хлебные крошки”
  • Captcha
  • Minion — используется менеджером задач для запуска запланированных задач (tasks [8])
  • Pagination

Модуль KodiCMS

Основной модуль CMS, именно в нем происходит расширение стандартного функционала Kohana, содержаться базовые контроллеры для работы с Backend, конфиги, хелперы и т.д.

Настройки

В системе существует несколько типов хранения настроек:

  • Файловые конфиги
  • Таблица в БД, для переопределения файловых конфигов (Кешируется)
  • Отдельная таблица для хранения информации плагинов (Кешируется)
  • Хранение пользовательской информации User_Meta (Например, набор и расположение виджетов на рабочем столе), как в WordPress и Bitrix, SugarCRM и т.д. (Кешируется)

Каждый модуль, а также плагин системы может переопределять, либо добавлять новые параметры [9] в конфиг файл, поэтому было решено использовать их для хранения тех данных, которые мог бы дополнять сторонний разработчик в своем модуле или плагине, поэтому в конфиги вынесены данные для:

  • построения sitemap админ панели — sitemap.php [10]
  • указания возможных типов страниц — behaviors.php [11]
  • списка прав доступа к контроллерам админ панели — permissions.php [12]
  • списка разделов данных — datasources.php [13]
  • списка доступных виджетов — widgets.php [14]
  • списка драйверов для модуля поиска — search.php [15]
  • списка доступных задач для менеджера задач Cron — jobs.php [16]
  • списка типов полей для раздела “Гибридные данные” — fields.php [17]

Т.е. при создании плагина, если необходимо добавить пункт меню (sitemap.php), новый раздел в backend (datasources.php), расширить права доступа к новым контроллерам (permissions.php) или добавить новую задачу в планировщик [18] (jobs.php) в нем создается конфиг файл.

Контроллеры

Контроллер системы имеет несколько уровней абстракции

  1. Пустой контроллер System_Controller [19]
  2. Security контроллер проверки прав доступа System_Security [20] < System_Controller
  3. Template контроллер отвечающий за шаблоны страниц System_Template [21] < System_Security
  4. Backend контроллер System_Backend [22] < System_Template, от которого наследуются все контроллеры для доступа к которым необходима авторизация. В этом контроллере происходит подключение всех необходимых css, javascript и т.д.
  5. Frontend контроллер System_Frontend [23] < System_Template, от которого наследуются все контроллеры для доступа к которым не нужна авторизация. (Авторизация, Вспомнить пароль, Страница ошибки)
  6. Media контроллер для поиска media файлов (сss, js и т.д.) во всех модулях и плагинах в папке media [24], т.е. если в плагине создать папку media/css и положить в нее css файл (test.css), то к нему можно будет обратиться как cms/media/css/test.css
  7. API контроллер System_API [25] < System_Ajax используется в основном для ajax (GET, POST, PUT, DELETE) запросов, причем экшены в контроллере бывают также нескольких типов get_…, post_…, put_…, delete_…, в зависимости от того какого типа приходит запрос.
  8. Front [26] контроллер для Frontend страниц.

Давным-давно я рассказывал о такой структуре на оф. форуме kohana [27], возможно этот пост кому-нибудь покажется полезным.

Frontend контроллер

Роут для этого контроллера стоит последним в списке. При вызове контроллера происходит поиск страницы по URL (запросы кешируются), далее проверка типа страницы, проверка доступа к странице, через обсерверы подключение виджетов, частей страницы и других расширений, для админа подключение профайлера в HTML шаблон (+ на будущее добавлена возможность создания тулбара через View, как в модных CMS типа Bitrix, WordPress и т.д.), кеширование на стороне браузера и указания типа страницы (в slug поле в настройках страницы можно указать расширение, например, rss.xml и вывод будет с соответствующим Content-Type).

Я нарисовал схему пути, который проходит запрос при вызове frontend контроллера, схема немного запутанная и главное не запутаться в стрелках и найти Request.

Архитектура KodiCMS [28]

Организация media (css, js, less, image) файлов

Основные media файлы системы находятся в папке cms/media.
Основной файл стилей css/common.css компилируется из LESS файлов и сторонних библиотек, среди которых Twitter Bootstrap, Font-Awesome и др., перекомпиляция происходит при включении плагина Less [29] и внесении изменений в файл less/common.less [30], он же является основным.

Главный JavaScript файл — js/backend.js [31] (возможно будет описан в одной из будущих статей)

Для подключения css и js в шаблонах используется модуль Assets, который был немного доработан, а именно, написан менеджер пакетов Assets_Package, который позволят группировать media файлы в пакеты [32]. Он же может использоваться во frontend для быстрого подключения библиотек, а также в виджетах.

// Пример использования пакетов во Frontend шаблоне
Meta::factory($page)->package(array('jquery', 'bootstrap', 'holder', 'fontawesome', 'demo-assets'));

Каждый модуль и плагин в системе также может иметь папку media с аналогичной структурой и подключаться в контроллере как cms/media/…. без указания названия модуля, поиск файлов осуществляется через Kohana::find_file и поэтому пути нахождения файлов кешируются.

Также при запросе backend контроллера происходит поиск для него javascript файла cms/media/js/controller/controller_name.js [33]

Модули и Плагины

Помимо стандартных возможностей модулей (и плагинов в том числе) в них была добавлена поддержка инсталляции.

В момент запуска инсталлятора происходит поиск и вызов в каждом модуле файла install/observers.php [34], в момент инсталляции системы инсталлятор проходится по всем модулям и смотрит наличие файлов install/schema.sql [35], а затем install/dump.sql [36] а после уже запуск install/install.php [37]

Т.к. в плагинах есть возможность активации и деакцивации, то для них также добавлены install.php [38], uninstall.php [39], install/drop.sql [40], а также в файлы frontend.php [41] и backend.php [42], которые работают аналогично init.php, но подключаются во Frontend/Backend.
В остальном работа плагинов не отличается от стандартных модулей Kohana.

P.S
В предыдущей статье я забыл упомянуть о том, что для KodiCMS существует репозиторий плагинов: github.com/KodiCMS [43], его же можно увидеть в backend [44].

В следующей статье я хотел бы рассказать об устройстве одного из модулей или нескольких модулях, либо показать пример реализации простого сайта или описать возможности раздела "Гибридные данные [45]".
В общем если вам интересно что-либо узнать, пишите, постараюсь рассказать.

Автор: ButscH

Источник [46]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/cms/72044

Ссылки в тексте:

[1] Гибридные данные: https://github.com/butschster/kodicms/tree/master/cms/plugins/hybrid

[2] Категории: https://github.com/KodiCMS/plugin-categories

[3] Рейтинг документов: https://github.com/KodiCMS/plugin-rating

[4] Вспомнить пароль: https://github.com/butschster/kodicms/blob/master/cms/modules/reflinks/classes/reflink/forgot.php

[5] Подтверждение регистрации: https://github.com/butschster/kodicms/blob/master/cms/modules/reflinks/classes/reflink/register.php

[6] Sidebar: https://github.com/butschster/Kohana-sidebar

[7] application/init.php: https://github.com/butschster/kodicms/blob/master/cms/application/init.php#L40

[8] tasks: https://github.com/butschster/kodicms/tree/master/cms/modules/email_queue/classes/task/email

[9] переопределять, либо добавлять новые параметры: http://kohanaframework.org/3.3/guide/kohana/config#config-merging

[10] sitemap.php: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/config/sitemap.php

[11] behaviors.php: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/config/behaviors.php

[12] permissions.php: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/config/permissions.php

[13] datasources.php: https://github.com/butschster/kodicms/blob/master/cms/plugins/hybrid/config/datasources.php

[14] widgets.php: https://github.com/butschster/kodicms/blob/master/cms/plugins/hybrid/config/widgets.php

[15] search.php: https://github.com/butschster/kodicms/blob/master/cms/modules/search/config/search.php

[16] jobs.php: https://github.com/butschster/kodicms/blob/master/cms/modules/search/config/jobs.php

[17] fields.php: https://github.com/butschster/kodicms/blob/master/cms/plugins/hybrid/config/fields.php

[18] планировщик: http://demo.kodicms.ru/backend/jobs/add

[19] System_Controller: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/classes/kodicms/controller/system/controller.php

[20] System_Security: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/classes/kodicms/controller/system/security.php

[21] System_Template: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/classes/kodicms/controller/system/template.php

[22] System_Backend: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/classes/kodicms/controller/system/backend.php

[23] System_Frontend: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/classes/kodicms/controller/system/frontend.php

[24] media: https://github.com/butschster/kodicms/tree/master/cms/modules/kodicms/media

[25] System_API: https://github.com/butschster/kodicms/blob/master/cms/modules/api/classes/controller/system/api.php

[26] Front: https://github.com/butschster/kodicms/blob/master/cms/modules/pages/classes/kodicms/controller/front.php

[27] kohana: http://forum.kohanaframework.org/discussion/10412/postroenie-arhitektury-prilozheniya

[28] Image: http://www.kodicms.ru/public/images/forum/schemes/Frontend.pdf

[29] плагина Less: https://github.com/KodiCMS/plugin-less

[30] less/common.less: https://github.com/butschster/kodicms/blob/master/cms/media/less/common.less

[31] js/backend.js: http://github.com/butschster/kodicms/blob/master/cms/media/js/backend.js

[32] группировать media файлы в пакеты: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/init.php

[33] cms/media/js/controller/controller_name.js: https://github.com/butschster/kodicms/blob/master/cms/modules/pages/media/js/controller/page.js

[34] install/observers.php: https://github.com/butschster/kodicms/blob/master/cms/modules/plugins/install/observers.php

[35] install/schema.sql: https://github.com/butschster/kodicms/blob/master/cms/modules/kodicms/install/schema.sql

[36] install/dump.sql: https://github.com/butschster/kodicms/blob/master/cms/modules/pages/install/dump.sql

[37] install/install.php: https://github.com/butschster/kodicms/blob/master/cms/modules/plugins/install/install.php

[38] install.php: https://github.com/butschster/kodicms/blob/master/cms/plugins/test/install.php

[39] uninstall.php: https://github.com/butschster/kodicms/blob/master/cms/plugins/hybrid/uninstall.php

[40] install/drop.sql: https://github.com/butschster/kodicms/blob/master/cms/plugins/hybrid/install/drop.sql

[41] frontend.php: https://github.com/butschster/kodicms/blob/master/cms/plugins/maintenance/frontend.php

[42] backend.php: https://github.com/butschster/kodicms/blob/master/cms/plugins/maintenance/backend.php

[43] github.com/KodiCMS: https://github.com/KodiCMS

[44] backend: http://demo.kodicms.ru/backend/plugins/repo

[45] Гибридные данные: http://demo.kodicms.ru/backend/datasources?ds_id=2

[46] Источник: http://habrahabr.ru/post/240781/