Конфигурация ЛК состоит из трех файлов, расположенных в папке WEB-INF: основного файла конфигурации mybgbilling-conf.groovy, файла конфигурации меню mybgbilling-menu.groovy, файла конфигурации платежных систем mybgbilling-payment.groovy. Файлы конфигурации созданы с использованием синтаксиса Groovy.
Обновление личного кабинета
Для обновления личного кабинета запустите скрипт mybgbilling-update.sh:
/opt/wildfly/standalone/deployments/MyBGBilling.war/WEB-INF/script/update_libs.sh
При обновлении файлы, рядом с которыми есть файл с таким же именем плюс суффикс(расширение) .orig, не будут перезаписаны файлом из сборки, вместо них обновяться .orig-файлы (см. Кастомизация личного кабинета). Также при обновлении полностью удаляется и перезаписывается директория MyBGBilling.war/WEB-INF/classes/ru/bitel.
Путь к контексту ЛК
Путь к контексту личного кабинета можно изменить в файле wildfly/standalone/deployments/MyBGBilling.war/WEB-INF/jboss-web.xml:
<!-- https://provider.ru/my --> <context-root>/my</context-root>
Например, чтобы ЛК открывался от корня:
<!-- https://my.provider.ru/ --> <context-root>/</context-root>
При использовании NGINX необходимо, чтобы путь к контексту был одинаковым в NGINX и в самом ЛК.
Восстановление пароля
При нажатии кнопки восстановления пароля через email пользователю в письме приходит ссылка, которая настраивается параметром конфигурации contract.password.forgot.link. Укажите в нем правильный путь до страницы index.xhml (вместо webexecuter):
contract.password.forgot.link=http://provider.ru/my/index.xhtml?action=ChangePassword&mid=contract
Описание синтаксиса файлов конфигурации groovy
Группы параметров в конфиге разделяются не точкой, а с помощью вложенных блоков. Значение параметра должно быть правильным Groovy/Java-объектом - в простом случае строкой, заключенной в одинарные или двойные кавычки, или числом, например:
one { two { parameterA = 'value1' three { parameterA = 'value2' parameterB = 100 } } }
Т.е. параметр конфигурации - это один или несколько вложенных блоков, имя параметра и значение после знака =. Данный пример в конфигурации модулей биллинга выглядел бы так:
one.two.parameterA=value1 one.two.three.parameterA=value2 one.two.three.parameterB=100
Некоторые значения параметров должны быть списками или массивами определенных объектов. Объекты списка заключены в квадратные скобки [] и разделены между собой символом запятой. Например:
authentication { modes = [ authenticationMode { mode = 'contract' }, authenticationMode { mode = 'login' module = 'inet' moduleId = 1 } ] }
Некоторые значения параметров могут быть ассоциативными массивами (список ключ:значение, map). Связки ключ:значение заключены в квадратные скобки [] и разделены между собой символом запятой. Например:
example { map = [ key: 'value', key2: 200 ] }
Также параметры могут быть прописаны как ассоциативный массив, заключенный в круглые скобки (значение в этом случае прописывается через ':' (двеоточие), а не через символ '='):
authentication { modes = [ authenticationMode( mode: 'contract' ), authenticationMode( mode: 'login', module: 'inet', moduleId: 1 ) } ] }
Некоторые значения могут быть динамическими, если использовать замыкания (closure). Т.е., грубо говоря, значением может быть функция, которая будет возвращать нужное значение:
status { // возможность изменения статуса договора //statusChange = { contract -> return contractInGroup( contract, [1, 2, 3, 4, 20] ) && isCustomer(); } //statusChange = { contract -> contractInGroup( contract, [1, 2, 3, 4, 20] ) && isCustomer() } statusChange = { isCustomer() } }
В mybgbilling-conf.groovy и mybgbilling-menu.groovy в таких замыканиях можно использовать определенный набор методов, аргумент объект-contract, а также дополнительные аргументы, специфичные для определенного параметра конфигурации (например, параметры content.kernel.customerTitle и content.kernel.subContractGroup):
content { kernel { // название контрагента, отображаемое на странице customerTitle = { contract, contractParameterMap -> // ID параметров договоров названия физ. лиц (для customerTitle) def individualCustomerTitleParamIds = [0, 0, 0, 0, 0]; // ID параметров договоров названия юр. лиц (для customerTitle) def corporationCustomerParamIds = [0, 0, 0, 0, 0]; def paramIds = contract.personType == 1 ? corporationCustomerParamIds : individualCustomerTitleParamIds; String result = contractParameterMap.values().stream() .filter{ v -> paramIds.contains( v.entitySpecAttrId ) && notBlankString( v.toString() ) } .findFirst() .map{ v -> v.toString() } .orElse( null ); // можно отобразить и просто комментарий договора //if( result == null ) { // result = contract.comment; //} return result; } } }
В замыканиях можно использовать методы:
- isCustomer() или isUserInRole('customer') - возвращает true, если в режиме аутентификации, которым воспользовался абонент, не указан параметр role = 'unauthCustomer';
- contractInGroup( contract, groupIds ) - возвращает true, если переданный в первый аргумент объект-contract содержит в себе одну из групп, указанных списке второго аргумента, например: contractInGroup( contract, [2, 3, 8, 13] ).