Работа с отчетами

Отчет представляет собой особый тип «Формы», называемый «Индивидуальная форма редактирования». Это форма редактирования, привязанная к конкретному «Объекту» (id), а не «Типу объекта».
Соответственно, для создания отчета, необходимо создать запись отчета (в «References.Reports», это можно сделать в разделе «Настройки»), а затем создать для него свою «Форму».

Отчеты выводить иерархически в списке. Родительские названия произвольны.

Класс Kernel\Actions\Reports\Base

Предоставляет методы для работы с отчетами.

addFilters()
Добавляет набор фильтров в отчет.

Фильтры представляет собой объекты Http\Elements\Input и предоставляют интерфейс для работы со значениями.

sumData (array $data, Table $table, array $sumFields, array $map, [string $sumWordField], [Function $afterFunc])
Добавляет суммированные данные в таблицу отчета.

$data — Ассоциативный массив данных
$table — Ссылка на таблицу, в которую необходимо вывести данные (как правило, $this->table->reports)
$sumFields — Массив (перечисление) полей, которые необходимо просуммировать
$map — Карта вывода. Представляет ключи — название полей таблицы, в качестве значений могут использоваться анонимные функции или строки. См. метод printDataTable
$sumWordField — Поле, в которое необходимо добавить слово «Сумма»
$afterFunc — Анонимная функция постпроцессинга. Принимает на вход только что сгенерированную строку таблицы. Может использоваться для установки дополнительных параметров, изменения стилей и пр

titleGroup(array $data, Table $table, array $fieldPairs, array $sumFields, array $map, [Function $afterFunc])
Функция группирует таблицу по полю и может подсчитывать суммы по набору полей для поля.

$data — Ассоциативный массив данных
$table — Ссылка на таблицу, в которую необходимо вывести данные (как правило, $this->table->reports)
$fieldPairs — Поля группировки. В качестве ключей принимает названия полей, по которым Вам нужно провести группировку, в качестве значений — названия строк, которые нужно записать в выходной массив (они могут отличаться, если Вам это требуется, см. ниже). Здесь действует общий принцип, принятый в системе для «хешей» отображения: если ключ и значение совпадают (то есть в выводе поле должно предстать с тем же названием), указание ключа можно опустить (то есть …, «foo» => «foo», … эквивалентно …, «foo»,…)
$sumFields — Массив (перечисление) полей, которые необходимо просуммировать
$map — Карта вывода. Представляет ключи — название полей таблицы, в качестве значений могут использоваться анонимные функции или строки. См. метод printDataTable
$afterFunc — Анонимная функция постпроцессинга. Принимает на вход только что сгенерированную строку таблицы. Может использоваться для установки дополнительных параметров, изменения стилей и пр. Применяется к каждой строке в момент после создания.

Самое главное, что нужно знать про этот метод: это метод отображения данных, а не их изменения. Он ожидает отсортированных данных и не будет переупорядочивать их. Он не может изменить входные данные, но только добавлять поля в таблицу.

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

Если Вам требуется группировка по менеджерам, а затем по товарам, то порядок вызовов метода неважен, важно то, как отсортированы входные данные. Измените запрос к БД (или к ORM) для достижения целей.

Разбор отчета «Отчет по долгам»

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
namespace Applications\Reports\Debts;
// Импортируем модули
 
use Kernel\Database\Database as DB;
...
use Kernel\Framework\Format;
// Создаем класс отчета (обратите внимание на наследование)
class Edit extends \Kernel\Actions\Reports\Base {
 
// Добавление фильтров (см. выше)
    protected function addFilters() {
// Метод setDefault работает так же, как и для полей
      $this->filters->add("dateMin", "Date")->setDefault(time());
...
// Третий аргумент для поля выбора — структура значений. Четвертый — значение пустого поля 
(если не задано, выбор поля обязателен).
    $this->filters->add("manager", "Select", $this->Data->References->Employees, true);
..
    }
// Обратите внимание, названия составляющих шаблонного метода немного отличаются.
    protected function buildReport() {   
// Опережающее определение полей позволяет экспорту работать корректно.
      $this->tables->report->defineColumns("num",
..
      , "manager");
 
// Условие для поиска по БД.
      $condition = DB::_and(
...
      );
 
// С учетом фильтра
     if ($this->filters->manager->get())
...
// Строим запрос к базе
      $data = $this->DB->{"documents.orders"}->select(
        [DB::Field("name", "references.employees"), "manager"],
...
        )->
        where($condition)->
        join(
...
        )->
// Обратите внимание на передачу константы для поиска по именам структуры.
 
        execute(DATA_NAMES)->result();
...
// Для начала, наполняем таблицу
      $this->tables->report->fillFromArray($data,
...
      );
// Добавляем суммирование полей (см. выше)
      $this->sumData($data, $this->tables->report, ["sum", "dsum", "prepay"], 
...
      );
// Эта переменная означает количество полей, "без данных" (в данном случае одно, для суммы).
         $this->maxRow = 1;
    }
// Заканчиваем обычным для такого дела определением абстрактных методов базового класса.
  protected function onPlay() { }
  protected function onChange() { }
  protected function onSave() { }
}
?>

Работа с графиками в отчетах

Для работы с графиками, используется библиотека AmCharts. Документация доступна по адресу http://support.amcharts.com/.
Там же можно найти примеры для разных видов графиков.

Графики реализованы при помощи JS. Данные передаются через HTML-шаблонизацию (см. документацию выше).

Последние правки: 05.08.2016 12:19:16