Tutoriel d'utilisation du champs calculé

Salut à tous, j’ai pas mal fouillé le forum et lu tous les sujets sur lesquels je tombais et me reste une question : existe t-il quelque part une documentation (claire et compréhensible pour un noob et ne nécessitant pas un bac+8 en php) pour l’utilisation des champs calculés des attributs personnalisés ?

J’ai une besoin relativement simple que je peux détailler au besoin, selon la réponse à la première question. Mais plutôt que de demander une solution directement je préfèrerais me former et comprendre ce que je fais. Ou au moins parvenir à comprendre la documentation diffuse et imbitable actuelle…

Merci !

1 « J'aime »

Ma première question sur la documentation tient toujours, mais je vais préciser mon besoin des fois que ça suscite une discussion…

Je fabrique de la bière en fût, ça nécessite une déclaration de DRM à la douane. Le calcul du montant dû est assez simple : nombre de litre produit * taux d’alcool * une constante.

Mon but est de nous prémacher les déclarations en créant un champ taux d’alcool à remplir lors de la fabrication, puis un autre champs calculé qui va chercher la quantité fabriquée, le volume du produit fabriqué, le champs taux d’alcool et avec tout ça effectue la multiplication idoine.

En guise de test j’ai essayé de débuter simplement en calculant la valeur du champs taux d'alcool + 10 en paramétrant un deuxième attribut comme ça :

J’ai essayé 1000 autres syntaxes et je ne suis jamais parvenu à appeler la valeur d’un autre attribut dans mon champs calculé. D’où ma question sur la documentation de cette fonction.


Comme décrit en préambule, j’aurai besoin dans un second temps d’appeler le volume du produit fabriqué (paramétré dans chaque produit) et la quantité fabriquée, mais ça sera dans un second temps, j’aimerais déjà arriver à comprendre le début !

Bonjour,

La varialbe $object n’est pas disponible dans un champ calculé, il faut utiliser $objectoffield comme indiqué dans l’infobulle que vous pouvez afficher en cliquant sur le petit pictogramme « i » à côté du texte champ calculé.

Cette formule devrait fonctionner

$objectoffield->array_options['options_tauxdalcool']+10;

Vous pouvez également utiliser la fonction php var_dump() dans un champ calculé pour vous aider à mettre au point ou à débuguer un champ calculé.

En effet, merci ! Ça ne devait être qu’un bête problème de ; mais les formules exemple n’ont comportent pas. Ça paraît logique après coup.


Maintenant pour la suite des festivités je cherche à appeler le champs « quantité à produire » dans la fiche de GPAO (j’ai essayé via $object->Qty sans succès) et le champs « volume » dans la fiche du produit correspondant… Une idée de comment faire ?

De manière générale, y a t-il un moyen de connaître le nom ou l’identifiant à utiliser pour appeler tel ou tel champs ? J’ai essayé d’inspecter le code de plusieurs pages à la recherche d’indice mais j’ai l’impression que la réponse est cachée plus en profondeur…

Bonjour,

La réponse a été donnée plus haut :


Autrement dit : qu’est ce que ça signifie, comment ça s’utilise, où est ce qu’on met quoi, où est la documentation, des exemples commentés…

Bonjour,

Je rappel que les personnes présentes sur ce forum et ceux faisant la documentation sont des bénévoles, donc on fait ce que l’on peut, mais on ne pourra jamais faire une formation PHP, qui est un pré-requis à Dolibarr.

Il suffit de mettre var_dump($object)dans un champ calculé pour que tout le contenu de l’obeject s’affiche.

2 « J'aime »

Je comprends bien, je fréquente d’autres forums avec d’autres bénévoles pour d’autres logiciels opensource. Je suis donc familier avec tout ça. Mais plutôt qu’une formation en php, un développement personnalisé gratuit ou un bout de fonction incomplète sans aucune explication, je demande simplement des réponses claires et des pistes pertinentes pour pouvoir me former au fil de l’eau.

Ça c’est une bonne piste ! J’ai donc extrait et mis en page la liste des attributs et multiplié le taux d’alcool ($objectoffield->array_options['options_tauxdalcool']) par la quantité à produire ($object->qty). Ça c’est bon. Là où je bute maintenant c’est pour appeler un attribut qui est défini dans les produits : le volume du produit en question.

