Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Начало создания плагина

1) Создать папку Plugins в нужном модуле. В ней будут храниться модули.

2) Создать файл в формате: ModuleName_PluginName.pm

Пример: Maps2_Msgs.pm

3) Базовая структура плагина:

Code Block
languageperl
themeConfluence
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 Maps2::Maps_view;
  #$Maps_view = Maps2::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
languageperl
themeConfluence
#**********************************************************
=head2 plugin_info()

=cut
#**********************************************************
sub plugin_info {
  return {
    NAME     => 'Название плагина',
    POSITION => 'RIGHT',
    DESCR    => 'Описание плагина'
  };
}

Где POSITION может быть двох типов:

  1. RIGHT - Плагины в колонке Управление
  2. BOTTOM - Плагины внизу тикета в виде таблиц

2) Создать функцию plugin_show. Функция должна возвращать строку.

Code Block
languageperl
themeConfluence
titleПример
#**********************************************************
=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
languageperl
themeConfluence
titleПример
#**********************************************************
=head2 plugin_info()

=cut
#**********************************************************
sub plugin_info {
  return {
    NAME          => 'Название плагина',
    BEFORE_CREATE => [ 'Function1_name', 'Function_name2' ],
    DESCR         => 'Описание плагина'
  };
}

Для плагинов, которые выполняются перед отправкой ответа на зявку нужно добавить параметр BEFORE_REPLY:

Code Block
languageperl
themeConfluence
titleПример
#**********************************************************
=head2 plugin_info()

=cut
#**********************************************************
sub plugin_info {
  return {
    NAME         => 'Название плагина',
    BEFORE_REPLY => [ 'Function1_name', 'Function_name2' ],
    DESCR        => 'Описание плагина'
  };
}

В одном плагине можно совмещать и BEFORE_REPLY, и BEFORE_CREATE

После изминения plugin_info нужно добавить функции, которые будут выполняться.

Пример функции:

Code Block
languageperl
themeConfluence
#**********************************************************
=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
languageperl
themeConfluence
CALLBACK     => {
      FUNCTION => 'название вызываемой функции',
      PARAMS   => {
		#параметры, которые будут переданы
        UID => $attr->{UID},
        ID  => $attr->{ID}
      }
    }


Создание кнопки/ссылки в плагине

Чтобы создать кнопку/ссылку, которая будет возвращаться в плагин нужно к ссылке добавить параметр: &PLUGIN=$self→{PLUGIN_NAME}

Code Block
languageperl
themeConfluence
titleПример создания кнопки
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
languageperl
themeConfluence
sub plugin_show {
  my $self = shift;
  my ($attr) = @_;

  if ($attr->{PLUGIN} && $attr->{PLUGIN} eq $self->{PLUGIN_NAME}) {
    msgs_ticket_form($attr);
    return '';
  }
}