Это старая версия документа.


Пошаговое осваивание фреймворка ABillS

Писалось для версии 0.77.14

В данном руководстве, Вы пошагово ознакомитесь с основными частями системы.
Фреймворк состоит из нескольких частей:

  • Ядро вебинтерфейса (движок) (index.cgi)
  • Работа с БД (dbcore.pm)
  • Работа с визуализацией
  • Файл конфигурации

Сначала рассмотрим составные части модуля, чтобы понимать, что нужно для написания логически интегрированного функционала.
В ABillS основная часть кода написана в функциональном или процедурном стиле, что влияет на работу с системой. Кроме того, поскольку ООП не используется для полиморфизма или расширения функционала классов через наследование, многие функции принимают аргумент $attr, в котором записаны дополнительные условия выполнения (которые могут кардинально изменять как результат так и логику выполнения), поэтому нужно всегда учитывать полную сигнатуру вызова при чтении кода.

Структура модуля ABillS

Модуль ABillS (для примера Example) состоит из:

  • Класса менеджера сущностей в БД. (Abills/mysql/Example.pm)
  • Файл с логикой (функциями) Abills/modules/Example/webinterface
  • Описания меню Abills/modules/Example/config
  • Дополнительные файлы словарных переменных (необязательно) (Abills/modules/lng_english.pl)
  • Файла описания схемы БД (db/Example.sql)

Теперь, когда мы рассмотрели какие части должны быть в самом модуле, детально рассмотрим взаимодействие модуля с частями фреймворка.

Работа с БД

Все классы работы с БД наследуются от 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}).

Рассмотрим работу с каждым из методов детальнее.

**Таблица, которая используется в запросах**

CREATE TABLE `example` (
  `id` INT UNSIGNED PRIMARY AUTO_INCREMENT,
  `name` VARCHAR(40) NOT NULL,
  `value` SMALLINT(6) NOT NULL DEFAULT
);
id name value
1 name1 101
2 name2 102

query($query, $type, $attr)

Метод query() выполняет запрос к базе и в зависимости от аргумента $type получает результат и в зависимости от значений в $attr применяет к нему некоторые преобразования.

Рассмотрим примеры запросов и результат выполнения.

  $self->query("SELECT * FROM example");

Результатом выполнения будет запись в $self→{list} двумерного масива содержимого таблицы example.

  $self->query("SELECT * FROM example", undef, { COLS_NAME => 1 })

Здесь в качестве $type мы указываем undef для получения данных из базы. $attr→{COLS_NAME} ⇒ 1 говорит, что мы хотим получить результаты в виде масива хешей. Результатом выполнения будет запись в $self→{list} масива хешей, где ключами хеша будут названия столбцов таблицы, а значениями - соответственно значения.
Поскольку структура таблицы (порядок столбцов в таблице) может меняться, использование COLS_NAME предпочтительнее (Читать как: Использовать всегда и везде)

Следующий пример удобен, когда в коде нам нужно будет сформировать простой список выбора или поисковую таблицу ключ - значение. (Например, по id строки)

  $self->query("SELECT id,name FROM example", undef, { LIST2HASH => 'id,name' });

Результатом выполнения запроса будет запись в $self→{list_hash} хеша, где ключ id строки, а значение name.

Теперь рассмотрим ключ COLS_UPPER.

  $self->query("SELECT * FROM example", undef, { COLS_NAME => 1, COLS_UPPER => 1 })

Использование этого ключа связано с системой шаблонов, по утверждённому стандарту, названия столбцом таблицы указываются в lowercase, а переменные шаблона указываются в UPPERCASE. Таким образом, для передачи данных из БД в шаблон, пришлось бы вручную переназначать переменные при передаче в шаблон. Ключ COLS_UPPER дублирует ключи в хеше в в виде UPPERCASE, что позволяет передавать строки результата в шаблон без дополнительной логики.