Function "eqLogic->postUpdate()" pas appelée à l'activation du plugin

Hello,

Les équipements d’un plugin sont mis à jour (isEnable = x) à chaque désactivation ou activation du plugin.

Lors de la désactivation du plugin, la mise à jour des équipements provoque l’appel à la fonction postUpdate de l’équipement.

Par contre, la fonction postUpdate des équipements n’est pas appelée lors de l’activation du plugin.

Pour analyse, j’ai modifié

  • la function setIsEnable de la classe plugin :
    ...
    } else if ($alreadyActive == 0 && $_state == 1) {
        log::add("toto","info","plugin ID " . $this->getId());
        foreach (eqLogic::byType($this->getId()) as $eqLogic) {
            log::add("toto","info","plugin " . get_class($eqLogic));
            try {
                $eqLogic->setIsEnable($eqLogic->getConfiguration('previousIsEnable', 1));
                $eqLogic->setIsVisible($eqLogic->getConfiguration('previousIsVisible', 1));
                $eqLogic->save();
            } catch (Exception $e) {
            } catch (Error $e) {
            }
        }
    }
                ...
  • La fonction byType de la classe eqLogic :
public static function byType($_eqType_name, $_onlyEnable = false) {
    $values = array(
        'eqType_name' => $_eqType_name,
    );
    $sql = 'SELECT ' . DB::buildField(__CLASS__, 'el') . '
    FROM eqLogic el
    LEFT JOIN object ob ON el.object_id=ob.id
    WHERE eqType_name=:eqType_name ';
    if ($_onlyEnable) {
        $sql .= ' AND isEnable=1';
    }
    $sql .= ' ORDER BY ob.name,el.name';
    log::add("toto","info","eqLogic 1 : " . $_eqType_name);
    if (class_exists($_eqType_name)) {
        log::add("toto","info","eqLogic 2 : class exists");
        return DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, $_eqType_name);
    }
    log::add("toto","info","eqLogic 2 : class not found");
    return self::cast(DB::Prepare($sql, $values, DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, __CLASS__));
}
  • La function save de la class DB:
...
     log::add("toto","info","DB " . get_class($object));
     if (!$_direct && method_exists($object, 'postUpdate')) {
         $object->postUpdate();
     }
...

Les différents log ajoutés ont donné les infos suivantes lorsque j’ai désactivé (à 22:49:34) puis activé (à 22:56:15) mon plugin devolo_cpl:

0000|[2023-08-14 22:49:34][INFO] : eqLogic 1 : devolo_cpl
0001|[2023-08-14 22:49:34][INFO] : eqLogic 2 : class exists
0002|[2023-08-14 22:49:34][INFO] : DB devolo_cpl
0003|[2023-08-14 22:49:34][INFO] : devolo_cpl->postUpdate
0004|[2023-08-14 22:49:34][INFO] : DB devolo_cpl
0005|[2023-08-14 22:49:34][INFO] : devolo_cpl->postUpdate
0006|[2023-08-14 22:49:34][INFO] : DB devolo_cpl
0007|[2023-08-14 22:49:34][INFO] : devolo_cpl->postUpdate
0008|[2023-08-14 22:49:34][INFO] : DB devolo_cpl
0009|[2023-08-14 22:49:34][INFO] : devolo_cpl->postUpdate
0010|[2023-08-14 22:49:34][INFO] : DB devolo_cpl
0011|[2023-08-14 22:49:34][INFO] : devolo_cpl->postUpdate
0012|[2023-08-14 22:56:15][INFO] : plugin ID devolo_cpl
0013|[2023-08-14 22:56:15][INFO] : eqLogic 1 : devolo_cpl
0014|[2023-08-14 22:56:15][INFO] : eqLogic 2 : class not found
0015|[2023-08-14 22:56:15][INFO] : plugin eqLogic
0016|[2023-08-14 22:56:15][INFO] : DB eqLogic
0017|[2023-08-14 22:56:15][INFO] : plugin eqLogic
0018|[2023-08-14 22:56:15][INFO] : DB eqLogic
0019|[2023-08-14 22:56:15][INFO] : plugin eqLogic
0020|[2023-08-14 22:56:15][INFO] : DB eqLogic
0021|[2023-08-14 22:56:15][INFO] : plugin eqLogic
0022|[2023-08-14 22:56:15][INFO] : DB eqLogic
0023|[2023-08-14 22:56:15][INFO] : plugin eqLogic
0024|[2023-08-14 22:56:15][INFO] : DB eqLogic
0025|[2023-08-14 22:56:16][INFO] : eqLogic 1 : devolo_cpl
0026|[2023-08-14 22:56:16][INFO] : eqLogic 2 : class exists

On peut constater que la classe des équipements n’est pas devolo_cpl mais eqLogic car la classe devolo_cpl n’existe pas durant l’exécution de eqLocic->byType

J’ai tenté de créer une fonction postConfig_active($value) dans la classe du plugin mais cette fonction n’est pas exécutée à l’activation. Par contre, elle l’est à la désactivation du plugin.

Salut,

Je ne comprend pas ce que tu veux en fait, c’est quoi la question?

  • nous informer?
  • que ca soit fixé?
  • une autre solution pour faire « qlqch » ? si oui, tu cherches à faire quoi?

Je signale juste qu’il y a, a mon avis, un dysfonctionnement car il ne me semble pas logique que la fonction postUpdate (ainsi probablement que preUpdate) soit appelée lors de la désactivation du plugin mais pas lors de l’activation.

Dans mon cas, je supprime ou créé des listener en fonction de divers critères. L’un de ces critère est le fait que l’équipement est activé ou non.

J’ai contourné le problème en appelant la function de gestion de listener directement depuis le script plugin-info/install.php.

Pour la suite, je laisse ceux qui maîtrise le core voir s’il s’agit de quelque chose à corriger ou non.

Bonjour,

Lors de la désactivation d’un plugin, la page est refresh et donc la class du plugin n’est pas chargé.
c’est pourquoi a la réactivation le byType ne match pas sur la class extends du plugin mais sur la class eqlogic qui elle ne contient pas les fonctions postUpdate ….

Je sais pas si c’est la bonne méthode mais faudrait inclure la class a l’activation :

...
    } else if ($alreadyActive == 0 && $_state == 1) {

        include_file('core', $this->getId(), 'class', $this->getId()); //

        log::add("toto","info","plugin ID " . $this->getId());
        foreach (eqLogic::byType($this->getId()) as $eqLogic) {
            log::add("toto","info","plugin " . get_class($eqLogic));
            try {
                $eqLogic->setIsEnable($eqLogic->getConfiguration('previousIsEnable', 1));
                $eqLogic->setIsVisible($eqLogic->getConfiguration('previousIsVisible', 1));
                $eqLogic->save();
            } catch (Exception $e) {
            } catch (Error $e) {
            }
        }
    }
                ...

Bonjour,
C’est exactement ca le soucis, après faut je regarde car si je force l’inclusion et que la class a un bug ca va tout planter dans pas forcement une bonne chose. Mais je me note le point et chercher un axe d’amélioration.

1 « J'aime »

Bonjour,
J’ai poussé en alpha ta modification, d’après mes tests tout semble ok a voir si c’est le cas pour tout le monde.

1 « J'aime »