Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

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

Definiowanie zmiennych kontekstowych (ContextVariable ) 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 FUNCTION.

Ustalenie wartości zmiennych kontekstowych

Wartość zmiennych kontekstowych ustawia się przy użyciu obiektu ContextVariables który może być wstrzyknięty jako parametr metody komponentu. Wystarczy dodać parametr typu ContextVariables 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" );
        }
    }
}

 

Zmienne kontekstowe w akcjach formularza

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.form.action.Action:

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

 

 

  • No labels