Je m’y remets demain et si je n’y arrive pas je reviendrai poser des questions pénibles :sweat:

1 « J'aime »

Ce n’est pas directement accessible, il faut faire recharger l’objet Produit, exemple:
(($reloadedobj = new Product($db)) && ($reloadedobj->fetchNoCompute($obj->id ? $obj->id : ($obj->rowid ? $obj->rowid : $object->id)) > 0)) ? var_dump($reloadedobj->array_options) : var_dump($reloadedobj->array_options)

Merci ! Je comprends l’idée mais ça n’est pas beaucoup plus clair…

Même en essayant de recouper avec d’autres sujets du forum abordant le rechargement d’autres attributs je ne parviens pas à comprendre ce que je dois faire de cette formule, ce qu’il faut remplacer dedans ou comment l’utiliser.

D’après ce que je comprends en mettant tout ça :

dans un attribut personnalisée, ça permet d’accéder aux attributs du produit concerné dans une autre page que celle du produit. On peut le vérifier en utilisant var_dump($object); dans encore un autre attribut, en effet ça charge plus de trucs. Sauf que tous les attributs chargés sont NULL


Après investigation, la formule citée ci dessus n’a en fait aucun effet. Retour à la case départ !

Attention, les noms des propriétés sont en principe toujours en minuscules. Vous avez écrit Qty au lieu de qty, d’autre part ce n’est pas $object qu’il faut utiliser dans un champ calculé mais $objectoffield

En insérant juste le bout de code ci-dessous dans un champ calculé d’un ordre de fabrication, vous aurez la quantité à produire

$objectoffield->qty

Bonjour,

Merci pour la remarque, à force de bidouille j’avais trouvé qu’il fallait mettre en minuscules.
Par contre, bizarrement $objectoffield->qty et $object->qty donnent le même résultat !


Cependant je n’arrive toujours pas à aller chercher un attribut standard (un attribut non personnalisé autrement dit) de la fiche du produit concerné…

J’ai un peu modifier, à tester :

(($reloadedobj = new Product($db)) && ($reloadedobj->fetchNoCompute($objectoffield->id ? $objectoffield->id : ($objectoffield->rowid ? $objectoffield->rowid : $object->id)) > 0)) ? var_dump($reloadedobj->array_options) : var_dump($reloadedobj->array_options);

Merci ! J’ai essayé de recharger la page de l’ordre fabrication avec cette formule commentée puis non commentée, le var_dump renvoie exactement la même chose :confused:

Bonjour,

A priori ce n’est pas possible car la ce que vous avez mis sur pastebin, c’est un var_dump($object) et non
$reloadedobj

En utilisant var_dump($reloadedobj); voici ce que j’obtiens en toute circonstance, c’est pour ça que je m’en suis tenu à var_dump($object);

Mais en effet, ça ferait sens d’appeler $reloadedobj puisque c’est dans ce dernier qu’on recharge les attributs voulus…

Quelle version de Dolibarr utilisez vous ?

Pour rappel dans le changelog de la V17 il est spécifié qu’il faut utiliser $objectoffield dans les champs calculés

1 « J'aime »

Je suis en 17.0.1. J’ai remplacé toutes les instances de $object par $objectoffield et en reprenant la première formule proposée par @ksar les attributs du produit se chargent et je trouve bien dans la liste celui qui m’intéresse : ["volume"]=> string(2) "30" ! Merci beaucoup @ksar @hop !

Léger problème d’affichage cependant : ils sont visibles en vrac dans le champs « Produit » et ce qui n’est pas très pratique mais une solution doit bien exister.


Maintenant qu’on peut accéder à ces attributs, je pensais qu’un bête $objectoffield->volume suffirait à l’appeler dans mon champs calculé mais ça ne fonctionne pas. J’ai donc essayé tout ce qui me semblait au moins un peu cohérent, sans succès (liste non exhaustive) :

$objectoffield->array_options['volume']
$objectoffield->volume
$reloadedobj->array_options['volume']
$reloadedobj->volume
$productattributes->array_options['volume'] /*productattributes étant l'attribut personnalisé qui recharge les attributs produit*/
$productattributes->volume

Bonjour,

Sans avoir la formule que vous utilisez on va pas pouvoir aller plus loin
Normalement c’est un truc du genre

$reloadedobj->array_options['volume']