Примеры скриптов до и после акшена
Материал из BiTel WiKi
Динамический код для события "до акшена"
Ниже приведён пример динамического кода для обработки события "до выполнения акшена". Класс пишется в динамическом коде и привязывается к событияю "до акшена". Также необходимо в конфиг сервера прописать соответствующие параметры action.event_*=before (см. в шапке комментария класса).
Приведено в качестве примера, начиная с версии 5.2 удобнее использовать возможность прямого вызова динамического кода: Примеры динамического кода акшена и веб-сервисов.
Внимание! Данное решение/метод/статья относится к версии 5.2-5.3 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.
package ***; import java.sql.Connection; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import bitel.billing.common.TimeUtils; import ru.bitel.bgbilling.kernel.event.events.ActionBeforeEvent; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.plugins.crm.common.model.RegisterTask; import ru.bitel.bgbilling.plugins.crm.server.dao.RegisterTaskManager; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.Utils; import ru.bitel.common.sql.ConnectionSet; /** * 1. Скрипт реализующий запрет изменения "срока" задачи в плагине CRM всем кроме того кто задачу создал, а так же кроме отдельно обозначенного администратора. * 2. Скрипт реализующий запрет изменения "лимита" договора в случае если поле комментарий пустое. * 3. CRM: Нужно сделать так чтобы задачу нельзя было закрыть если поле "Резолюция" пустое. * * В конфиг сервера прописки требует: * action.event_ru.bitel.bgbilling.plugins.crm_UpdateRegisterTask=before * action.event_contract_UpdateContractLimit=before * @author dimon */ public class BeforeEvent extends EventScriptBase<ActionBeforeEvent> { /** ид отдельно обозначенного администратора */ private final int ADMIN_USER = 1; public void onEvent( ActionBeforeEvent event1, Setup setup2, ConnectionSet connectionSet3 ) throws Exception { HttpServletRequest request = event1.getRequest(); Connection con = connectionSet3.getConnection(); int userId = event1.getUserId(); // [1] // module=ru.bitel.bgbilling.plugins.crm // action=UpdateRegisterTask // id=32 // target_date_and_time=21.04.2010+00%3A00 if( "ru.bitel.bgbilling.plugins.crm".equals( event1.getModule() ) && "UpdateRegisterTask".equals( event1.getAction() ) ) { // получаем параметры как в экшене int id = getIntParameter( request, "id", -1 ); Date targetDate = getDateParameter( request, "target_date_and_time", "dd.MM.yyyy HH:mm", null ); if( targetDate == null ) { targetDate = getDateParameter( request, "target_date", "dd.MM.yyyy", null ); } // получаем таск RegisterTaskManager manager = new RegisterTaskManager( con ); RegisterTask task = manager.getTaskById( id ); // если 1) юзер не админ, и 2) юзер не тот кто создал задачу, то 3) проверяем время и если оно не такое => ругаемся if( userId != ADMIN_USER && userId != task.getCreateUserId() && !TimeUtils.dateEqual( targetDate, task.getTargetDate() ) ) { event1.setError( "Вам нельзя менять срок задачи", false ); } } // [2] // module=contract // action=UpdateContractLimit // comment=%ED%E5%E3%E5%ED if( "contract".equals( event1.getModule() ) && "UpdateContractLimit".equals( event1.getAction() ) ) { // получаем параметры как в экшене String comment = getParameter( request, "comment", "" ); // если 1) комментарий пустой => ругаемся if( Utils.isBlankString( comment ) ) { event1.setError( "Введите комментарий", false ); } } // [3] // module=ru.bitel.bgbilling.plugins.crm // action=UpdateRegisterTask // status=2 // resolution=%F0%E5%E7%EE%EB%FE%F6%E8%FF if( "ru.bitel.bgbilling.plugins.crm".equals( event1.getModule() ) && "UpdateRegisterTask".equals( event1.getAction() ) ) { // получаем параметры как в экшене int status = getIntParameter( request, "status", 0 ); String resolution = getParameter( request, "resolution", "" ); System.out.println("status="+status); System.out.println("resolution="+resolution); // если 1) статус "закрыто" и 2) резолюция пустая => ругаемся if( status == 2 && Utils.isBlankString( resolution ) ) { event1.setError( "Для закрытия заполните резолюцию", false ); } } } // фейковый метод protected String getParameter( HttpServletRequest request, String name, String defaultValue ) { String value = request.getParameter( name ); if ( value == null ) { value = defaultValue; } return value; } // фейковый метод protected int getIntParameter( HttpServletRequest request, String name, int defaultValue ) { int value = defaultValue; try { value = Integer.parseInt( request.getParameter( name ) ); } catch( Exception e ) {} return value; } // фейковый метод protected final java.util.Date getDateParameter( HttpServletRequest request, String name, String pattern, java.util.Date defaultValue ) { java.util.Date outDate = defaultValue; String inDate = request.getParameter( name ); if( inDate != null && !"".equals( inDate ) && !"00.00.0000".equals( inDate ) ) { try { SimpleDateFormat format = new SimpleDateFormat( pattern ); outDate = new java.util.Date( format.parse( inDate ).getTime() ); } catch( Exception e ) {} } return outDate; } }