Bison
Décembre 28, 2022, 11:49
1
Bonjour,
Le but étant de faire afficher le graphique en le gérant dans le fichier html du répertoire « core/template/dashboard » du plugin
Le code de démo : Highcharts Demo - JSFiddle - Code Playground
L’erreur dans la console :
Uncaught Error: Highcharts error #17: www.highcharts.com/errors/17/?missingModuleFor=xrange
J’ai basiquement essayé ça :
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/xrange.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
Mais peut-être que Jeedom bloque l’accès à ces fichiers ou bien il continu d’interroger le core de Jeedom et pas ceux-là ?
J’ai également essayé de les incorporer dans 3rdparty mais idem ce que j’ai essayé ne donne rien.
Si vous aviez une petite idée de la façon de faire ça
Tu a essayé un include file 3rdparty highchart frange ?
Bison
Décembre 28, 2022, 12:56
3
Salut,
Non, il faudrait l’écrire comment puisque c’est un fichier .html le fichier du template ?
Tu veux dire mettre un <?php include_file('3rdparty', 'highcharts', 'js', 'xrange');?>
dans un autre fichier (php) ? mais lequel ?
Peu etre passer par un tohtml du plugin ?
Un peu bourrin pour l’instant mais en 4.4 les js et css de 3rdparty seront mis en cache et loadé qu’une fois.
Bison
Décembre 28, 2022, 1:24
5
Je passe bien par un toHtml pour charger le template
J’ai essayé include_file('3rdparty/highcharts', 'highcharts', 'js', __CLASS__);
dans cette fonction
En ayant ajouté les fichiers dans cette structure histoire de charger le highcharts.js
Mais là j’ai une belle erreur SyntaxError: invalid escape sequence
ce qui ne me semble pas anormal.
J’ai essayé de l’inclure dans le fichier plugin.php du core/php mais ça ne fonctionne pas (même problème qu’au départ)
Pas la peine de surcharger un highchart dans le plugin alors que tout est deja dans le core.
include_file(‹ 3rdparty ›, ‹ highstock/modules/xrange ›, ‹ js ›);
Bison
Décembre 28, 2022, 1:37
7
Ok vu mais c’est dans quel fichier faudrait-il faire cette inclusion ?
J’ai essayé include_file('3rdparty', 'highstock/modules/xrange', 'js')
dans les fichiers :
desktop/php/plugin.php
core/php/plugin.inc.php
Mais ça ne fonctionne pas (toujours même erreur de missingModuleFor=xrange
)
Et directement dans la fonction toHtml j’ai le SyntaxError: invalid escape sequence
jpty
Décembre 28, 2022, 2:21
8
Quand j’avais utilisé des annotations highcharts dans le plugin heliotrope, j’avais mis ça dans le template html :
<!-- TODO prevent multiload -->
<script type="text/javascript" src="3rdparty/highstock/modules/annotations.js"></script>
Annotations abandonnées depuis car elles ne fonctionnaient pas partout. Sinon il aurait fallu que je fasse ce qui est en commentaire …
Bison
Décembre 28, 2022, 3:07
9
Merci c’est bien ça qu’il fallait faire
Placé en début du fichier de template
<script type="text/javascript" src="3rdparty/highstock/modules/xrange.js"></script>
2 erreurs depuis le début :
Je n’avais pas vu que le xrange.js était déjà dans le core
J’avais ajouté la ligne de script à la fin de fichier
Du coup ensuite j’ai fini par faire un peu n’importe quoi !
Merci @jpty et merci @kiboost
test si il est deja loadé avant de le loader plusieurs fois…
jpty
Décembre 28, 2022, 6:16
11
C’est sur ça que j’avais buté. Comment tester qu’il a déjà été loadé par le navigateur ?
Je n’avais la moindre idée de comment le faire.
plusieurs solutions
if (document.getelementbyid('highstockxrange') == null {
<script id="highstockxrange" type="text/javascript" src="3rdparty/highstock/modules/xrange.js"></script>
}
ou plutôt
let src = '3rdparty/highstock/modules/xrange.js'
if (document.queryselector('[src*="'+src +'"]') == null {
<script type="text/javascript" src="3rdparty/highstock/modules/xrange.js"></script>
}
A tester, tapé comme çà.
En 4.4 ce sera automatique, tous les 3rdparty sont loadés dans le head et pas reloadés
Bison
Décembre 28, 2022, 8:12
13
Ok merci Kiboost je ne savais pas faire non plus
@kiboost en même temps … j’ai encore un soucis pur écrire ça :
<script>
let src = '3rdparty/highstock/modules/xrange.js';
if (document.queryselector('[src*="'+src +'"]') == null) {
<script type="text/javascript" src="3rdparty/highstock/modules/xrange.js"></script>
}
</script>
Ne fonctionne pas
Et
<script>
let src = '3rdparty/highstock/modules/xrange.js';
if (document.queryselector('[src*="'+src +'"]') == null) {
</script>
<script type="text/javascript" src="3rdparty/highstock/modules/xrange.js"></script>
<script>
}
</script>
Provoque des erreurs dans la console (mais load bien xrange.js)
Je cherche la bonne syntaxe …
noodom
Décembre 29, 2022, 10:52
14
Hello,
Pour le premier cas, tu inclus une balise html (<script/>
) dans du javascript.
Pour le deuxième cas, tu as 3 balises <script/>
indépendantes donc il va les traiter indépendamment.
La première il va considérer qu’il lui manque '}'
.
La deuxième, il va faire l’include (ce que tu as constaté).
La troisième, il va juste avoir '}'
, ce qui doit pas trop lui plaire
A voir (non testé) si un truc du genre peut suffire :
<script>
let src = '3rdparty/highstock/modules/xrange.js';
if (document.queryselector('[src*="'+src +'"]') == null) {
document.write ('<script type="text/javascript" src="3rdparty/highstock/modules/xrange.js"></script>');
}
</script>
C’est possible que tu doives décomposer le contenu du write
à cause du mot clé script
:
document.write ('<scr' + 'ipt type="text/javascr' + 'ipt" src="3rdparty/highstock/modules/xrange.js></sc' + 'ript>');
Bison
Décembre 29, 2022, 11:11
15
Salut @noodom ,
Merci pour le coup de main
Alors les 2 propositions ne fonctionnent pas chez moi car les fonctions sont inexistantes
<script>
if (document.getelementbyid('highstockxrange') == null) {
document.write ('<scr' + 'ipt id="highstockxrange" type="text/javascr' + 'ipt" src="3rdparty/highstock/modules/xrange.js></sc' + 'ript>');
}
</script>
TypeError: document.getelementbyid is not a function
<script>
let src = '3rdparty/highstock/modules/xrange.js';
if (document.queryselector('[src*="'+src +'"]') == null) {
document.write ('<scr' + 'ipt type="text/javascr' + 'ipt" src="3rdparty/highstock/modules/xrange.js></sc' + 'ript>');
}
</script>
TypeError: document.queryselector is not a function
SyntaxError: redeclaration of let src
noodom
Décembre 29, 2022, 11:16
16
La bonne syntaxe est getElementById
et querySelector
.
Dis-moi ce que ça donne.
Sinon, remplace let src
par let src2
pour voir si src n’est pas déjà utilisé avant (et remplace src
par src2
pour la suite ).
Bison
Décembre 29, 2022, 11:20
17
<script>
let src2 = '3rdparty/highstock/modules/xrange.js';
if (document.querySelector('[src*="'+src2 +'"]') == null) {
document.write ('<scr' + 'ipt type="text/javascr' + 'ipt" src="3rdparty/highstock/modules/xrange.js"></sc' + 'ript>');
}
</script>
→ Ecran blanc, plus de Jeedom (enfin la page du dashboard où il y a ce template)
1 « J'aime »
noodom
Décembre 29, 2022, 11:42
18
Rien dans la console ? A voir si il faut revoir la décomposition du contenu du write sinon.
Ou alors, le problème est ailleurs et le write ne fonctionne pas pour pour ce problème
Bison
Décembre 29, 2022, 11:48
19
Pas d’erreur dans la console non.
J’ai bien regardé s’il n’y avait pas d’erreur dans la décomposition (quote et double quote) mais je n’ai trouvé qu’un oubli dans une double quote que j’ai rajouté (le code que j’avais mis en dernier).
Bon c’était bien tenté … je vois pas bien comment décomposer autrement … là le mot script n’apparait jamais
system
A fermé ce sujet ()
Décembre 30, 2022, 11:49
20
Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.