Skip to content

Создание плагина

butschster edited this page Jan 16, 2015 · 3 revisions

Плагином в 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 - продолжение

Итак, init.php, как вы наверно уже догадались, содержит всю основную логику. А именно:

  1. В нем указываются роуты, по которым например будут доступны его контроллеры
  2. Происходит обработка событий.

После того как мы плагин зарегистрировали $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


Страница настроек

Если у плагина должна быть страница настроек, необходимо:

  1. Включить ее при регистрации модуля $plugin = Plugins_Item::factory( array( 'settings' => TRUE, ... ) )->register();
  2. Создать контроллер с Controller_PluginID
  3. Создать 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>