Voici un bout de code que j’utilise dans la commande fonction postsave
Dans tous les cas, il faut que l’utilisateur exécute un save de son équipement
$action = $this->getCmd(null, 't_consigne');
if (!is_object($action)) {
// Si la commande n'existe pas -> Elle est créée
// Mettre ici les éléments que l'utilisateur peut modifier
$action = new mczthermCmd();
$action->setLogicalId('t_consigne');
$action->setName(__('T_consigne', __FILE__));
$action->setConfiguration('minValue', 5);
$action->setConfiguration('maxValue', 35);
$action->setTemplate('dashboard','button');
$action->setTemplate('mobile','button');
$action->setDisplay('showNameOndashboard','0');
$action->setDisplay('showNameOnmobile','0');
}
// Les éléments ci-dessous sont mis à jour lors de chaque save de l'équipement
$action->setOrder($order++);
$action->setEqLogic_id($this->getId());
$action->setConfiguration('infoName', $info->getId());
$action->setValue($info->getId());
$action->setType('action');
$action->setSubType('slider');
$action->setIsVisible(1);
$action->save();
Si je peux me permettre, je trouve ça pas terrible de faire ça au postsave: de manière générale ça prend du temps et c’est assez désagréable de devoir attendre 1s à 2s à chaque save d’un équipement.
C’est particulièrement perceptible sur un équipement avec beaucoup de commandes et encore plus si comme dans ton exemple le -->save() est fait en dehors du if; ça fait un accès à la db pour rien.
Deuxièmement dans cette exemple, même lorsque la commande existe tu rechanges l’ordre des commandes et le setvisible alors que l’utilisateur avait peut être changé ça selon ses goûts.
Tout ce qui est fait ici doit être mis dans le if… il n’y a aucune raison de redéfinir l’eqlogic_id en dehors du if par exemple, si le code est arrivé sur cette ligne sans passer dans le if c’est que forcément il est déjà bon.
Et pour répondre à la question d’origine, pour moi les opérations de « migrations » (ajouter des commandes par exemple) devraient être appelées depuis la fonction pluginId_update ainsi ce n’est exécuté qu’une seule fois (le code peut se trouver dans des fonctions de la class eqlogic évidemment mais donc pas dans le postSave)