Для подключения дополнительной функции ее нужно создать в файле CalculateExtensions.php
, который находится в корне разворачиваемого ТОТУМ (в папке с Conf.php
).
Например, подключаем функцию extHello
:
Название функции обязательно! должно начинаться с
ext*
<?php
use totum\common\errorException;
$CalculateExtensions = new \stdClass();
$CalculateExtensions->jsTemplates = '[{"name":"extHello","t":"(name: \"\")","d":false,"p":["name"],"m":[],"n":["name"]}]';
$CalculateExtensions->extHello=function ($params){
$params=$this->getParamsArray($params);
return 'Привет, '.$params['name'];
};
В параметре jsTemplates
должно содержаться в формате json
описание всех дополнительных функций.
Где:
name — название функции;
t — шаблон для автоподстановки;
d — является ли функция устаревшей;
p - список допустимых параметров;
m — список множественных параметров (может присутствовать при вызове несколько раз);
n — список необходимых параметров.
При вызове функция запускается из объекта Calculate
, CalculateAction
, CalculateFormat
или CalculateSelect*
— и может пользоваться всеми их функциями. Например, getParamsArray
.
При вызове функция получает переменную $params
, содержащую строку! с параметрами внутри скобок после имени функции. Чтобы получить параметры, рассчитанные по логике ТОТУМ, необходимо вызвать функцию $this->getParamsArray($params)
. Эта функция имеет также параметры, заполненные по-умолчанию, которые можно задать как вам требуется:
function getParamsArray($paramsString, $arrayParams = [], $notExecParams = [], $threePartParams = ['where', 'filter', 'key'])
Где:
$paramsString — строка с параметрами, полученная функцией;
$arrayParams — параметры, которые могут встречаться несколько раз (множественные параметры из шаблона) - они будут возвращены в виде массива независимо от того, встретился он один или несколько раз;
$notExecParams — параметры, которые будут возвращены в виде неразобранной строки (полезно, когда код выполняется по условиям);
$threePartParams — параметры, состоящие из трех частей 'field' = "value"
— возвращается в виде ассоциированного массива/списка ассоциированных массивов {"field" :"field", "operator":"=", "value": $value}
.
Если функция должна вернуть ошибку выбрасывается исключение:
throw new errorException("Текст ошибки");
Ошибка выброшенная в коде действия прерывает цепочку пересчетов и изменения не сохраняются.
Ошибка, выброшенная при расчете значения поля, установит расчетное (и итоговое, если поле не зафиксировано) значение поля в ОШБК!
Сложный вариант:
Если текущий вариант подключения ext*
функций вам не удобен - вы можете переопределить в классе Conf.php
функции родительского ConfParent.php
, отвечающие за работу подключаемых функций:
ConfParent::getCalculateExtensionFunction
ConfParent::getExtFunctionsTemplates
ХОРОШЕЙ ПРАКТИКОЙ ЯВЛЯЕТСЯ СОХРАНЕНИЕ РАБОТОСПОСОБНОСТИ СТАНДАРТНОЙ УТИЛИТЫ ОБНОВЛЕНИЯ
bin/totum git-update
!
Для этого:
Не модифицируйте системные файлы.
CalculateExtensions.php
находится в git ignore и не будет перезаписан.
Дополнительные скрипты положите в /totum/ext/*
эта папка никогда не будет использована в master-ветке core-разработчиков.
Возможно добавление зависимостей в composer
, но в этом случае вам нужно будет сделать merge
когда в основной ветке разработки обновятся зависимости.
composer.json
и composer.lock
— добавьте их в коммит, чтобы при последующих обновлениях автоматически сработал git merge
в той части, в которой это возможно.если вы сделали отдельную ветку для разработки на локальной машине клиента:
НИ В КОЕМ СЛУЧАЕ НЕ МЕРДЖИТЕ ЕЕ В МАСТЕР!!!
ВАМ НУЖНО СКОПИРОВАТЬ ДОБАВЛЯЕМЫЕ ФАЙЛЫ РУКАМИ!!!
Поэтому наиболее рабочей нам кажется следующая схема:
Создаем папку рядом с папкой установки тотум — totum_ext
Делаем там git init
Сбрасываем туда файлы с разработкой
Из основной папки totum ставим на них в нужных местах ссылки ln -s ..
. (для CalculateExtensions.php
и папки /totum/ext/
)
Делаем git add *
в дополнительной папке разработки
git commit -m 'текст комментария'
Подключение к внешнему репозиторию по желанию
Для добавления дополнительного интерфейса нужно добавить папку в каталог totum/moduls
— можно скопировать имеющийся интерфейс анонимных таблиц (An)
или интерфейс Table
. Этот модуль станет доступен в ТОТУМ по пути /названиевашейпапки/
Если подключить js
и css
файлы ТОТУМа, то можно пользоваться встроенными интерфейсными возможностями вызова таблиц. Исходники фронтенда выкладываются в dev
ветку репозитария https://github.com/.../totum-front. Изменения происходят часто.