⟵ сюдатуда ⟶
  • Установка
  • Конфигурация на Ubuntu
  • Обновления
  • Бэкапы
  • Multi/no-multi
  • Консольная утилита bin/totum
  • Основы для пользователей
  • Интерфейс и компоновка
  • Таблицы и их параметры
  • Префильтр
  • Поля и их параметры
  • Синтаксис
  • Код, действия, форматирование
  • Реляционные взаимосвязи
  • Порядок расчета и единицы пересчета
  • Сравнения
  • Функции
  • Отладка
  • Автозаполнение расчетных и временных
  • Дублирование строк и циклов
  • Деревья
  • Печать и CSV
  • API
  • Роли и пользователи
  • Нотификации
  • Действия по расписанию
  • Анонимные таблицы
  • Внешние формы
  • Экспорт и импорт таблиц
  • Системные таблицы
  • Подключение функций
  • Дополнительные интерфейсы
  • Создаем новый модуль
  • Подключаем шаблон
  • Обработка авторизации
  • Получение данных таблицы
  • Обработка Дерева
  • Изменение данных
  • Изменения
  • Обработка выполнения Кнопки
  • Обработка Строки добавления
  • Обработка LinkTo
  • Обработка произвольного кода
  • Получение обновления таблицы
  • Обработка нотификаций
  • Структура файлов
  • Структура базы
  • Модуль на основе web-интерфейса Totum

    Создаем новый модуль

    Допустим Example. В папке totum/moduls/ создаем папку Example. в ней — exampleController.php.

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

    namespace totum\moduls\Example;
    use totum\moduls\Table\TableController;
    
    class ExampleController extends TableController{
    }
    

    Подключаем шаблон

    test_page_template.php из той же папки.

    class ExampleController extends TableController{
    
        public function __construct(Conf $Config, $totumPrefix = '')
        {
            parent::__construct($Config, $totumPrefix);
            static::$pageTemplate=__DIR__.'/test_page_template.php';
        }
    

    Обработка авторизации

    Подключенный WithAuthTrait дает базовые методы авторизации — проверка авторизации из сессии и подгрузка объекта User (при ее наличии).

    При необходимости реализовать авторизацию по-другому можно переопределись метод __run (пример в common/controllers/WithAuthTrait.php) и создавать объект User по своим алгоритмам.

    Для работы Тотум авторизация обязательна. Для анонимного пользователя — пользователь Anonym.

    Получение данных таблицы

    Базово у модуля Table есть три режима:

    • Main (если не передан id/name таблицы) — функция ExampleController -> actionMain.

    • Table — основное отображение таблицы ExampleController -> actionTable.

    • Actions — действия таблицы и нотификации пользователя ExampleController -> actionAction.

    Если требуется изменить это поведение — переопределить функции doIt и checkTableByUri.

    В шаблон приходят данные (их можно посмотреть все через var_dump(get_defined_vars());.

    • $UserName — пользователь.

    • $error — ошибка.

    • $treeData — дерево.

    Если таблица найдена и пользователь имеет к ней доступ, приходит переменная $tableConfig.

    • $tableConfig[‘tableRow'] — данные таблицы (по Списку таблиц).

    • $tableConfig[‘fields'] — описание полей, доступных пользователю.

    • $tableConfig[‘f'] — рассчитанное форматирование таблицы.

    • $tableConfig[‘rows'] — строки в порядке сортировки.

    Кроме значений полей и id строка содержит f — рассчитанное значение форматирования для строки.

    Поле содержит массив с данными:

    fieldname: {
        v: _            — значение поля.
        h: true         — для рассчитываемых полей при фиктированном/ручном значении.
        c: _            — рассчитанное значение поле если оно есть и не совпадает с v.
        e: ""           — текст ошибки.
        v_: [
                значение селекта/дерева,
                признак удаленного (0/1),
                значение родителя для дерева. 
                ]
        f: {}           — рассчитанное значение формата для поля.
                            }
    

    $tableConfig[‘params'] — все данные нестрочных частей.

    $tableConfig[‘filterString'] — строка фильтрации, которую нужно передавать для обработки строчной части. Если Префильтры не используются или неважны, то можно не передавать.

    Обработка Дерева

    Если для шаблона не требуется или требуется в другом виде — переопределить setTreeData.

    Изменение данных

    Глобальный подход, которым можно получить методы взаимодействия с интерфейсом модуля Table, не описанные ниже:

    1. Открываете стандартный веб-интефейс (модуль Table). Открываете панель разработки в Хром на панели Сеть/Network.
    2. Выполняете требуемое действие в интерфейсе.
    3. Смотрите какие запросы к серверу были выполнены и ищите специфический для вашего действия — смотрите его POST-параметры и ответ сервера.

    Изменения

    Для изменений данных в таблице требуется отправить POST к адресу, обрабатываемому экшеном Actions в вашем контроллере (см. п. 4). В стандартном случае он включается при передаче в POST параметра ajax: true.

    Для изменения данных в поле вне строчной части нужно отправить:

    {
    method: 'edit', 
    ajax: true, 
    ids: ‘строка json со списком id на страница', 
    tableData:{updated: <?=json_encode($tableConfig['updated'])?>}, 
    data: ‘{"params":{"fieldname": fieldvalue}}’
    }
    

    Для изменения данных поля в строчной части нужно отправить POST:

    {
    method: 'edit', 
    ajax: true, 
    ids: ‘строка json со списком id на страница', 
    tableData:{updated: <?=json_encode($tableConfig['updated'])?>}, 
    data: ‘{rowid:{"fieldname": fieldvalue}}’
    }
    

    Методы с клиента обрабатываются в объектах *Actions из этого же пространства имен. Разделение по уровню доступа идет при выборе объекла:

    Actions — методы без доступа к определенной таблице.

    ReadTableActions — методы чтения (требуют доступ к таблице на чтение и выше).

    WriteTableActions — методы изменения (требуют доступ к таблице на изменение и выше).

    AdmitTableActions — методы администрирования (требуют админский доступ).

    Обработка выполнения Кнопки

    Для выполнения Кнопки отправляется POST:

    {
    method: 'click',
    ajax: true,
    ids: '[]',
    tableData: {updated: <?=json_encode($tableConfig['updated'])?>},
    data: '{"item":'+id+',"fieldName":"button_to_cycle","checked_ids":[]}'
    }
    

    Обработка Строки добавления

    Для получения строки добавления выполняется POST c параметрами:

    data: {}
    editedFields: []
    method: checkInsertRow
    tableData[updated][dt]: 2020-10-28 11:55
    tableData[updated][code]: 167549415
    tableData[updated][user]: 1
    ajax: true
    filters: oIpOyDHca3tSQZIz3ZjYRZGqQd0yvqXYwQE/7cAonmelOSlRxLtKyK3VVjaZnb8j==
    ids: ["126","127"]
    

    Обработка LinkTo

    Иногда сервер возвращает массивы

    links — для открытия страниц, содержит список элементов вида:

    {
    elseData: {header: true, footer: true}
    postData: null
    refresh: false
    target: "self"
    title: "Заказ"
    uri: «/Table/16/31/4/32»
    }
    

    panels — для открытия панелей список объектов вида:

    {"uri":"\/Table\/16\/31\/","id":13,"field":[],"refresh":false}
    

    interfaceDatas — для открытия интерфейсных окон различного типа - список объектов вида (пример для текста):

    ["text", {title: "test", width: 600, text: "test", refresh: false, elseData: []}]
    

    Обработка произвольного кода

    Чтобы выполнить некое комплексное действие изначально не заложенное в интерфейсе Table.

    Добавить указанное действие в виде публичного метода к ReadTableActions или WriteTableActions либо создать Класс с нужным методом в своем модуле. Оно должно вызывать функцию в Totum-code с передачей ей необходимых параметров.

    В ланном примере выполняется добавление строки в текущую таблицу =: insert(table: $#ntn; field: "nazvanie" = $#korm)' с получением переменной korm:

    namespace totum\moduls\Example;
    
    use totum\common\calculates\CalculateAction;
    use totum\common\errorException;
    use totum\moduls\Table\WriteTableActions;
    
    class ExampleSpetialActions extends WriteTableActions
    {
    
        function doSomeAction()
        {
    
            $this->Table->reCalculateFilters(
                'web',
                false,
                false,
                ['params' => $this->getPermittedFilters($this->Request->getParsedBody()['filters'] ?? '')]
            );
            $CalculateCodeAction = new CalculateAction('=: insert(table: $#ntn; field: "nazvanie" = $#korm)');
            try {
                $res = $CalculateCodeAction->execAction(
                    "CODE",
                    [],
                    [],
                    $this->Table->getTbl(),
                    $this->Table->getTbl(),
                    $this->Table,
                    ["korm" => $this->Request->getParsedBody()['korm']]
                );
            } catch (errorException $e) {
                $e->addPath('Таблица [[' . $this->Table->getTableRow()['name'] . ']];');
                throw $e;
            }
    
            return $this->getTableClientChangedData([]);
        }
    
    }
    

    И проверять доступы самостоятельно, переопределив функцию ExampleController->getTableActions, например так:

    protected function getTableActions(ServerRequestInterface $request, string $method)
    {
        if($method==='doSomeAction'){
            return new ExampleSpetialActions($request, $this->Table, null);
        }else   return parent::getTableActions($request, $method);
    }
    

    Получение обновления таблицы

    В случае успеха таблица будет пересчитана с полученными данными и вернет json вида:

    "updated": "{"dt":"2020-11-05 17:02»,"code":978880490,"user":5}"
    "chdata": {
    "f": {}                 — рассчитанное форматирование таблицы.
    "params": {}        — значения и форматирования полей вне строчной части.
    "rows": {}          — значения и форматирования строк и полей в строках.
                        }
    

    Обработка нотификаций

    Для получения нотификаций отправить POST:

    method: checkForNotifications
    periodicity: 2
    ajax: true
    

    Где periodicity — частота проверки на сервере в сек. Запрос «подвисает» на минуту или до момента нахождения нотификации для пользователя. Возвращает объект активной нотификации:

    {"notification_id":141,"notifications":[["notification",{"title":"заголовок нотификации","width":600,"text":"Текст нотификации","refresh":false,"elseData":[]}]]}
    

    Внимание: нотификация может вызывать несколько активных окон разного типа.