postUpdate et commandes (ordre des cmds dfférent)

Bonjour,
Dans le cadre d’une création d’un plugin, j’utilise la fonction postUpdate() pour mettre à jour et formater des données.
Je définis un ordre précis sur les commandes de mon équipement puis je valide. jusque là tout va bien lol
Hors quand je récupère les données des commandes dans postUpdate() et les cmds via

$liste_cmds=$this->getCmdByGenericType('info');

Je m’aperçois que l’ordre ne correspond pas à ce qui a été configuré (mais à l’ancienne configuration), pourtant lors du réaffichage de mon équipement, l’ordre correspond bien aux modifications enregistrées.

Si je ré-enregistre à nouveau sans rien modifier, là l’ordre des cmds est ok…

Je me casse les dents sur cette bizarrerie depuis plus jours ! J’espère que mon explication est compréhensive :sweat_smile:

Salut,

Tu vas encore me trouver chiant mais je trouve qu’il ne faut pas toucher à cette config dans le postUpdate.
L’ordre des commandes c’est l’utilisateur qui le choisi (dans la liste des commandes ou en mode édition sur le dashboard)
si tu re-modifies derrière lui l’ordre, bonjour la frustration

par contre tu peux définir un ordre « par défaut » lors de la création des commandes.


et concernant ta question, cet ordre c’est un ordre d’affichage, ca ne garanti absolument pas selon moi qu’une méthode tel que getCmdByGenericType va renvoyer les commandes dans cet ordre (et si actuellement c’est le cas, il ne faut pas compter dessus)

Je pense que t’as pas bien lu mon post, sans vouloir être méchant…
je récupère l’ordre défini par l’utilisateur et en fonction de ca je fais une génération de données en parallèle.
Quel est la méthode pour récupérer l’ordre des commandes renvoyées pour un équipement ?
pourtant getCmdByGenericType renvoit bien l’ordre, mais avec un enregistrement de retard. (comme si je passais par preUpdate)
D’où l’obligation actuelle de ré-enregistrer. Dans Jeedom c’est juste lors de l’actualisation, donc il y a une autre méthode qui soit met à jour soit renvoi l’ordre actualisé à appeler

moi j’ai lu ca

donc oui j’ai compris que tu utilisais le postUpdate et que tu définissais un ordre précis, c’est un peu ce qui est écrit…

et nul par il n’était écrit que:

les problèmes de compréhension ne sont pas toujours du à celui qui lit :wink:

donc je pense que tu n’as pas bien écrit ton post, sans vouloir être méchant…

Difficile a expliquer lol

J’ai l’impression qu’au moment où postUpadte est appelé que les commandes ne sont pas encore a jour. Même l’ordre des commandes est faux

La valeur order enregistrée dans la commande ne correspond pas

Donc elle est mis a jour après postupdate

c’est exact, cf fichier core\ajax\eqLogic.ajax.php autour de la ligne 470 (en fonction de la version)

le $eqLogic->save(); est fait et juste après on boucle sur les commandes reçues pour faire le save foreach ($eqLogicSave['cmd'] as $cmd_info)

		foreach ($eqLogicsSave as $eqLogicSave) {
			try {
				if (!is_array($eqLogicSave)) {
					throw new Exception(__('Informations reçues incorrectes', __FILE__));
				}
				$typeEqLogic = init('type');
				$typeCmd = $typeEqLogic . 'Cmd';
				if ($typeEqLogic == '' || !class_exists($typeEqLogic) || !class_exists($typeCmd)) {
					throw new Exception(__('Type incorrect, (classe commande inexistante)', __FILE__) . $typeCmd);
				}
				$eqLogic = null;
				if (isset($eqLogicSave['id'])) {
					$eqLogic = $typeEqLogic::byId($eqLogicSave['id']);
				}
				if (!is_object($eqLogic)) {
					$eqLogic = new $typeEqLogic();
					$eqLogic->setEqType_name(init('type'));
				} else {
					if (!$eqLogic->hasRight('w')) {
						throw new Exception(__('Vous n\'êtes pas autorisé à faire cette action', __FILE__));
					}
				}
				if (method_exists($eqLogic, 'preAjax')) {
					$eqLogic->preAjax();
				}
				$eqLogicSave = jeedom::fromHumanReadable($eqLogicSave);
				utils::a2o($eqLogic, $eqLogicSave);
				$dbList = $typeCmd::byEqLogicId($eqLogic->getId());
				$eqLogic->save();
				$enableList = array();

				if (isset($eqLogicSave['cmd'])) {
					$cmd_order = 0;
					foreach ($eqLogicSave['cmd'] as $cmd_info) {
						$cmd = null;
						if (isset($cmd_info['id'])) {
							$cmd = $typeCmd::byId($cmd_info['id']);
						}
						if (!is_object($cmd)) {
							$cmd = new $typeCmd();
						}
						if (isset($cmd_info['display']['parameters'])) {
							$keys = array_map('trim', array_keys($cmd_info['display']['parameters']));
							$values = array_map('trim', array_values($cmd_info['display']['parameters']));
							$cmd_info['display']['parameters'] = array_combine($keys, $values);
						}
						$cmd->setEqLogic_id($eqLogic->getId());
						$cmd->setOrder($cmd_order);
						utils::a2o($cmd, $cmd_info);
						$cmd->save();
						$cmd_order++;
						$enableList[$cmd->getId()] = true;
					}
					foreach ($dbList as $dbObject) {
						if (!isset($enableList[$dbObject->getId()]) && !$dbObject->dontRemoveCmd()) {
							$dbObject->remove();
						}
					}
				}
				if (method_exists($eqLogic, 'postAjax')) {
					$eqLogic->postAjax();
				}
			} catch (Exception $e) {
				if (strpos($e->getMessage(), '[MySQL] Error code : 23000') !== false) {
					if ($e->getTrace()[2]['class'] == 'eqLogic') {
						throw new Exception(__('Un équipement portant ce nom (', __FILE__) . $e->getTrace()[0]['args'][1]['name'] . __(') existe déjà pour cet objet', __FILE__));
					} elseif ($e->getTrace()[2]['class'] == 'cmd') {
						throw new Exception(__('Une commande portant ce nom (', __FILE__) . $e->getTrace()[0]['args'][1]['name'] . __(') existe déjà pour cet équipement', __FILE__));
					}
				} else {
					throw new Exception($e->getMessage());
				}
			}
			array_push($return, utils::o2a($eqLogic));
		}
		if ($nbrSave > 1) ajax::success($return);
		ajax::success(utils::o2a($eqLogic));
	}

Ranienien…
Du coup, une idée pour contourner le problème ?
Sans devoir lancer une double sauvegarde ?

c’est à dire?

l’outils recherche est magnifique, il permet de trouver des sujets similaires: Résultats de recherche pour « postupdate command » - Communauté Jeedom

ici p-e:

J’avais cherché sous postupdate uniquement…
Bien vue !
Au top ça fonctionne. Un grand merci !!!

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.