4.6 Les contraintes

4.6.1 Présentation

Une contrainte permet de valider la saisie de l'utilisateur avant que le document soit enregistré.

La contrainte est vérifiée au moyen :

  • soit d'une méthode publique de la classe du document contenant l'attribut,
  • soit d'une méthode statique d'une autre classe.

Son retour doit être :

  • soit une chaîne de caractères utilisée comme message d'erreur,
  • soit un tableau associatif contenant
    • un message d'erreur à l'index err
    • un tableau de suggestions à l'index sug

Les suggestions seront proposées à l'utilisateur en remplacement de la valeur refusée par la contrainte.

Les contraintes sont aussi vérifiées lors de l'appel à la méthode Doc::store(). Un paramètre optionnel à cette méthode permet de ne pas vérifier les contraintes.

4.6.2 Syntaxe

La syntaxe définissant les contraintes est la suivante :

computeMethod:callMethod:targetAttributeNamecallMethod:staticClass::methodName(methodInputs)methodInputs:methodInput,methodInputmethodInput:<spaces>sourceAttributeNamefamilyParameterNametextkeyWord<spaces>text:'<text>'[^',]+'"[^",]+"keyWord:THISK

Ce qui donne en BNF :

constraint      ::= ( staticClass |  ) '::' methodName '(' ( methodInputs |  ) ')'
 
methodInputs    ::= methodInput ( ',' methodInput )*
 
methodInput     ::= '<spaces>'* ( sourceAttributeName | familyParameterName | text | keyWord ) '<spaces>'*
 
text            ::= ( "'" '<text>' ) | ( "'" "[^',]+" "'" ) | ( '"' '[^",]+' '"' )
 
keyWord         ::= 'THIS' | 'K'

avec les éléments suivants :

sourceAttributeName

Un nom d'attribut existant dans la famille.

La méthode de la contrainte recevra la valeur de l'attribut au moment de l'appel.

Lorsque attributeName est dans un array, alors la valeur passée est :

  • la valeur sur la même ligne si l'attribut sur lequel est définie la contrainte est dans le même tableau
  • la valeur de la colonne (sous la forme d'un tableau php) si l'attribut sur lequel est définie la contrainte est en dehors du tableau
  • la valeur sur la même ligne si l'attribut est dans un autre tableau, ce qui peut conduire à des comportements surprenants.

Lorsque attributeName est un attribut structurant (e.g. array, frame, etc.), alors la valeur passée est une chaîne vide.

familyParametername

Un nom de paramètre existant dans la famille.

La contrainte recevra la valeur du paramètre au moment de l'appel.

keyWord

Un mot clé qui est remplacé par une valeur dynamique

THIS

L'objet du document en cours.

Cela est utile dans le cas d'un appel à une méthode statique.

K

L'index de la ligne en cours si l'attribut est dans un tableau.

Si l'attribut n'est pas dans un tableau, la valeur passée est -1

4.6.3 Exemples

4.6.3.1 Vérification du format d'un entier

attrid label type visibility phpfunc
article_qte Quantité int W GenericConstraints::isInt(article_qte,10,100)
<?php
 
Class GenericConstraints{
 
    public static function isInt($value, $min=0, $max=PHP_INT_MAX, $customErrorMessage=''){
        $options = array(
            'options' => array(
                'min_range' => $min,
                'max_range' => $max
            );
        );
        if(false === filter_var($value, FILTER_VALIDATE_INT, $options)){
            if('' === $customErrorMessage){
                $customErrorMessage = "GenericConstraints:%s is not an integer between %s and %s";
            }
            return sprintf(_($customErrorMessage), $value, $min, $max);
        }
        return '';
    }
}
 
?>
×