Изменение параметров договора из личного кабинета
Материал из BiTel WiKi
DDPaul (Обсуждение | вклад) (Новая страница: «<b>Определение нужных параметров.</b> Создать нужные параметры -- в справочнике «Параметры д…») |
DDPaul (Обсуждение | вклад) |
||
Строка 30: | Строка 30: | ||
# Создать новый скрипт поведения "Параметры". | # Создать новый скрипт поведения "Параметры". | ||
- | # Создать обработчик для события "Перед изменением параметра договора" | + | # Создать обработчик для события "Перед изменением параметра договора" (как в [[Валидация текстового параметра]]) |
- | # Создать обработчик для события "Измененен параметр договора" | + | |
+ | <source lang="java"> | ||
+ | import ru.bitel.bgbilling.server.util.Setup; | ||
+ | import bitel.billing.server.contract.bean.*; | ||
+ | import java.util.*; | ||
+ | |||
+ | // Соответствие ID параметра договора и ключевого слова, обозначающего этот параметр | ||
+ | paramNames = Setup.getSetup().getHashValuesWithPrefix( "my.name." ); | ||
+ | |||
+ | cid = event.getContractID(); | ||
+ | pid = event.getParamId(); | ||
+ | paramValue = event.getValue(); | ||
+ | paramName = paramNames.get( String.valueOf( pid )); | ||
+ | //print( "cid: " + cid + ", pid: " + pid + ", paramValue: " + paramValue + ", paramName: " + paramName ); | ||
+ | |||
+ | if( paramName != null ) | ||
+ | { | ||
+ | // Проверка значения параметра типа Email | ||
+ | if( paramName.equals( "email" )) | ||
+ | { | ||
+ | // Email - http://regexlib.com/REDetails.aspx?regexp_id=21 | ||
+ | // Выражение расширено для проверки списка адресов, разделенных ";" и опциональными пробелами | ||
+ | REGEX = "^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}(\\n|;\\s*|))+$"; | ||
+ | |||
+ | paramValue = paramValue.getEmail(); | ||
+ | |||
+ | if( !paramValue.matches( REGEX )) { | ||
+ | event.setError( "Неверный формат Email" ); | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Проверка значения для телефонного номера | ||
+ | if( paramName.equals( "vfaxnumber" )) | ||
+ | { | ||
+ | // Телефонный номер - (495) 44-2221-1 | ||
+ | REGEX1 = "^\\(\\d+\\)\\s*[\\d\\-]+$"; | ||
+ | // Телефонный номер - 8-903-44-2221-1 или 890311 | ||
+ | REGEX2 = "^\\d[\\d\\-]+$"; | ||
+ | // Телефонный номер - +79034422211 | ||
+ | REGEX3 = "^\\+\\d+$"; | ||
+ | |||
+ | if( !paramValue.matches(REGEX1) && !paramValue.matches(REGEX2) && !paramValue.matches(REGEX3) ) { | ||
+ | event.setError( "Неверный формат телефонного номера" ); | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | # Создать обработчик для события "Измененен параметр договора". | ||
+ | <source lang="java"> | ||
+ | import ru.bitel.bgbilling.server.util.Setup; | ||
+ | import bitel.billing.server.contract.bean.*; | ||
+ | import bitel.billing.server.util.MailMsg; | ||
+ | |||
+ | // Имя получателя email'а | ||
+ | emailAddr = "my@email.com"; | ||
+ | |||
+ | // Соответствие ID параметра договора и ключевого слова, обозначающего этот параметр | ||
+ | paramNames = Setup.getSetup().getHashValuesWithPrefix( "my.name." ); | ||
+ | |||
+ | cid = event.getContractID(); | ||
+ | pid = event.getParamId(); | ||
+ | paramValue = event.getValue(); | ||
+ | paramName = paramNames.get( String.valueOf( pid )); | ||
+ | //print( "cid: " + cid + ", pid: " + pid + ", paramValue: " + paramValue + ", paramName: " + paramName ); | ||
+ | |||
+ | // Если измененный параметр есть в массиве paramNames, то провести процедуру коррекции | ||
+ | // и отправить в теле письма на application server | ||
+ | if( paramName != null ) | ||
+ | { | ||
+ | // Обработка значение параметра типа Email | ||
+ | // При изменении через клиент BGBilling'а адреса разделяются "\n" | ||
+ | if( paramName.equals( "email" )) { | ||
+ | paramValue = paramValue.getEmail(); | ||
+ | paramValue = paramValue.replaceAll( "\n", "; "); | ||
+ | } | ||
+ | |||
+ | // Отправка письма, текст сообщения - "параметр:значение" | ||
+ | if( paramValue != null ) { | ||
+ | txt = paramName + ":" + paramValue + "\n"; | ||
+ | cpm = new ContractParameterManager( con ); | ||
+ | recp = emailAddr; | ||
+ | new MailMsg( setup ).sendMessage( recp, "Parameters changed", txt ); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
Строка 39: | Строка 126: | ||
# Определить ID клиента (см. [[Получение текущего пользователя биллинга]]). | # Определить ID клиента (см. [[Получение текущего пользователя биллинга]]). | ||
# Просканировать список всех параметров, и, если, было задано новое значение (через POST-запрос), то: | # Просканировать список всех параметров, и, если, было задано новое значение (через POST-запрос), то: | ||
- | # Сгенерировать событие ContractParamBeforeChangeEvent - для валидации параметра | + | # Сгенерировать событие ContractParamBeforeChangeEvent - для валидации параметра. |
# Если параметр прошел валидацию, то установить новое значение и сгенеририровать событие ContractParamChangedEvent (для выполнения нужных действий с новым значением параметра) | # Если параметр прошел валидацию, то установить новое значение и сгенеририровать событие ContractParamChangedEvent (для выполнения нужных действий с новым значением параметра) | ||
# По результатам выполнения заполнить XML-отчет, который пригодится для отображения результатов в ЛК. | # По результатам выполнения заполнить XML-отчет, который пригодится для отображения результатов в ЛК. |
Версия 10:43, 16 февраля 2010
Определение нужных параметров.
Создать нужные параметры -- в справочнике «Параметры договоров». Для обращения к ним из скриптов и action'а достаточно знать код параметра (pid). Однако, для удобства, решено было использовать мнемонические обозначения параметров, попросту говоря, имена.
Связь (map) между кодом параметра и именем задается в конфигурации биллинга. Нам будут нужны следующие map'ы (в скобках - префикс):
- по имени параметра, полученного из объекта request (т.е. из POST-запроса) определить его код (pid);
- по имени параметра определить его описание, которое будет отображаться в личном кабинете (desc);
- по коду параметра определить его имя - для обработки событий и отсылки сообщения (name).
Для того, чтобы имена наших переменных не пересекались с другими (стандартными) параметрами конфигурации BGBilling, разумно использовать префикс, например, название компании.
# Имя параметра -> ID параметра my.pid.email=19 my.pid.login=33 # # Имя параметра -> Описание параметра my.desc.email=Email my.desc.login=Логин # # ID параметра -> Имя параметра my.name.19=email my.name.33=login
Обработка событий в BGBilling.
Введенные пользователем данные необходимо проверить - провести валидацию. В моем случае - еще и отослать email с уведомлением об изменении. В принципе, эти действия можно выполнить в теле action'а, но грамотнее будет воспользоваться механизмом обработки событий BGBilling'а. В этом случае значения параметров будут проверяться и обрабатываться как при изменении пользователем через личный кабинет, так и администратором/оператором через клиент BGBilling.
- Создать новый скрипт поведения "Параметры".
- Создать обработчик для события "Перед изменением параметра договора" (как в Валидация текстового параметра)
import ru.bitel.bgbilling.server.util.Setup; import bitel.billing.server.contract.bean.*; import java.util.*; // Соответствие ID параметра договора и ключевого слова, обозначающего этот параметр paramNames = Setup.getSetup().getHashValuesWithPrefix( "my.name." ); cid = event.getContractID(); pid = event.getParamId(); paramValue = event.getValue(); paramName = paramNames.get( String.valueOf( pid )); //print( "cid: " + cid + ", pid: " + pid + ", paramValue: " + paramValue + ", paramName: " + paramName ); if( paramName != null ) { // Проверка значения параметра типа Email if( paramName.equals( "email" )) { // Email - http://regexlib.com/REDetails.aspx?regexp_id=21 // Выражение расширено для проверки списка адресов, разделенных ";" и опциональными пробелами REGEX = "^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}(\\n|;\\s*|))+$"; paramValue = paramValue.getEmail(); if( !paramValue.matches( REGEX )) { event.setError( "Неверный формат Email" ); return; } } // Проверка значения для телефонного номера if( paramName.equals( "vfaxnumber" )) { // Телефонный номер - (495) 44-2221-1 REGEX1 = "^\\(\\d+\\)\\s*[\\d\\-]+$"; // Телефонный номер - 8-903-44-2221-1 или 890311 REGEX2 = "^\\d[\\d\\-]+$"; // Телефонный номер - +79034422211 REGEX3 = "^\\+\\d+$"; if( !paramValue.matches(REGEX1) && !paramValue.matches(REGEX2) && !paramValue.matches(REGEX3) ) { event.setError( "Неверный формат телефонного номера" ); return; } } }
- Создать обработчик для события "Измененен параметр договора".
import ru.bitel.bgbilling.server.util.Setup; import bitel.billing.server.contract.bean.*; import bitel.billing.server.util.MailMsg; // Имя получателя email'а emailAddr = "my@email.com"; // Соответствие ID параметра договора и ключевого слова, обозначающего этот параметр paramNames = Setup.getSetup().getHashValuesWithPrefix( "my.name." ); cid = event.getContractID(); pid = event.getParamId(); paramValue = event.getValue(); paramName = paramNames.get( String.valueOf( pid )); //print( "cid: " + cid + ", pid: " + pid + ", paramValue: " + paramValue + ", paramName: " + paramName ); // Если измененный параметр есть в массиве paramNames, то провести процедуру коррекции // и отправить в теле письма на application server if( paramName != null ) { // Обработка значение параметра типа Email // При изменении через клиент BGBilling'а адреса разделяются "\n" if( paramName.equals( "email" )) { paramValue = paramValue.getEmail(); paramValue = paramValue.replaceAll( "\n", "; "); } // Отправка письма, текст сообщения - "параметр:значение" if( paramValue != null ) { txt = paramName + ":" + paramValue + "\n"; cpm = new ContractParameterManager( con ); recp = emailAddr; new MailMsg( setup ).sendMessage( recp, "Parameters changed", txt ); } }
Action.
Алгоритм работы action'а:
- Определить ID клиента (см. Получение текущего пользователя биллинга).
- Просканировать список всех параметров, и, если, было задано новое значение (через POST-запрос), то:
- Сгенерировать событие ContractParamBeforeChangeEvent - для валидации параметра.
- Если параметр прошел валидацию, то установить новое значение и сгенеририровать событие ContractParamChangedEvent (для выполнения нужных действий с новым значением параметра)
- По результатам выполнения заполнить XML-отчет, который пригодится для отображения результатов в ЛК.
[Код action'а|Action для дополнительных параметров].
Шаблон личного кабинета.
Внести необходимые изменения в шаблон ЛК, а именно, [common.xsl] и [main.xsl].