Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
abills:docs:development:manual:ru [2018/01/14 19:01] anton [Основная часть - вебинтерфейс] |
abills:docs:development:manual:ru [2019/02/21 10:57] (текущий) andriy [Основная часть модуля - вебинтерфейс] |
||
---|---|---|---|
Строка 31: | Строка 31: | ||
==== Основная часть модуля - вебинтерфейс ==== | ==== Основная часть модуля - вебинтерфейс ==== | ||
В основном случае, логика вебинтерфейса проста и прозрачна - получить данные, обработать и вывести в каком-то виде (шаблон или таблица).\\ | В основном случае, логика вебинтерфейса проста и прозрачна - получить данные, обработать и вывести в каком-то виде (шаблон или таблица).\\ | ||
+ | Фреймворк неявно (через глобальную область видимости) передаёт в ''webinterface'' следующие переменные: | ||
+ | ^ Имя ^ Описание ^ | ||
+ | |%LANG |хеш-масив словаря | | ||
+ | |%FORM |хеш-масив значений переданных на страницу (GET или POST запросом) | | ||
+ | |$html |Обьект визуализации (экземпляр класса ''Abills::HTML'') | | ||
+ | |$users |Менеджер работы с пользователями (экземпляр класса ''Users''). **Использовать только в функциях админ. интерфейса.** | | ||
+ | |$db |Соединение с БД | | ||
+ | |$admin |Менеджер работы с администраторами (экземпляр класса ''Admins'')| | ||
+ | |%conf |хеш-масив конфигурационного файла | | ||
+ | |||
Для примера рассмотрим работу с сущностью ''entity'' в модуле ''Example''\\ | Для примера рассмотрим работу с сущностью ''entity'' в модуле ''Example''\\ | ||
Строка 48: | Строка 58: | ||
Если используется работа с БД, то внутри файла ''webinterface'' инициализируется обьект менеджера работы с сущностями. | Если используется работа с БД, то внутри файла ''webinterface'' инициализируется обьект менеджера работы с сущностями. | ||
<code perl> | <code perl> | ||
- | use Example # Загрузить файл /usr/abills/Abills/mysql/Example.pm | + | use Example; # Загрузить файл /usr/abills/Abills/mysql/Example.pm |
my $Example = Example->new($db, $admin, \%conf); # Создать объект менеджера | my $Example = Example->new($db, $admin, \%conf); # Создать объект менеджера | ||
</code> | </code> | ||
- | |||
В коде функция работы с сущностями будет выглядеть так: | В коде функция работы с сущностями будет выглядеть так: | ||
Строка 67: | Строка 76: | ||
my $show_template = $FORM{add_form} || 0; | my $show_template = $FORM{add_form} || 0; | ||
| | ||
- | # Здесь используется глобальный хеш %FORM, который доступен в глобальной области видимости и включает значения, полученные из GET или POST запроса. | + | # Здесь используется глобальный хеш %FORM, |
+ | # который доступен в глобальной области видимости | ||
+ | # и включает значения, полученные из GET или POST запроса. | ||
if ($FORM{add}) { | if ($FORM{add}) { | ||
$Example->entity_add({%FORM}); | $Example->entity_add({%FORM}); | ||
Строка 89: | Строка 100: | ||
} | } | ||
| | ||
- | # Использование этой точки выхода позволяет использовать эту же функцию только для выполнения операции (например AJAX запросом) | + | # Использование этой точки выхода |
+ | # позволяет использовать эту же функцию | ||
+ | # только для выполнения операции (например AJAX запросом) | ||
return 1 if $FORM{MESSAGE_ONLY}; | return 1 if $FORM{MESSAGE_ONLY}; | ||
- | | + | |
+ | # Здесь собрана логика обработки данных для отображения шаблона | ||
if ($show_template) { | if ($show_template) { | ||
- | # Здесь собрана логика обработки данных для отображения шаблона | ||
# Отображение шаблона | # Отображение шаблона | ||
$html->tpl_show( | $html->tpl_show( | ||
Строка 106: | Строка 119: | ||
} | } | ||
| | ||
- | # Использование этой точки выхода позволяет использовать эту же функцию для отображения шаблона изменения внутри модального окна | + | # Использование этой точки выхода |
+ | # позволяет использовать эту же функцию | ||
+ | # для отображения шаблона изменения внутри модального окна | ||
return 1 if ($FORM{TEMPLATE_ONLY}); | return 1 if ($FORM{TEMPLATE_ONLY}); | ||
| | ||
+ | # Использование библиотеки Abills::ResultFormer | ||
+ | # для получения списка из БД (метод $Example->entities_list($attr)) и построения таблицы (Abills::HTML->table($attr)) | ||
my Abills::HTML $table; ($table) = result_former( | my Abills::HTML $table; ($table) = result_former( | ||
{ | { | ||
Строка 135: | Строка 152: | ||
} | } | ||
); | ); | ||
+ | | ||
+ | # Таблицу нужно выводить отдельно | ||
print $table->show(); | print $table->show(); | ||
+ | | ||
+ | # Сообщаем движку, что функция завершилась нормально | ||
+ | return 1; | ||
} | } | ||
</code> | </code> | ||
- | ==== Отображение списка обьектов сущностей ==== | + | |
- | Для отображения списка нужно сначала получить этот список. | + | |
==== Работа с БД ==== | ==== Работа с БД ==== | ||
- | Все классы работы с БД наследуются от ''dbcore''. В таком случае в классе становятся доступны следующие методы:\\ | + | Все классы работы с БД наследуются от ''dbcore''. \\ |
+ | В таком случае в классе становятся доступны следующие методы:\\ | ||
| query($query, $type, $attr) | выполнение запроса к БД ( В основном используется для операции ''SELECT'' )| | | query($query, $type, $attr) | выполнение запроса к БД ( В основном используется для операции ''SELECT'' )| | ||
| changes($table, $data, $attr) | обёртка над query("UPDATE ..."). Сравнивает данные в таблице и изменяет только поля с обновлёнными значениями. Может добавлять в системный лог записи об изменении| | | changes($table, $data, $attr) | обёртка над query("UPDATE ..."). Сравнивает данные в таблице и изменяет только поля с обновлёнными значениями. Может добавлять в системный лог записи об изменении| | ||
Строка 152: | Строка 174: | ||
Все эти методы должны вызываться в объекте с заданными полями ''conf'', ''db'', ''admin'' (''$self->{db}'', ''$self->{conf}'', ''$self->{admin}''). \\ | Все эти методы должны вызываться в объекте с заданными полями ''conf'', ''db'', ''admin'' (''$self->{db}'', ''$self->{conf}'', ''$self->{admin}''). \\ | ||
- | Рассмотрим работу с каждым из методов детальнее. | + | Конструктор в общем случае должен реализовать как минимум этот функционал |
+ | <code perl> | ||
+ | #********************************************************** | ||
+ | =head2 new($db, $admin, \%conf) - Constructor for Example | ||
+ | |||
+ | =cut | ||
+ | #********************************************************** | ||
+ | sub new{ | ||
+ | my ($class, $db, $admin, $CONF) = @_; | ||
+ | my $self = { | ||
+ | db => $db, | ||
+ | admin => $admin, | ||
+ | conf => $CONF | ||
+ | }; | ||
+ | |||
+ | bless($self, $class); | ||
+ | return $self; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Рассмотрим работу с каждым из унаследованных методов детальнее. | ||
<accordion><panel title="**Таблица, которая используется в запросах**"><code mysql> | <accordion><panel title="**Таблица, которая используется в запросах**"><code mysql> | ||
Строка 196: | Строка 238: | ||
Использование этого ключа связано с системой шаблонов, по утверждённому стандарту, названия столбцом таблицы указываются в __lowercase__, а переменные шаблона указываются в __UPPERCASE__. Таким образом, для передачи данных из БД в шаблон, пришлось бы вручную переназначать переменные при передаче в шаблон. Ключ ''COLS_UPPER'' дублирует ключи в хеше в в виде UPPERCASE, что позволяет передавать строки результата в шаблон без дополнительной логики. | Использование этого ключа связано с системой шаблонов, по утверждённому стандарту, названия столбцом таблицы указываются в __lowercase__, а переменные шаблона указываются в __UPPERCASE__. Таким образом, для передачи данных из БД в шаблон, пришлось бы вручную переназначать переменные при передаче в шаблон. Ключ ''COLS_UPPER'' дублирует ключи в хеше в в виде UPPERCASE, что позволяет передавать строки результата в шаблон без дополнительной логики. | ||
+ | |||
+ | ==== Создание базовой страницы ==== | ||
+ | |||
+ | Создаем базовую страницу сервиса | ||
+ | |||
+ | ''cgi-bin/hello.cgi'' | ||
+ | | ||
+ | <code> | ||
+ | #!/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; | ||
+ | </code> |