Skip to content
Butschster edited this page Jul 14, 2015 · 8 revisions

Модули


Структура модуля

Структура модуля аналогична структуре той, что в папке app/. Список подключаемых модулей CMS указывается в config/cms.php, модули загружаются в том порядке, в котором указаны.

Пример добавления модулей

...
'modules' => [
	'modulename', // Namespace: KodiCMS\modulename, Path baseDir/modules/modulename
	'ModuleName2' => [
		'path' => {relative path to module},
		'namespace' => '\\CustomNamespace\\Test\\'
	]
]
...
  • config - конфиги приложения, могут быть перезаписаны из папки /config/
  • permissions.php - Служит для указания списка прав
  • sitemap.php - Служит для указания страниц для меню админ панели
  • behaviors.php
  • Console
  • Commands - расположение файлов консольных компанды
  • database
  • migrations - файлы миграции, будут запущены по команде cms:modules:migrate
  • seeds
  • DatabaseSeeder.php - если существует, то будет запущен по команде cms:modules:seed
  • Helpers - вспомогательные классы модуля
  • Http
  • Controllers - контроллеры модуля
  • Middleware
  • routes.php - роуты текущего модуля, оборачиваются в неймспейс KodiCMS\{module}
  • Observers - Наблюдатели для моделей Eloquent
  • Providers
  • ModuleServiceProvider.php - Сервис провайдер (наследуемый от KodiCMS\ModulesLoader\Providers\ServiceProvider), если есть, будет запущен в момент инициализации приложения
  • resources
  • js - JavaScript файлы, в этой папке происходит поиск js файлов по виртуальным путям /backend/cms/js/{script.js}
  • lang - Файлы переводов для модуля, доступны по ключу названия модуля приведенного в нижний регистр trans('{module}::file.key')
  • views - Шаблоны модуля, доступны по ключу названия модуля приведенного в нижний регистр view('{module}::template')
  • packages.php - В данном файле можно подключать свои Assets (Media) пакеты
  • Services - Сервисные контейнеры
  • ModuleContainer.php - Если данный файл существует, то он будет подключен как системный файл модуля, в котором указаны относительыне пути и действия в момент инициализации. Необходимо наследовать от KodiCMS\ModulesLoader\ModuleContainer

Состав модулей

  • CMS
  1. Dashboard
  • Pages
  1. Page
  2. Layout
  3. PagePart
  • Users
  1. User
  2. Role
  3. Permission
  • Widgets
  1. Widget
  2. Blocks
  3. Snippet
  • Filemanager
  1. elFinder
  • Email
  1. Email
  2. Email Templates
  3. Email Types

Процесс загрузки приложения выглядит следующим образом:

  1. Запуск KodiCMS\ModulesLoader\Providers\ModuleServiceProvider и инициализация загрузчика модулей
  2. KodiCMS\CMS\Providers\RouteServiceProvider - подключение маршрутов во всех модулях, обернутых в namespace текущего модуля KodiCMS\ModuleName
  3. KodiCMS\CMS\Providers\EventServiceProvider
  4. KodiCMS\CMS\Providers\BusServiceProvider
  5. KodiCMS\CMS\Providers\ConfigServiceProvider - загрузка конфига из БД
  6. KodiCMS\ModulesLoader\Providers\AppServiceProvider - производит запуск в каждом модуле KodiCMS\{ModuleName}\Providers\ModuleServiceProvider

Инициализация загрузчика модулей

Загрузчик производит поиск в каждом модуле файла ModuleContainer.php наследованного от KodiCMS\ModulesLoader\ModuleContainer и при его наличии подключает его, в случае отсутствия используется KodiCMS\ModulesLoader\ModuleContainer.php.

ModuleContainer содержит основные методы, которые вызываются в каждом модуле во время запуска приложения.

Для каждого модуля устанавливаются из названия модуля приведенного к нижнему регистру неймспейсы для view и translator, т.е. для использования view шаблона находящегося внутри модуля его необходимо вызвать view(modulename::...) или trans(modulename::...)

Доступ к данным модулей

Загрузчик модулей зарегистрирован в системе как Singleton и доступен в любом месте приложения через фасад ModulesLoader либо app('modules.loader').

Основные методы

  • addModule($modulename. $modulepath = null, , $namespace = null) - добавление модуля в загрузчик
  • getRegisteredModules() - получение списка объектов модулей
     ModuleLoader::getRegisteredModules()
    
     // return
     [
     	ModuleContainerInterface $module,
     	...
     	ModuleContainerInterface $moduleX
     ]
     

Основные методы модуля

  • getName() - получение названия модуля
  • getNamespace() - получение неймспейса
  • getPath($subpath = NULL) - получение абсолютного пути до модуля или пути до переданного пути относительно модуля
  • getLocalePath() - путь до языковых файлов
  • getViewsPath() - путь до шаблонов
  • getConfigPath() - путь до конфигов
  • getServiceProviderPath() - путь до сервис-провайдера

Работа с файлами модулей

Для удобства работы с файлами модулей используется фасад ModulesFileSystem

Основные методы

  • getPaths($subpath = null) - получение массива путей относительно каждого модуля. Пригодится если вам необходимо получить спиcок всех модулей у которых есть директория /modulename/resources метод выведет
     ModuleLoader::getPaths('resources')
    
     // return
     [
     	'modulename' => '{dir}/modulename/resources',
     	...
     ]
     
  • findFile($dir, $file, $ext = null, $array = false) - поиск определенного файла во всех модулях. Возвращает (путь|список путей) найденых файлов. Поиск файлов кешируется на 10 минут.
     ModuleLoader::findFile('resources/js', 'PagesController', 'js')
    
     // return
     {dir}/Pages/resources/js/PagesController.js
    
     ModuleLoader::findFile('resources', 'packages', 'php', true)
    
     //return
     [
     	{dir}/CMS/resources/packages.php,
     	{dir}/Cron/resources/packages.php,
     	{dir}/Widgets/resources/packages.php
     ]
    
     

Данный метод используется для поиска и подключения медиа файлов по виртуальным путям, которые хранятся внутри модулей и плагинов.

  • listFiles($directory = null, $ext = null) - листинг файлов внутри директории каждого модуля с учетом порядка загрузки модулей. Т.е. если вым необходимо найти список всех шаблонов по относительному пути resources/snippets

Порядок загрузки модулей: ['API', 'CMS', 'Email', 'Plugins', 'Pages', 'Users', 'Cron', 'Widgets', 'Filemanager', 'Installer', 'Dashboard', {Plugins ... }, 'App']

если два модуля содержат файл с одинаковым названием snippet.php, то в список попадет файл из того модуля, который загружен был самым последним. Т.е. по приоритету файлы в App выше, чем в остальных модулях системы.

<pre>
ModuleLoader::listFiles('resources/snippets')

//return
[
	resources/snippets/snippet.php => [splFileInfo]
]

</pre>

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


Для просмотра списка подключенных модулей в системе используйте консольную команду:

php artisan cms:modules:list