BUG sur la classe eqLogic.ajax.php de JEEDOM

Bonjour,

En travaillant sur le développement d’un plugin j’ai remarqué un Bug dans la classe « eqLogic.ajax.php » qui gère la sauvegarde d’un ou plusieurs équipements. En effet la méthode save de cette classe prend en paramètre un Array d’équipement logique à sauvegarder hors dès la 1ère sauvegarde celle ci prend fin. Du coup, un seul équipement est sauvegardé et non l’ensemble.

Ce problème est du à cette ligne qui est exécuté dans la boucle foreach :
ligne 503 - ajax::success(utils::o2a($eqLogic));

En effet celle ci interrompe le traitement.

Je ne pense pas être sur le bon canal pour poster mon problème mais je n’ai pas trouvé mieux. Merci d’avance pour vos réponses.

Hello, juste au cas ou, tu encode au format json ton array avant l’appel de eqLogic.ajax.php ?

Oui c’est obligatoire même pour l’enregistrement d’un seul équipement. J’ai fait la correction sur mon Jeedom directement dans la classe en déplaçant la ligne 503 à la ligne 505 et ca fonctionne impec

Bien sur la correction n’est pas aussi simple mais ca prouve que ca fonctionne

Ah oui bien vu le ajax::success est dans la boucle :thinking:

@Phpvarious, je suis nouveau du coup je sais pas trop où remonter ce type de Bug à Jeedom serais tu ou le poster (Car je pense pas être au bon endroit la :stuck_out_tongue:) , ou à qui l’envoyer ?

Tu peux vérifier en 4.2 ? Tu peux aussi faire un pr en alpha si besoin. Je verrai avec @loic si on fixer en stable aussi ça me parait important. Mais je ne peux rien vérifier avant qql jours.

En 4.2 c’est aussi dans le foreach :

C’est bizarre je suis sur de sauver plusieurs eqlogic à plusieurs endroits.
Si pas de news début de semaine hésitez pas à me taguer.

1 « J'aime »

OK merci ^^

Tu utilise peut-être ta propre fonction monplugin.ajax.php, je vois pas mal de plugin qui utilise leur propre méthode pour faire un save sans passer par la méthode du core.

Je parlais pas de plugin a moi mais du core. Toute façon je vais pas corriger ou accepter un PR sans tester et je ne peux pas avant semaine pro. Donc à moins que Loïc ait le temps de regarder …

Mais merci d’avoir remonté en tout cas :wink:

2 « J'aime »

Pas de problème, et ca peut attendre la semaine prochaine sans soucis. Je préfère que vous preniez le temps de bien regarder la modification à apporter car elle ne sera pas si simple.

En effet, il faut prendre en compte la réussite partielle de la sauvegarde ou un roolback des sauvegardes effectuées si l’un des équipements tombent en erreur.

En tout cas tenez moi au courant, je suis impatient de pouvoir tester votre correctif :slight_smile:

Bonjour,

Pour répondre à ceci :

Si vous vous inscrivez en tant que dev tiers (nécessaire pour pouvoir publier un plug-in de toute façon), vous aurez accès à la section dev et bêta-testeurs sur community qui sont deux sections ou ce type de retour / question peut être fait.

1 « J'aime »

Merci pour l’information, mon inscription en tant que Développeur est en cours. Je le saurais pour la prochaine fois :wink:

1 « J'aime »

Et sinon j’ai jeté un oeil et effectivement cela ne peut pas fonctionner.
Dans le core le seul endroit où l’on utilise ca avec potentiellement plusieurs eqLogic c’est dans le plugin.template.js sur le « save » et on a ce code avant pour remplir l’array:

$('.eqLogic').each(function() {
    if ($(this).is(':visible')) {
      var eqLogic = $(this).getValues('.eqLogicAttr')
      eqLogic = eqLogic[0]
      eqLogic.cmd = $(this).find('.cmd').getValues('.cmdAttr')
      if ('function' == typeof (saveEqLogic)) {
        eqLogic = saveEqLogic(eqLogic)
      }
      eqLogics.push(eqLogic)
    }
  })

mais en pratique, selon le template il n’y a jamais qu’un seul eqLogic visible en même temps.

Oui après le fonctionnement « standard » est peut être de faire la sauvegarde des objets 1 à 1. Après c’est d’une part dommage et d’autre part on voit que la méthode SAVE a été prévue pour gérer plusieurs sauvegarde d’eqLogic. Tout dans le code va dans ce sens :

  • Array d’eqLogic en entrée de la méthode
  • Boucle de traitement dans la méthode SAVE
  • etc…

Pour le coup je dirais plus une erreur de développement sur l’instruction ajax::success mal positionnée.

En tout cas merci pour ta réponse en attendant un retour de @kiboost je vais appliquer le code du template :wink:

Oui je suis d’accord. Ma remarque était plutôt le résultat d’une investigation pour confirmer que c’était « logique » que personne n’ait été vraiment impacté jsq ici à priori.

Je ne jugeais pas si c’était normal de faire des sauvegardes multiples ou pas.

D’ailleurs par curiosité du coup, c’est quoi ton use case pour du coup créer/modifier des eqlogic en « masses »?

Désolé j’ai mal interprété ton 1er commentaire.

En fait je travaille sur un plugin permettant à Jeedom d’utiliser les équipements d’un box Fibaro. Dans cette écran d’ajout il est possible de jumeler / ajouter en masse les équipements de la box Fibaro

D’ou la découverte de ce bug :slight_smile:

2 « J'aime »

J’ai jeté un oeil rapide.

  • Effectivement ce n’est pas logique d’avoir une boucle et de faire un return dedans.

La fonction est utilisé :

  • \desktop\modal\eqLogic.configure.php → pas de traitement du retour
  • \desktop\modal\eqLogic.dashboard.edit.php → pas de traitement du retour
  • \core\js\plugin.template.js → traitement du retour, pour récupérer l’id de l’eq sauvé

Donc en l’etat le PR n’est pas bon. çà marcherai, mais çà renvoit les données du dernier eqlogic sauvé uniquement, donc pas beaucoup plus logique.
A voir si on retourne un array d’eqlogic, et dans ce cas plugin.template.js doit checker l’array.

J’en parle à @Loic car çà peux être impactant sur des plugins

1 « J'aime »

fixed

4 « J'aime »