Extrafields: Champ calculé avec conditions imbriquées

Bonjour à toutes et tous!

Je me retrouve devant une petite difficulté pour un champ calculé dans un extrafield.

Je m’explique: sur mon site, j’affiche les 3 derniers produits sur la page d’accueil (je les récupère depuis Dolibarr). Pour ce faire, je prends les 3 derniers ‘rowid’… Malheureusement, pour un produit, j’ai dû le rentrer bien avant de le recevoir, et il se retrouve avec un ‘rowid’ plus petit que prévu!

J’ai donc voulu créer un extrafield où je récupère simplement le rowid avec $objectoffield→id… Jusque-là, pas de problème. Afin de modifier l’ordre des id sans toucher à leur rowid dans la base (ce qui serait dramatique, forcément!).

J’ai donc mon dernier produit qui a l’id 1765, et les deux précédents se retrouvent avec l’id 1766 et 1767… J’aimerais donc modifier ces trois id.

La formule:

$objectoffield->id == 1765 ? 1767 : $objectoffield->id

fonctionne parfaitement. Par contre, comment faire pour imbriquer les conditions?

$objectoffield->id == 1765 ? 1767 : ($objectoffield->id == 1766 ? 1765 : $objectoffield->id)

ne fonctionne pas. Je reçois cette erreur:

Bad string syntax to evaluate (mode 2, found call of a function or method without using the direct name of the function): $objectoffield->id == 1765 ? 1767 : ($objectoffield->id == 1766 ? 1765 : $objectoffield->id)

Quelqu’un saurait m’éclairer?

Merci beaucoup!

Après un peu de recherches et quelques cheveux blancs en plus, je me suis rendu compte que la façon dont je voulais procéder ne pouvait pas fonctionner!

En effet, les champs calculés ne sont pas entrés en BDD! Ils sont uniquement calculés au moment de l’affichage! Peut-être bon à préciser dans cette page? Extrafield Champ Calculé

Du coup, j’ai créé un champ integer (avec valeur par défaut à 0 et unique), puis créé un trigger qui y insère l’id du produit à la création. Ainsi, j’ai pu modifier les 3 id customisés qui m’embêtaient et tout s’affiche correctement.

Au cas où ça pourrait servir à quelqu’un, voici mon trigger:

<?php
class InterfaceNOMMODULETriggers extends DolibarrTriggers {

    public function __construct($db) {
        $this->db = $db;
        $this->name = 'NOMMODULETriggers';
        $this->family = 'other';
        $this->description = 'Automatisations custom';
        $this->version = '1.0';
        $this->picto = 'generic';
    }

    public function runTrigger($action, $object, $user, $langs, $conf) {
        dol_syslog('TRIGGER ACTION: '.$action, LOG_DEBUG);

        if ($action === 'PRODUCT_CREATE') {
            dol_syslog('TRIGGER PRODUCT_CREATE pour id: '.$object->id, LOG_DEBUG);

            $sql = "UPDATE ".MAIN_DB_PREFIX."product_extrafields"
                 . " SET id_custom = fk_object"
                 . " WHERE fk_object = ".((int)$object->id)
                 . " AND (id_custom IS NULL OR id_custom = 0)";

            $this->db->query($sql);
        }
        return 0;
    }
}

A plus pour de nouvelles aventures libres! :wink:

1 « J'aime »