4.5 Les attributs calculés
4.5.1 Présentation
Un attribut calculé est un attribut dont la valeur est calculée par Dynacase.
Ce calcul est effectué à chaque appel de la méthode Doc::refresh()
, qui est
appelée très fréquemment sur les documents. Dans de nombreux cas, il sera
préférable d'utiliser les hooks du document (en particulier
Doc::postStore
).
Le calcul de l'attribut peut être
-
local
Par exemple : attr_c = attr_a * attr_b
-
global
Par exemple : attr_d = nombre de documents du même auteur
-
externe
Par exemple : attr_e = quantité en stock dans l'ERP
Ce calcul peut être effectué au moyen :
- d'une méthode publique de la classe du document contenant l'attribut,
- d'une méthode statique d'une autre classe.
Elle doit retourner un résultat sous forme d'une chaîne de caractères. Le résultat est mis dans l'attribut sur lequel s'applique le calcul (sauf redirection explicite faite lors de la déclaration de l'attribut).
Le calcul est effectué lors du rafraîchissement des documents (voir la méthode
Doc::refresh()
).
Les attributs en visibilité I
ne sont pas modifiés lors de l'actualisation.
Pour que ces attributs soit modifiés, il est nécessaire qu'un contrôle de vue
modifie cette visibilité pour l'utilisateur courant. Si l'attribut est en
visibilité I
au moment du calcul, un message d'avertissement sera écrit dans
les logs système.
D'un point de vue utilisateur, un attribut calculé est rafraîchi avant chaque consultation de document.
4.5.2 Syntaxe
La syntaxe définissant les attributs calculés est la suivante :
Ce qui donne en BNF :
computeMethod ::= callMethod ( ( ':' targetAttributeName ) | ) callMethod ::= ( staticClass | ) '::' methodName '(' ( methodInputs | ) ')' methodInputs ::= methodInput ( ',' methodInput )* methodInput ::= '<spaces>'* ( sourceAttributeName | familyParameterName | text | keyWord ) '<spaces>'* text ::= ( "'" '<text>' ) | ( "'" "[^',]+" "'" ) | ( '"' '[^",]+' '"' ) keyWord ::= 'THIS' | 'K'
avec les éléments suivants :
- targetAttributeName
-
Un nom d'attribut existant dans la famille.
Le résultat de la méthode sera affecté à cet attribut.
Si targetAttributeName n'est pas renseigné, alors c'est l'attribut sur lequel est définie la méthode de calcul qui reçoit la valeur.
- sourceAttributeName
-
Un nom d'attribut existant dans la famille.
La méthode de calcul 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 calculé est dans le même tableau
- la valeur de la colonne (sous la forme d'un tableau php) si l'attribut calculé 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.
- familyParametername
-
Un nom de paramètre existant dans la famille.
La fonction de calcul 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.5.3 Exemples
4.5.3.1 Calcul d'un prix total
Extrait de la définition de la famille
attrid | label | type | visibility | phpfunc |
---|---|---|---|---|
article_qte | Quantité | int | W | |
article_prix_unitaire | Prix unitaire | double | W | |
article_prix_total | Prix total | R | ::computePrice(article_qte,article_prix_unitaire) |
Extrait du fichier de méthodes associé
public function computePrice($qte, $price){ return intval($qte) * floatval($price); }
Note: on pourrait aussi utiliser une méthode statique, qui aurait sûrement plus de sens ici :
attrid | label | type | visibility | phpfunc |
---|---|---|---|---|
article_qte | Quantité | int | W | |
article_prix_unitaire | Prix unitaire | double | W | |
article_prix_total | Prix total | R | MathUtils::mult(article_qte,article_prix_unitaire) |
class MathUtils { public static function mult($a, $b){ return floatval($a) * floatval($b); } }