Desktop/js/pluginid.js est interprété 2x ET les commandes sont affichées avec l'affichage par défaut du core après sauvegarde

Bonjour,

Sur ma machine de dev qui est un LXC Proxmox dont voici la page santé :


je rencontre les 2 phénomènes en titre alors que je développe un nouveau plugin (MyModbus Server) sans jQuery :

1. Réinterprétation ou réimport de desktop/js/pluginid.js

Le fichier desktop/js/mymodbusserver.js est interprété une fois supplémentaire après sauvegarde de l’équipement une fois sur deux. Une variable est déclarée de cette façon :

console.log('mymodbusserver.js loaded', Date());
const emptyMyModbusServerCmd = {type: 'info', subType: 'numeric', configuration: {cmdFormat: 'h', cmdRegisterType: 'hr'}};

Après sauvegarde de l’équipement, qu’il y ait une commande ou pas, un message d’erreur est lancé :

Uncaught SyntaxError: Identifier 'emptyMyModbusServerCmd' has already been declared (at getResource.php?file=plugins/mymodbusserver/desktop/js/mymodbusserver.js&md5=66760a951861e200ca13eb7aae522dae&lang=fr_FR:1:1)

En remplaçant la déclaration const par var, je n’ai plus l’erreur, logique…

Voici un gif de ce qui se passe :
Erreur JS

Curieusement, la ligne qui affiche l’heure courante juste pour faire du debug n’est pas doublée avec une heure différente.

2. Affichage des commandes avec l’affichage par défaut du core

La raison pour laquelle je poste ces 2 erreurs ensemble c’est parce qu’elles se produisent en même temps. Quand j’ai l’erreur dans le console, les commandes sont affichées avec la fonction par défaut du core :
Erreur JS2

Les entêtes de colonne à afficher sont bien celles de mon plugin, mais le contenu est celui du core.


Pour le premier problème, j’utilise var au lieu de const, c’est pas élégant mais ça a le mérite de ne pas générer d’erreur, mais pour le second, je suis paumé…

Moi, je sais à peu près coder en python et en php mais je ne suis pas un pro de JS du tout. Franchement, je ne sais pas dans quelle direction chercher l’erreur que j’ai faite.

J’ai l’impression que le rafraichissement de la page est plus long une fois sur deux : une fois c’est rapide et ça utilise la fonction du core et l’autre, c’est un peu plus long et ça utilise ma fonction.

Quelqu’un pourrait m’aiguiller SVP ?
Est-ce qu’il faut plus de code pour comprendre d’où le problème peut venir ?

A+
Michel

Hello,

Dans ce cas, on est d’accord que c’est var qui est utilisé dans le code ? on aperçois tout de même une erreur js sur ton gif.

Que ce soit var ou const, c’est pareil.

Et c’est quoi l’erreur js quand tu utilise var ?

L’utilisation de var au lieu de const permet de supprimer l’erreur, il n’y en a pas d’autre puisqu’on peut te déclarer la même variable avec var.

Le problème d’affichage est indépendant de l’erreur JS.

Le gif est fait avec const.

J’ai du mal a comprendre, lorsque tu utilise var tu n’as aucun soucis ?
même celui-ci :

Edit :

Voici le déroulement en utilisant const ou autre erreur js :

  • au 1er chargement :
    1. plugin.php (avec entête) est bien chargé
    2. plugin.js est bien injecté sans erreur car ta const est bien initié 1 seul fois.
  • a la sauvegarde, le core fait un loadPage.
    1. plugin.php (avec entête) est bien chargé.
    2. plugin.js contient une erreur (ex de la const), le reste du code n’est donc pas chargé, mais comme le core capte l’erreur, il continue son déroulement.
      et comme il ne trouve pas ton addCmdToTable il utilise celui par défaut addCmdToTableDefault.
  • au re-save :
    Comme tu save en présence d’une erreur js en console, le core n’utilise plus loadPage mais document.location.href, ce qui a pour effet de refresh la page et ainsi repartir a 0.

source :

Donc pour résumer, tu ne peux pas utiliser const dans plugin.js, et si tu veux tout de même protéger un minimum ta variable, il faudrait utiliser un namespace (objet global).

Ex :

MyModbusServer_globals = {};
MyModbusServer_globals.emptyMyModbusServerCmd = {
    type: 'info', 
    subType: 'numeric', 
    configuration: {
		cmdFormat: 'h', cmdRegisterType: 'hr'
    }
};
1 « J'aime »

Merci pour le diagnostique et la proposition de solution. J’ai opté pour le namespace puisque j’en avait déjà un qui contient des fonctions qui sont souvent utilisées, je l’ai étendu avec cette variable :

MyModbusServer_ext.emptyMyModbusServerCmd = {
	type: 'info',
	subType: 'numeric',
	configuration: {
		cmdFormat: 'h',
		cmdRegisterType: 'hr'
	}
};

Suite au premier rafraichissement j’ai eu le phénomème d’utilisation de la fonction du core une seule fois et sans erreur JS après 3 sauvegardes et ensuite, j’ai réessayé plusieurs fois, c’est toujours ma fonction qui est utilisée. Ctrl-F5 et c’est toujours ma fonction qui est appelée.
Je suppose que cet unique appel erroné venait d’un cache en tout cas, ça a l’air d’être résolu.

Merci infiniment Phpvarious !
:heart:

1 « J'aime »

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