Zmienne kontekstowe umożliwiają tworzenie komponentów zbudowanych w sposób funkcyjny. Twórca komponentu może zdefiniować wiele dowolnych zmiennych kontekstowych, które będą mogły być następnie wykorzystane przez użytkownika w funkcjach zdefiniowanych jako parametry tego komponentu.
Przykładem takiego komponentu może być walidator, który pozwala na walidację danych w tabelce dynamicznej. Udostępniana jest wtedy zmienna kontekstowa $currentRow
przechowująca indeks aktualnego wiersza w tabelce. Jedynym parametrem będzie funkcja, która zwróci wartość logiczną mówiącą czy dany wiersz jest poprawny czy nie.
Tak skonfigurowana akcja będzie oznaczała, że funkcja not(empty(item($currentRow, $Nazwa Dostawcy)))
zostanie wywołana dla każdego wiersza ze zmieniającym się parametrem $currentRow
:
not(empty(item(0, $Nazwa Dostawcy)))
not(empty(item(1, $Nazwa Dostawcy)))
not(empty(item(2, $Nazwa Dostawcy)))
Pozwala to na tworzenie bardziej uniwersalnych komponentów. Nie musimy też tworzyć wielu przeciążeń funkcji np. dla parametrów tablicowych - wystarczy wykorzystać komponent który umożliwi iterację po wierszach takich tablic.
Definiowanie zmiennych kontekstowych () odbywa się na etapie tworzenia definicji komponentu. Poniżej przykład dodania jednej zmiennej kontekstowej dla walidatora:
@Define public void definition( ValidatorDefinitionBuilder builder ) { builder .id( "contextVariableExample" ) .name( "Context Variable Example" ) .category( Categories.TEST ) .contextVariable() .id( "currentRow" ) .name( "currentRow" ) .description( "Current table row index" ) .type( Types.INTEGER ) .create() .parameter() .id( "fn" ) .name( "Function" ) .type( Types.FUNCTION ) .create(); } |
Zmienne kontekstowe będą dostępne z poziomu edytora procesów do wybory tylko jako parametry funkcji. Dlatego zawsze przy wykorzystaniu tej funkcjonalności należy też zdefiniować parametr typu |
Wartość zmiennych kontekstowych ustawia się przy użyciu obiektu który może być wstrzyknięty jako parametr metody komponentu. Wystarczy dodać parametr typu
do metody komponentu (np.
validate
dla walidatora) i wykorzystać metodę set(id, value)
:
public void validate( @Param FunctionCall fn, ContextVariables contextVariables, ValidationErrors errors ) { int length = ...; // liczba wierszy pobrana z innego for ( int i = 0; i < length; i++ ) { contextVariables.set( "currentRow", i ); if ( !fn.<Boolean> call() ) { errors.add( "Validation errror" ); } } } |