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.
Zmienne kontekstowe mogą być wykorzystane tylko jako argumenty funkcji stanowiącej parametr 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" ); } } } |
Ze względu na inne środowisko uruchamiania akcji formularza, sposób ustawiania tych zmiennych jest trochę inny. Wartość kontekstowych zmiennych ustawiamy przy użyciu metody setContextVariable
klasy :
PW.FormActions.create('context-var-example', { defaultActions: { variableSet: function(vs, added, updated, removed) { this.invoke(vs); } }, invoke: function(vs) { var fn = this.get('fn'); var target = this.get('target'); PW.each(vs.getRecords(), function(record, index) { this.setContextVariable("currentRow", index); var newValue = fn.call(); target.setItemValue(newValue, index); }, this); } }); |