Table of Contents |
---|
Начало создания плагина
1) Создать папку Plugins в нужном модуле. В ней будут храниться модули.
2) Создать файл в формате: ModuleName_PluginName.pm
Пример:
...
Maps_Msgs.pm
3) Базовая структура плагина:
Code Block | |||
---|---|---|---|
|
...
| |
package ModuleName::Plugins::PluginName;
use strict;
use warnings FATAL => 'all';
my ($admin, $CONF, $db);
my $json;
my Abills::HTML $html;
my $lang;
my $Msgs;
my $Maps_view;
#**********************************************************
=head2 new($html, $lang)
=cut
#**********************************************************
sub new {
my $class = shift;
$db = shift;
$admin = shift;
$CONF = shift;
my $attr = shift;
$html = $attr->{HTML} if $attr->{HTML};
$lang = $attr->{LANG} if $attr->{LANG};
$Msgs = $attr->{MSGS} if $attr->{MSGS};
my $self = { MODULE => 'MODULE_NAME' };
#Если нужно подключить другой пакет, то используем следующий вид
#use |
...
Maps::Maps_view; #$Maps_view = |
...
Maps::Maps_view->new($db, $admin, $CONF, { HTML => $html, LANG => $lang }); bless($self, $class); return $self; } #********************************************************** =head2 plugin_info() =cut #********************************************************** sub plugin_info { return { NAME => 'Название плагина', DESCR => 'Описание плагина' }; } 1; |
Создания плагина вида "в колонке Управление/внизу тикета"
Эти виды плагинов создати для отображения/изменения информации
1) Нужно изменить функцию plugin_info на:
Code Block | ||||
---|---|---|---|---|
| ||||
#********************************************************** =head2 plugin_info() =cut #********************************************************** sub plugin_info { return { NAME => 'Название плагина', POSITION => 'RIGHT', DESCR => 'Описание плагина' }; } |
Где POSITION может быть двох типов:
- RIGHT - Плагины в колонке Управление
- BOTTOM - Плагины внизу тикета в виде таблиц
2) Создать функцию plugin_show. Функция должна возвращать строку.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#********************************************************** =head2 plugin_show($attr) Arguments: Return: =cut #********************************************************** sub plugin_show { my $self = shift; my ($attr) = @_; $attr->{index} ||= $attr->{qindex}; return '' if !$attr->{index}; $attr->{UID} ||= 0; $Msgs->{ID} ||= 0; my $url = "qindex=$attr->{index}&UID=$attr->{UID}&ID=$Msgs->{ID}&header=2"; $url .= ($CONF->{DOCS_PDF_PRINT}) ? '&pdf=1' : ''; $url .= "&PLUGIN=$self->{PLUGIN_NAME}"; return $html->button('', $url, { class => 'btn btn-default', ICON => 'glyphicon glyphicon-print print', TITLE => $lang->{PRINT}, ex_params => 'target=new, data-button-group=1' }); } |
Создания плагина вида "перед добавлением заявки/перед отправкой ответа на зявку"
При создании плагина, который будет срабатывать перед добавлением заявки нужно добавить параметр BEFORE_CREATE значение которого равно масиву из названий функций, которые будут выполняться.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#********************************************************** =head2 plugin_info() =cut #********************************************************** sub plugin_info { return { NAME => 'Название плагина', BEFORE_CREATE => [ 'Function1_name', 'Function_name2' ], DESCR => 'Описание плагина' }; } |
Для плагинов, которые выполняются перед отправкой ответа на зявку нужно добавить параметр BEFORE_REPLY:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#**********************************************************
=head2 plugin_info()
=cut
#**********************************************************
sub plugin_info {
return {
NAME => 'Название плагина',
BEFORE_REPLY => [ 'Function1_name', 'Function_name2' ],
DESCR => 'Описание плагина'
};
} |
В одном плагине можно совмещать и BEFORE_REPLY, и BEFORE_CREATE
После изминения plugin_info нужно добавить функции, которые будут выполняться.
Пример функции:
Code Block | ||||
---|---|---|---|---|
| ||||
#**********************************************************
=head2 Function1_name($attr)
Arguments:
Return:
=cut
#**********************************************************
sub Function1_name{
my $self = shift;
my ($attr) = @_;
return if !$Msgs;
my $statuses = $Msgs->status_list({ TASK_CLOSED => 1, COLS_NAME => 1 });
my $closed_statuses = ();
map push(@{$closed_statuses}, $_->{id}), @{$statuses};
return if !defined($attr->{STATE}) || !in_array($attr->{STATE}, $closed_statuses);
my $work_list = $Employees->employees_works_list({
COLS_NAME => 1,
SUM => '_SHOW',
EXTRA_SUM => '_SHOW',
EXT_ID => $attr->{ID},
WORK_AID => '_SHOW',
WORK => '_SHOW',
WORK_DONE => '0',
});
return if !$Employees->{TOTAL} || $Employees->{TOTAL} < 1;
$html->message('err', $lang->{ERROR}, 'У вас остались не законченые работы!');
return {
RETURN_VALUE => 1,
CALLBACK => {
FUNCTION => 'msgs_ticket_show',
PARAMS => {
UID => $attr->{UID},
ID => $attr->{ID}
}
}
};
}
|
Возвращаемые значения функций:
Если хотите, чтобы после выполнения функции операция(добавление заявки/закрытия) отменилась, то нужно вернуть хеш, в котором будет параметр RETURN_VALUE => возвращаемое значение.
Если после выполения функци нужно вызвать ещё другую функцию, то нужно вернуть хеш, в котором будет следующий параметр:
Code Block | ||||
---|---|---|---|---|
| ||||
CALLBACK => {
FUNCTION => 'название вызываемой функции',
PARAMS => {
#параметры, которые будут переданы
UID => $attr->{UID},
ID => $attr->{ID}
}
} |
Создание кнопки/ссылки в плагине
Чтобы создать кнопку/ссылку, которая будет возвращаться в плагин нужно к ссылке добавить параметр: &PLUGIN=$self→{PLUGIN_NAME}
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
my $url = "qindex=$attr->{index}&UID=$attr->{UID}&ID=$Msgs->{ID}&header=2";
$url .= ($CONF->{DOCS_PDF_PRINT}) ? '&pdf=1' : '';
$url .= "&PLUGIN=$self->{PLUGIN_NAME}";
return $html->button('', $url, {
class => 'btn btn-default',
ICON => 'glyphicon glyphicon-print print',
TITLE => $lang->{PRINT},
ex_params => 'target=new, data-button-group=1'
}); |
После создания кнопки нужно добавить обработчик, который будет вызыватьсь при появлении этого параметра.
Добавлять его можно в любой ф-ции, которая вызывается.
Code Block | ||||
---|---|---|---|---|
| ||||
sub plugin_show {
my $self = shift;
my ($attr) = @_;
if ($attr->{PLUGIN} && $attr->{PLUGIN} eq $self->{PLUGIN_NAME}) {
msgs_ticket_form($attr);
return '';
}
} |