Ajout nouvelle commande dans plugins et mise à jours de l'existant

Bonjour,

Il m’arrive de rajouter des infos/commandes dans le plugin sur demande.

Comment faire pour lorsqu’une nouvelle commande est ajoutée au plugin, elle puisse être ajoutée aux objets déjà existant?

Aujourd’hui je demandes aux utilisateurs d’éditer leurs objet et de sauvegarder manuellement pour que la nouvelle commande soit ajoutée à l’objet.

Stéphane.

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();

Tu peux lancer, aussi à la fin de l installation, une sauvegarde de tous les équipements

Je l’ai fait dans le plugin rose https://github.com/JEALG/plugin-rosee/blob/beta/plugin_info/install.php#L80

Merci de ton retour.

Je regarde pour voir comment intégrer.

Stef.

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)

Merci pour tes remarques constructives.
Je vais améliorer le code de mon plugin. Il n’esp pas publié.