Walidatory to komponenty użytkownika, umożliwiające sprawdzenie formularza podczas akceptacji zadania oraz zablokowanie akceptacji, gdy jakieś dane nie są prawidłowe. Przykładowe walidatory mogą np.
Stworzone walidatory dostępne są w edytorze procesów i mogą być łatwo wykorzystane w procesie biznesowym umożliwiając tym samym realizacje logiki biznesowej. Ich zachowanie może być dodatkowo konfigurowane za pomocą parametrów.
Walidatory tworzone są w oparciu o ich definicję stworzoną przez użytkownika. Definicja taka musi zawierać następujące elementy:
com.suncode
)Walidator może również dostarczać skrypt, który buduje wygląd parametrów podczas jego definiowania w PWE. W tym celu należy dodać kolejną adnotację dla klasy z przekazaną ścieżką do skryptu (z classpath).
Przykładowa definicja przedstawiona jest poniżej:
@Validator @ComponentsFormScript( "path/example-form.js" ) public class PeselValidator { private final String PESEL_REGEX = "^\\d{11}$"; @Define public void definition( ValidatorDefinitionBuilder builder ) { builder .id( "pesel-validator" ) .name( "validator.pesel" ) .description( "validator.pesel.desc" ) .category( Categories.TEST ) .parameter() .id( "pesel_param" ) .name( "validator.pesel.parameter.name" ) .description( "validator.pesel.parameter.desc" ) .type( Types.VARIABLE) .create(); } //Metoda walidująca public void validate( @Param( value = "pesel_param" ) Variable pesel, ValidationErrors errors, Translator translator ) { boolean isPesel = Pattern.matches( PESEL_REGEX, (String) pesel.getValue() ); if ( isPesel == false ) { errors.add( translator.getMessage( "validator.pesel.invalid" ), pesel.getId() ); } } } |
Walidator musi posiadać metodę walidującą o nazwie validate. Metoda może posiadać następujące typy parametrów:
W celu przerwania akceptacji zadania i wyświetlenia stosownego komunikatu należy dodać wiadomość do obiektu . Jeżeli żadna wiadomośc nie zostanie dodana, to akceptacja zadania przejdzie do kolejnego etapu.
Jeżeli walidator jest definiowany we wtyczce to należy dodatkowo zaznaczyć, że wtyczka ta udostępnia komponenty. W tym celu należy w pliku suncode-plugin.xml dodać wpis:
<!-- Udostępnianie walidatorów --> <workflow-components key="components" /> |
Możliwe jest dodanie JavaScriptowej funkcji, która zostanie wywołana zamiast wyświetlenia okienka systemowego po zgłoszeniu błędu przez walidator.
Jeżeli przycisk posiada wiele walidatorów, na pierwszym miejscu zostają wyświetlone błędy (okienka z błędami, podkreślanie zmiennych itp.) pochodzące ze zwykłych błędów walidatorów, a w tym czasie walidatory, który zgłosiły wywołanie callbacka zostaną zignorowane. Jeżeli użytkownik pozbył się wszystkich standardowych błędów, każda kolejna akceptacja zadania wywoła tylko i wyłącznie jeden pojedynczy callback.
Aby dodać callback do komponentu, obok adnotacji należy dodać adnotację
określającą ścieżkę do skryptu (znajdującego się w resources).
@Validator @ValidatorsScript( value = "scripts/peselValidatorCallback.js" ) public class PeselValidator |
Aby zgłosić callback na formularzu, należy wywołać invokeCallback z .
public void validate( @Param( value = "param" ) Variable param, ValidationErrors errors ) { //... if ( validatorFailed ) { errors.invokeCallback(); } } |
Jeżeli walidator jednocześnie doda błędy oraz zgłosi wywołanie callbacka, błędy zostaną zignorowane przez serwer (zostanie wywołany JavaScriptowy callback). Jeżeli walidator nie posiada adnotacji , przy wywołaniu invokeCallback zostanie rzucony wyjątek.
Implementacja callbacka w JavaScripcie jest analogiczna do tworzenia skryptów Akcji.
PW.FormValidators.create('pesel-validator', { callback : function() { console.log('Pesel validator callback'); if(ignorePesel) { this.confirm(); } } }); |
Pierwszy argument funkcji create musi być taki sam, jak id walidatora. Drugim argumentem jest obiekt implementujący metodę callback, która jest wywoływana przy dodaniu błędu w walidatorze.
Jeżeli chcemy zatwierdzić nasz walidator, żeby przepuścić akceptację dalej, musimy wywołać metodę walidatora this.confirm(). Jeżeli zostanie wywołane zatwierdzenie, to automatycznie zostanie wywołany callback kolejnego walidatoro (jeżeli taki będzie). W momencie, gdy wszystkie callbacki zostaną zatweirdzone, to nastąpi akceptacji z pominięciem tych walidatorów.
Funkcjonalność nie jest jeszcze dostępna. |
Metoda invokeCallback pozwala przekazać dowolny obiekt, który następnie może być użyty przez skrypt po stronie przeglądarki. Obiekt ten zostanie skonwertowany do JSONa przez bibliotekę Jackson.
Przykładowe użycie:
Map<String, Object> exampleObject = new HashMap<String, Object>(); exampleObject.put( "prop1", "some text" ); exampleObject.put( "prop2", true ); exampleObject.put( "prop3", 23423 ); errors.invokeCallback( exampleObject ); |
Po stronie JavaScriptu:
callback : function(exampleObject) { console.log(exampleObject.prop1); console.log(exampleObject.prop2); console.log(exampleObject.prop3); } |
Możliwe jest określenie w PWE komunikatu błędu walidacji oraz komunikatu potwierdzenia akceptacji formularza pomimo błędu walidacji. Aby w PWE wyświetlone zostały te pola należy w builderze walidatora określić, jakie typy komunikatów mogą zostać skonfigurowane.
@Validator public class PeselValidator { private final String PESEL_REGEX = "^\\d{11}$"; @Define public void definition( ValidatorDefinitionBuilder builder ) { builder .id( "pesel-validator" ) .name( "validator.pesel" ) .description( "validator.pesel.desc" ) .category( Categories.TEST ) .messageTypes( ValidatorMessage.CONFIRMATION, ValidatorMessage.ERROR ) // możliwe będzie skonfigurowanie komunikatu potwierdzenia oraz błędu walidacji .parameter() .id( "pesel_param" ) .name( "validator.pesel.parameter.name" ) .description( "validator.pesel.parameter.desc" ) .type( Types.VARIABLE) .create(); } //Metoda walidująca public void validate( @Param( value = "pesel_param" ) Variable pesel, ValidationErrors errors, Translator translator ) { boolean isPesel = Pattern.matches( PESEL_REGEX, (String) pesel.getValue() ); if ( isPesel == false ) { errors.add( translator.getMessage( "validator.pesel.invalid" ), pesel.getId() ); } } } |
Enum określa, które z komunikatów mogą zostać skonfigurowane w PWE. Komunikaty te działają jak parametry typu String, a więc możliwe jest używanie w nich wartości zmiennych, funkcji itd.
W metodzie execute walidatora możliwe jest pobranie dwóch nowych obiektów:
Obiekty te należy samemu dodać do błędów oraz potwierdzeń walidacji. Przykładowe użycie:
public void validate( @Param( value = "param" ) Variable param, ValidationErrors errors, Translator translator, DefinedError error, DefinedConfirmation confirmation ) { String value = param.getValue().toString(); if ( /* warunek - błąd walidacji */ ) { errors.add( error ); } else if ( /* warunek - mimo błędu zapytanie o potwierdzenie akceptacji zadania */ ) { errors.addConfirmation( confirmation ); } } |