...
Сначала рассмотрим составные части модуля, чтобы понимать, что нужно для написания логически интегрированного функционала.
В ABillS основная часть кода написана в функциональном или процедурном стиле, что влияет на работу с системой. Кроме того, поскольку ООП не используется для полиморфизма или расширения функционала классов через наследование, многие функции принимают аргумент $attr, в котором записаны дополнительные условия выполнения (которые могут кардинально изменять как результат, так и логику выполнения), поэтому нужно всегда учитывать полную сигнатуру вызова при чтении кода.
...
Сами функции должны быть доступны в webinterface (или быть импортированы из других пакетов внутри webinterface).
Поскольку все webinterface выполняются в глобальной области видимости, к имени каждой функции нужно добавлять имя модуля.
...
В основном случае, логика вебинтерфейса проста и прозрачна - получить данные, обработать и вывести в каком-то виде (шаблон или таблица).
Фреймворк неявно (через глобальную область видимости) передаёт в webinterface следующие переменные:
| Имя | Описание |
|---|
| %lang | Хеш-массив словаря |
| %FORM | Хеш-массив значений переданных на страницу (GET или POST запросом) |
| $html | Объект визуализации (экземпляр класса Abills::HTML) |
| $users | Менеджер работы с пользователями (экземпляр класса Users). Использовать только в функциях админ. интерфейса. |
| $db | Соединение с БД |
| $admin | Менеджер работы с администраторами (экземпляр класса Admins) |
| %conf | Хеш-масcив конфигурационного файла |
Для примера рассмотрим работу с сущностью entity в модуле Example
...
Если используется работа с БД, то внутри файла webinterface инициализируется обьект объект менеджера работы с сущностями.
...
Все классы работы с БД наследуются от dbcore.
В таком случае в классе становятся доступны следующие методы:
| query($query, $type, $attr) | Выполнение запроса к БД (в основном используется для операции SELECT) |
| changes($table, $data, $attr) | Обёртка над query("UPDATE …"). Сравнивает данные в таблице и изменяет только поля с обновлёнными значениями. Может добавлять в системный лог записи об изменении |
| query_add($table, $data, $attr) | Обёртка над query("INSERT …"). Добавляет данные в таблицу, инкапсулирует логику обработки значений некоторых типов (ip, netmask, attachment, reply, text…) |
| query_del($table, $data, $extended_params, $attr) | Обёртка над query("DELETE …"), В нормальном случае используется для удаления строки с id = $data->{ID} |
| search_former($search_columns, $attr) | Специальный метод формирования WHERE части запроса. |
Все эти методы должны вызываться в объекте с заданными полями conf, db, admin ($self->{db}, $self->{conf}, $self->{admin}).
...
| Раскрыть | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
|
query($query, $type, $attr)
Метод query() выполняет запрос к базе и в . В зависимости от аргумента $type получает результат и , в зависимости от значений в $attr применяет к нему некоторые преобразования.
Рассмотрим примеры запросов и результат выполнения.
...
Результатом выполнения запроса будет запись в $self->{list_hash} хеша, где ключ ключ – id строки, а значение значение – name.
Теперь рассмотрим ключ COLS_UPPER.
...
Создание базовой страницы
Создаем базовую страницу сервиссервиса
cgi-bin/hello.cgi
| Блок кода | ||
|---|---|---|
| ||
#!/usr/bin/perl
=head1 NAME
Hello world
=cut
use strict;
use warnings;
# Включение нужных путей
BEGIN {
our $libpath = '../';
my $sql_type = 'mysql';
unshift(@INC,
$libpath . "Abills/$sql_type/",
$libpath . "Abills/modules/",
$libpath . '/lib/',
$libpath . '/Abills/',
$libpath
);
}
#Модуль# Модуль конфигурации
use Conf;
our (
$libpath,
%conf,
%lang,
$base_dir,
);
# конфигурационный файл
do "../libexec/config.pl";
# HTML визуализация
use Abills::HTML;
my $html = Abills::HTML->new(
{
IMG_PATH => 'img/',
NO_PRINT => 1,
CONF => \%conf,
CHARSET => $conf{default_charset},
}
);
# Подключение базы
use Abills::SQL;
my $db = Abills::SQL->connect($conf{dbtype}, $conf{dbhost}, $conf{dbname}, $conf{dbuser}, $conf{dbpasswd}, {
CHARSET => ($conf{dbcharset}) ? $conf{dbcharset} : undef
});
# Включение базовых словарей
if($html->{language} ne 'english') {
do $libpath . "/language/english.pl";
}
if(-f $libpath . "/language/$html->{language}.pl") {
do $libpath."/language/$html->{language}.pl";
}
# Подключение модуля работы с шаблонами
require Abills::Templates;
# Включение конфигурационного файла
Conf->new($db, undef, \%conf);
$html->{METATAGS} = templates('metatags_client');
print $html->header();
# Диалоговое окно приветсвия
print $html->message('info', $lang{INFO}, "Hello world\nSystem name '$conf{WEB_TITLE}'");
1; |
...