-
Notifications
You must be signed in to change notification settings - Fork 35
Создание плагина
Плагином в CMS является ничто иное, как обычный модуль для Kohana за исключением пары особенностей. Вся внутренняя структура файлов и папок такая же.
В стандартную комплектацию KodiCMS входит несколько плагинов - скелетов в помощь для разработки.
Skeleton - в который входит большинство конфигов, показана структура и многое другое.
Skeleton_Dashboar_Widget - в который входят файлы, необходимые для создания виджета для рабочего стола.
Skeleton_Wodget - в который входят файлы, необходимые для создания виджета.
Любой плагин должен, как и модуль, содержать файл init.php
, где указываются его названия, используемые им css, js и его регистрация ну и происходят какие то глобальные операции.
Пример регистрации:
$plugin = Plugins_Item::factory( array( 'id' => 'archive', 'title' => 'Archive', 'description' => 'Provides an Archive pagetype behaving similar to a blog or news archive.', ) )->register();
Что можно указать в параметрах плагина:
id
- Название папки, также как и ключ доступа к плагину, должен быть уникальным
title
- Название плагина
description
- Описание
version
- Версия
css
- Подключаемые стили (Поиск файлов относительно корня плагина)
javascripts
- Подключаемые javascripts фйлы, также как и стили указываются относительно корня плагина
settings
- Есть ли страница настроек (bool)
Между тем параметры
css
иjs
могут содержать как строку, если надо подключить один файл, так и массив.
Итак, как только мы зарегистрировали плагин в системе, он появляется в списке плагинов и его можно активировать.
Если вам нужно, чтобы в момент активации плагина, происходило событие, то его нужно поместить в файл enable.php
в корень плагина, при деактивации соответсвенно - disable.php
Это нужно например, чтобы создавать в БД новые таблицы, ну или например установить дефолтные настройки для плагина.
После того как плагин подлючен, происходит: Kohana::modules( Kohana::modules() + $plugins );
, где $plugins
- список плагинов.
Соответсвенно дальше они уже работают как обычные модули.
Каждый плагин может хранить в БД свои настройики.
Для добавления и обновления в БД используется:
Plugins_Settings::set_all_settings( array $array, $plugin_id)
- добавление в виде массива данных
Plugins_Settings::set_setting($name, $value, $plugin_id)
Соответственно если в БД есть уже настройки, они обновятся, если нет - создадутся.
Для получения:
Plugins_Settings::get_settings( $plugin_id = NULL )
- получение всех настроек ( если указан ID, то для конкретного плагина ). Данные кешируются и обновляются при обновлении настроек.
Plugins_Settings::get_setting( $name, $plugin_id, $default = NULL )
- получение конкретной настройки
Итак, init.php
, как вы наверно уже догадались, содержит всю основную логику. А именно:
- В нем указываются роуты, по которым например будут доступны его контроллеры
- Происходит обработка событий.
После того как мы плагин зарегистрировали $plugin = Plugins_Item::factory(....)->register()
, становятся доступными его методы.
->enabled()
- Статус плагина (активен, не активен)
->get_settings()
- эквивалентно Plugins_Settings::get_settings( $plugin_id )
Соответственно если нам надо чтобы код выполнялся после того, как плагин активирован:
if( $plugin->enabled() ) { .... }
Также есть именованная константа IS_BACKEND
, которая устанавливается в TRUE
если мы в админке, соответсвенно используем чтобы выполнять код только в backend:
if( IS_BACKEND ) { .... }
На сайте имеется ряд Observers событий для инъекции стороннего кода в CMS.
Например:
Если в шаблоне сайта создать событие Observer::notify('page_layout_bottom')
, то после подключения плагина в этом месте выведется шаблон yandexmetrika/footer
if ( $plugin->enabled() ) { Observer::observe( 'page_layout_bottom', 'enable_yandex_metrika', $plugin ); } function enable_yandex_metrika( $plugin ) { echo View::factory( 'yandexmetrika/footer' , array( 'plugin' => $plugin ) ); }
Пример интеграции в страницу настроек: plugins/maintenance/init.php
Если у плагина должна быть страница настроек, необходимо:
- Включить ее при регистрации модуля
$plugin = Plugins_Item::factory( array( 'settings' => TRUE, ... ) )->register();
- Создать контроллер с
Controller_PluginID
- Создать view файл
views/pluginID/settings
, в нем будет доступна переменная$plugin
- объект содержащий текущий плагин.
Пример view:
<div class="widget-header"> <h3><?php echo __('General settings'); ?></h3> </div> <div class="widget-content"> <div class="control-group"> <?php echo Form::label('setting_disqus_id', __('Profile ID'), array('class' => 'control-label')); ?> <div class="controls"> <?php echo Form::input('setting[disqus_id]', $plugin->get('disqus_id'), array( 'id' => 'setting_disqus_id', 'class' => '' )); ?> </div> </div> </div>