В данном разделе описано как создавать собственные модули для системы.
Модуль для системы должны находиться в папке /usr/abills/Abills/modules. Название модуля лучше всего писать с заглавной буквы New_module
. В каталоге модуля должно быть обязательно два файла webinterface и config.
Включение модуля в конфигурационном файле: libexec/config.pl
@MODULES = ( 'Modulename' );
Пример файла:
#Iner_ID : Main or Sub or if -1 user menu func list %FUNCTIONS_LIST = ("01:0:$_ICARDS:cards_main:" => 5, "04:1:BRUTE FORCE:cards_bruteforce:" => 5, "05:1:$_ICARDS:cards_main:" => 5, "06:1:$_DILLERS $_TARIF_PLANS:cards_dillers_tp:" => 5, "06:5:$_ADD:cards_add:" => 5, "08:0:$_ICARDS:cards_user_payment:UID" => 2, "09:0:$_ICARDS:cards_report:" => 4, "11:8:$_DILLERS:cards_report_dillers:" => 4, "12:0:$_DILLERS:cards_dillers_list:" => 1, "13:0:$_DILLERS:cards_diller:UID" => 15, ); %USER_FUNCTION_LIST = ("01:0:$_ICARDS:cards_user_payment:" => 0, ); %RESELLER_FUNCTION_LIST = ("01:0:$_ICARDS:cards_reseller_face:defaultindex" => 0, "02:1:$_REPORTS:cards_diller_stats:" => 1 ); %PERIODIC = (daily => [ 'cards_bruteforce_clean' ] );
В данном файле можно объявлять следующие переменные которые влияют на работу и отображение модуля в системе.
%FUNCTIONS_LIST = ("01:0:$_ICARDS:cards_main:UID" => 5);
В данном примере обявлена одна функция визуализации.
01 | Номер функции в данном модуле |
---|---|
0 | Номер родительской функции. Если 0 (ноль) функция является корневой. Если значение больше нуля то функция располагается в меню под родительской функцией |
$_ICARDS | Название функции в меню панели управления |
cards_main | Название фукции которая выполняется при нажатии соответственного меню |
UID | Дополнительные параметры. Они могут быть и не объявлены. Если объявляются тогда меню показывается только если данные доп параметры присутствуют HTTP запросе. Например ели объявлен параметр UID то данная функция будет отображаться только если в запросе он присутствует. Пример запроса: http://your.host:9443/index.cgi?UID=15 |
5 | Номер корневого каталога в котором разместить меню. Номера корневых меню: 1 - Клиенты 2 - Оплаты 3 - Снятие денег 4 - Отчёт 5 - Настройка 6 - Мониторинг 7 - Поиск 8 - Обслуживание 9 - Профиль |
В системе доступно несколько видов функций:
daily | Дневные переодические функции |
---|---|
monthly | Месячные переодические функции |
reports | Функции составления дневные отчётов |
пример объявления:
%PERIODIC = (daily => [ 'dv_daily_fees', 'dv_users_warning_messages'], monthly => [ 'dv_monthly_fees', 'dv_periodic_logrotate' ], report => [ 'dv_report' ]);
Проверить
дневной периодик
/usr/abills/libexec/periodic daily MODULES=[module name]
В данном файле должны располагаться функции модуля
По умолчанию система использует файлы language/english.pl и региональные ukraine.pl,russian.pl и т. д. Если нужно для модуля создать собственные словари они должны размещаться в папке модуля с названиями lng_xxx.pl.
Например:
lng_english.pl lng_ukraine.pl lng_russian.pl
Если модуль имеет свои собственные языковые файлы система автоматически их подгружает
На первой страницы системы можно разместить несколько быстрых отчётов. Какие отчёты размещать определяет администратор в меню профайл. Ниже будет описано как создать быстрый отчёт в созданном вами модуле.
Для того чтобы сообщить системе что модуль (в нашем примере название модуля New_module) имеет быстрые отчёты нужно создать функцию
под названием New_module_start_page Данная функция должна возвращать ссылку на ассоциированный массив значений в котором ключ это название функции выводящей быстрое меню а значение её описание.
Пример:
sub new_module_start_page { my ($attr) = @_; my %START_PAGE_F = ('new_module_sp_report' => 1 ); return \%START_PAGE_F; }
создаём сам отчёт
sub new_module_sp_report { print "Hello, World"; }
Для разделения работы с базой и элементов визуализации все функции работы с базой помещаются в каталог /usr/abills/Abills/[название базы данных]
Для СУБД mysql это /usr/abills/Abills/mysql.
query_add($table, $values, $attr) - Добавление данных в базу.
Аргументы:
$values | хеш ключей и значений, например [COL_NAME] ⇒ [value] |
---|---|
$table | название таблицы |
$attr | дополнительные атрибуты |
Дополнительные атрибуты:
REPLACE | Меняет команду INSERT на REPLACE |
---|
Пример:
$self->query_add( 'table_name', {COL_NAME_1 => VALUE_1, COL_NAME_2 => VALUE_2, COL_NAME_3 => VALUE_3}, {REPLACE => 1} );
query_del($table, $values, $extended_params, $attr) - удаление данных из базы.
Аргументы:
$table | название таблицы |
---|---|
$values | параметры удаления |
$extended_params | расширенные параметры удаления, хеш ключей и значений, например [COL_NAME] ⇒ [value] |
$attr | дополнительные параметры |
Дополнительные параметры:
CLEAR_TABLE | очищается таблицу целиком |
---|
Пример:
$self->query_del('table_name', {COL_NAME => VALUE}); $self->query_del('table_name', {}, {CLEAR_TABLE => 1});
changes2($attr) - вносит изменения в базу
$attr | параметры, хеш ключей и значений |
---|
Параметры:
CHANGE_PARAM | параметр изменения, изначально ID (обязателен) |
---|---|
SECOND_PARAM | дополнительный параметр изменения |
TABLE | название таблицы (обязателен) |
DATA | новые данные (хеш ключей и значений) |
EXT_CHANGE_INFO | |
FIELDS | |
OLD_INFO | |
ACTION_ID |
Пример:
$self->changes2( { CHANGE_PARAM => 'ID', TABLE => 'TABLE_NAME', DATA => {COL_NAME_1=>VALUE_1, COL_NAME_2 => VALUE_2} } );
query2($query, $type, $attr) - выполнение своих команд в базу
Параметры:
$query | запрос |
---|---|
$type | тип запроса, undef - with fetch result like SELECT, do - do query without fetch (INSERT, UPDATE, DELETE) |
$attr | дополнительные параметры |
Дополнительные параметры:
COLS_NAME | Возвращает ссылку на хеш. Имя колонки как ключ хеша |
---|---|
COLS_UPPER | Сделать ключи большими буквами |
INFO | Return fields as objects parameters $self→{LOGIN} |
LIST2HASH | Возвращает хеш, вместо листа {KEY⇒VAL} |
MULTI_QUERY | Мультизапросы (только для INSERT, UPDATE) |
Bind | Массив или бинд значений [ 10, 12, 33 ] |
DB_REF | Обьект БД. Используется когда работа идет с несколькими ДБ северами |
test | Исполняется без запроса. Если исползуется $self→{debug} показывается запрос. |
Пример:
$self->query2( "SELECT * FROM table_name;", undef, {} );
Для визуализации используется система шаблонов
отображение глобального шаблона системы c названием form_chg_tp. Глобальные шаблоны системы размещаются в каталоге Abills/main_tpls/.
print $html->tpl_show(templates('form_chg_tp'), $attr, { ... });
Функция templates() ищет шаблон в каталоге кастомных шаблонов а также сморит есть ли языковой шаблон данного типа.
параметр $attr передаёт обработчику шаблонов ссылку на массив значений маркеров переменных
отображение шаблона для модуля (шаблоны модулей сохраняются в каталоге Abills/module/[module_name]/templates)
print $html->tpl_show(_include('dv_users_search', 'Dv'), $attr);
Функция _include() загружает шаблон dv_users_search для модуля DV
Если указать атрибут data-check-for-pattern=«RegExp»
, где RegExp - JavaScript шаблон, то при вводе значение будет проверяться на соответствие патерну.
Если значение не соответствует патерну, родительскому элементу добавляется класс has-error
. Текст label и рамка input меняют цвет на красный.
Если значение соответствует шаблону, клас has-error
снимается.
Шаблоны JavaScript тут: http://javascript.ru/RegExp\
Для полей ввода IP-адресов, достаточно добавить класс ip-input
. Автоматически добавится патерн для проверки коректности IPv4 или IPv6 адреса.
Добавить атрибут data-input-disables=%ID%
в <input> (<select>, <input type='checkbox'>)
При вводе значения, удаляет значение в <input id='%ID%'> и добавляет свойство disabled
.
Если указать id тега <fieldset>, отключит все <input> внутри тега.
Можно указать несколько Id через запятую (без пробелов).
Обратное поведение ( включить поле ввода по значению ), можно используя атрибут data-input-enables=%ID%
Добавьте элементу атрибут data-tooltip
для отображения всплывающей подсказки.
Значением атрибута можут быть любой HTML код.
Аттрибут data-tooltip-position
управляет позицией tooltip'а, возможные значения left, right, top, bottom.
По умолчанию, браузер не отправляет неотмеченый checkbox, иногда это может быть неудобно.
Если checkbox используется в форме, где нужно отсылать неотмеченное состояние, укажите аттрибут data-return='1'
Автоматически отправляет форму после изменения. Доступны 2 варианта
my $colors_css = $html->form_select( 'COLORS', { SELECTED => $admin->{SETTINGS}->{COLORS} || q{}, SEL_ARRAY => \@names, NO_ID => 1, SEL_OPTIONS => { '' => $lang{DEFAULT} }, EX_PARAMS => "data-auto-submit='index=$index&AWEB_OPTIONS=1'" } );
<select>
my $custom_select = $html->form_select( 'CUSTOM', { SELECTED => $FORM{CUSTOM} || q{}, SEL_ARRAY => \@options, NO_ID => 1, SEL_OPTIONS => { '' => $lang{NO} }, EX_PARAMS => "data-auto-submit='form'" } );
Доступно через аттрибут data-visible
.
Любое значение интерпретируемое в JS как false
добавит display : none
Любое значение интерпретируемое в JS как true
добавит display : block
Отобразить время от/до наступления даты (3 часа назад
, 5 дней назад
, Через 3 дня
)
<span class='moment-insert' data-value='YYYY-MM-DD hh:mm:ss'></span>
Отобразить временной интервал (3 часа
, 5 дней
)
<span class='moment-range' data-value='ss'></span>
Есть возможность добавить в кабинете пользователя подтверждение действий паролем. Для этого необходимо добавить форме класс pswd-confirm
. При попытке сабмита формы с этим классом, откроется модальное окно для ввода пароля. Введенный пароль добавится к данным формы.
(работает при включенной опции $conf{user_confirm_changes}=1;)
Функция формирование результирующей таблицы используя SQL, XML JSON или HASH данные
my ($table, $list) = result_former({ INPUT_DATA => $Dv, FUNCTION => 'list', BASE_FIELDS => 0, DEFAULT_FIELDS => 'LOGIN,FIO,DEPOSIT,CREDIT,TP_NAME,DV_STATUS', FUNCTION_FIELDS => 'form_payments,dv_stats, del, change', EXT_TITLES => { 'ip' => 'IP', 'netmask' => 'NETMASK', 'speed' => $_SPEED, 'port' => $_PORT, 'cid' => 'CID', 'filter_id' => 'Filter ID', 'tp_name' => "$_TARIF_PLAN", 'dv_status' => "Internet $_STATUS", 'dv_status_date' => "$_STATUS $_DATE", 'online' => 'Online', 'dv_expire' => "Internet $_EXPIRE", 'dv_login' => "$_SERVICE $_LOGIN", 'dv_password' => "$_SERVICE $_PASSWD" }, TABLE => { width => '100%', caption => "Internet - $_USERS", qs => $pages_qs, ID => 'INTERNET_USERS_LIST', header => $status_bar, EXPORT => 1, MENU => "$_ADD:index=" . get_function_index('dv_wizard_user') . ':add' . ";$_SEARCH:index=$index&search_form=1:search", }, MAKE_ROWS => 1, SEARCH_FORMER=> 1, MODULE => 'Dv', TOTAL => 1 });
Если у системе подключён модуль Maps для объектов имеющих возможность гео привязки можно рисовать карту покрытия
Для включения опции карты параметр
MAP => 1,
Также можно указать информацию для отображения на сводных таблицах
MAP_FIELDS => 'ID,CLIENT_ID,SUBJECT'
И фильтр обработки параметров полей сводной таблицы
MAP_FILTERS => { id => 'search_link:msgs_admin:UID,chg={ID}', }
При отображении элементов на карте система устанавливает цвета точек гео локации
Белый | нет привязанных объектов к точке |
Зелёный | не больше 3 привязаных элементов к точке геолокации |
Синий | Больше 3 меньше 10 |
Жёлтый | Больше 10 меньше 20 |
Красный | Больше 20 |
Огонь | Критическое состояние точки |
$html->make_charts( { PERIOD => $graph_type, #Период графика, DATA => \%DATA_HASH, AVG => \%AVG, TRANSITION => 1, TYPE => {column_name => 'type' }, X_LINE => [ $val ], X_TEXT => [ $val ], DATA => { cols_name => [ $val ] }; OUTPUT2RETURN => 1, } );
PERIOD
Период и тип графиков
week - недельный с пн по пт
year - Год
month - месячный от 1 до 31 числа
hour - почасовой график 0 до 24 часов
pie - круг
AVG
Усреднённые значения
TRANSITION
Анимация визуализации
TYPES
⇒ {column_name ⇒ 'type' },
тип отображения значений поля на графике
column_name - название колонки
type - тип:
LINE | Линия |
COLUMN | колонка на колонках |
AREA | Заполнение |
SCATTER | Отображение точками |
PIE | Отображение параметров поля круговым графиком |
X_LINE
⇒ [ $val ],
Текст X оси
X_TEXT
⇒ [ $val ],
Текст X оси
DATA
⇒ { cols_name ⇒ [ $val ] };
массив значений
cols_name - название колонки
$val - список значений для отображения
Если задана $attr→{PERIOD}, то в зависимости от значения, формируются категории (X_TEXT) и корректируется длина массива (отрезается 0-ой индекс).
'week_stats' | ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] | 7 |
'month_stats' | [1,2,3,4,5,6,7,8,9,…,31] | 31 |
'year_stats' | ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] | 12 |
'day_stats' | ['00:00:00', '01:00:00','02:00:00',…, '24:00:00'] | 24 |
OUTPUT2RETURN
отдать значение в STDO
Получить index функции.
Поскольку, все значения индексов формируются во время выполнения, есть необходимость резервировать index'ы некоторых функций.
Начиная с версии 0.77.66 можно заполнять дополнительные подсказки для полей шаблона.
При использовании новой схемы отображения шаблона
$html->tpl_show('', { VAR1 => 'VAL1', }, { TPL => 'module_entity', MODULE => 'Module', HELP => 1 });
Если задан ключ HELP ⇒ 1
, к шаблону добавится контент файла module_entity_help.tpl
, который будет обработан на странице.
Формат файла шаблона подсказок: ID:комментарий.
Пример:
MODULE:Имя модуля EXTRA:Ссылка для получения доп. информации COMMENTS_id:Коментарии (текст уведомления)