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" );
}
}
} |
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);
}
}); |