Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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>​