Допустим 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
, не описанные ниже:
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"]
Иногда сервер возвращает массивы
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":[]}]]}
Внимание: нотификация может вызывать несколько активных окон разного типа.