Aide select en PHP sur page d'équipement

Bonjour, je demande de l’aide à la communauté.
J’ai ce code PHP dans ma page d’équipement ProJote

<div class="form-group listenfant" style="display:block;">
<label class="col-sm-4 control-label">{{Enfants }} <i class="fas fa-question-circle tooltips" title="{{Choisissez le nom de l'enfant}}"></i></label>
<select id="enfantList" class="col-sm-6 eqLogicAttr form-control" data-l1key="configuration" data-l2key="enfant">
	<?php										
	$jsonFile = '/var/www/html/plugins/ProJote/data/' . $eqLogic->getId() . '/enfant.ProJote.json.txt';
	if (file_exists($jsonFile)) {
	$jsonContent = file_get_contents($jsonFile);
	if ($jsonContent === false) {
	echo '<option value="">Erreur de lecture du fichier JSON</option>';
	} else {
	$data = json_decode($jsonContent, true);
	if ($data === null) {
	echo '<option value="">Erreur de décodage du fichier JSON</option>';
	} elseif (isset($data['Liste_Enfant'])) {
	$listeEnfant = json_decode($data['Liste_Enfant'], true);
	if (is_array($listeEnfant)) {
	foreach ($listeEnfant as $enfant) {
	echo '<option value="' . htmlspecialchars($enfant) . '">' . htmlspecialchars($enfant) . '</option>';
	}
	} else {
	echo '<option value="">Liste d\'enfants vide ou incorrecte</option>';
	}
	} else {
	echo '<option value="">Clé Liste_Enfant non trouvée dans le fichier JSON</option>';
		}
	}
	} else {
	echo '<option value="">Fichier JSON non trouvé</option>';
	}
	?>
	</select>
</div>

L’objectif est d’afficher une liste contenue dans un fichier.

Mon problème est que si aucun équipement n’est initialisé. Il y a une erreur sur l’affichage de la page la première fois, puisqu’il n’y a aucun équipement.
Mon second problème est que la liste reste en mémoire du navigateur. Si je passe d’un équipement à l’autre, la liste ne se renouvelle pas.

J’avais codé cela en JavaScript mais lors de la sauvegarde, la valeur disparaissait.

Bonjour,

j’ai lu rapidement, voilà des remarques :

  • l’indentation doit t’aider à lire la structure de ton code, là tout est à plat…
  • pour la ligne $jsonFile = '/var/www/html/plugins/ProJote/data/' . $eqLogic->getId() . '/enfant.ProJote.json.txt'; :
    • les chemins absolus ne sont pas conseillés. Utilise la variable __DIR__ et fais des chemins relatifs
    • une double extension de fichier ? Pourquoi ne pas laisser .json ?

Si j’ai bien compris, tu as un fichier json qui contient une liste d’enfants pour un équipement donné.
→ Pourquoi ne pas sauvegarder ce json comme un array dans la configuration de l’équipement ?

$eqLogic->setConfiguration('liste_enfant', $json_du_fichier_en_array);

Où est définie ta variable $eqLogic dont tu récupères l’id ?

Le fichier .txt pour une question de sécurité d’accès, l’extension JSON n’est pas autorisé.
L’usage de la variable de class DIR est intéressante je vais l’utiliser.

J’ai créé 25 commandes différents car l’on m’a déconseillé dès le début de stocker des JSON dans les commandes.

Je ne sais pas de quoi tu parles, je te suggérais de sauvegarder cette liste dans la configuration de l’équipement plutôt que dans un fichier lié à l’équipement.

edit: c’est un import à faire une fois pour générer les commandes ?

Je ne sais pas ce que tu fais avec ces données, mais comme ça, à la 1ère lecture de ce petit bout de code, c’est ce qui m’est passé par la tête. Imagine toi que je ne connais que ce bout de code sur l’ensemble de ton plugin. Je ne connais pas le principe, pas la philosophie, rien…

Alors je ne sais pas ce que fais

$eqLogic->setConfiguration(

Ni comment fonctionne cette méthode.
Moi ce que je veux c’est un menu déroulant nique pour chaque équipement.

Pour le moment je récupère des information que je stock dans un fichier pour les utiliser ultérieurement

Dans quel contexte ?

Ah… c’est ton premier plugin ?

J’utilise des bouts de code PHP dans le fichier php du plugin et dans le javascript du plugin
ProJote.php
ProJote.js

pour afficher et récupérer des informations.

Malheureusement, c’est même pire, ce sont mes premiers codes.

Alors… Se lancer en programmation c’est bien, c’est stimulant, c’est intéressant.

MAIS

Il faut y aller par petits bouts.

Commence par te familiariser avec le langage html avec du js dedans. Puis passe au php. Puis mélange le tout.


La solution suivante :

Est une solution trop peu optimisée. Jeedom dispose d’une base de données pour stocker des choses. Jeedom met à disposition des méthodes de classe pour te faciliter la vie dans le plugin. Sauvegarder dans un fichier n’est pas la chose à faire.

Je ne doute pas que tu es motivé et intelligeant, mais là il te faut des conseils de base pour la structure même du plugin…

Je ne cherche pas à détruire tes espoirs, mais tu pars de loin.

Tu as lu le plugin template et l’exemple VDM de la doc ?

Voila 1 an que j’accumule les bouts python, html, php, javascript pour en arrivé là.

Je fais tout en auto didacte par empirisme. A force d’accumuler des bouts c’est vrai que le château s’effondre parfois. Et d’autre fois, je trouve la solution et j’avance à l’étape suivante.

Par contre le résultat n’est pas toujorus trés beau mais j’eessaye d’avancer pour fournir quelque chose. Aprés j’optimiserai.
J’ai parfaitement étudier le template plugin et le premier plugin VDM j’ai commencé avec lui en corrigeant le code car la page web avait changé.

Ma plus grande difficulté est la frustration de savoir que quelqu’un la surement déjà programmé mais je ne sais pas comment le trouver parmi tous les plugin jeedom qui existe.
Et tous comme la méthode

$eqLogic->setConfiguration

J’ai pas d’explication, documentation, ni d’usage proposé avec un contexte.

OK.

L’idée d’optimiser plus tard n’est pas optimal, crois moi…

Dans la doc, tu as donc vu cette ligne :

<input class="eqLogicAttr form-control" data-l1key='configuration' data-l2key='fromName' />

Eh bien pour récupérer cette valeur fromName, tu utilises

$eqLogic->getConfiguration('fromName', '');

Jeedom te met cette méthode à disposition. Bien sûr la variable $eqLogic doit être définie et représenter l’équipement qui t’intéresse.

Les clés de configuration, tu les définies pour l’équipement. Il peut y en avoir pour les commandes selon le même principe.

Dans la page de doc en lien plus haut, il y a des cas d’utilisation de getConfiguration et de setConfiguration pour des commandes, mais le principe est le même pour des équipements.

Tu les récupères d’où ?
Tu veux pouvoir les réutiliser quand ?

Ton plugin fait quoi ?
Un équipement correspond à quoi ?
Une commande correspond à quoi ?

Réponds de manière détaillée à chaque question STP

Je crée des équipements qui correspondent à des éléves.
Il existe 2 méthodes de connection via QRCODE et via LOGIN.
La méthode de Login à 2 sous fonction normal et Parent.
Dans le cadre d’un parent, il peut avoir plusieur enfant à charge.

Donc si un parent se logue, il clique sur un bouton valider, pour tester son authentification.
Cela exécute via Javascript AJAXX qui exécute un code Python qui va écrire des information dans le dossier "data " du plugin avec le num d’équipement comme sous dossier.
C’est là que je crée ou met à jours le fichier enfant.ProJote.json.txt

Et c’est dans ce fichier que je stock la liste d’enfants du compte que je veux afficher dans l’onglet de configuration de l’équipement.

Donc tu considères qu’un équipement correspond à un compte ? Avec ses autorisations et tout.

Il y a un cas où il peut y avoir plusieurs comptes et donc plusieurs équipements ?


Je fais l’analogie avec un plugin à moi : Klereo (gestion de piscines)
Les informations de login sont définies et sauvegardées au niveau du plugin. Il n’y a donc qu’un seul login/mdp avec ses accès et ses droits (accordés par klereo). C’est soit un compte installateur avec accès à tous les bassins installés avec des droits élevés (géré par le serveur) soit un compte client avec accès à son bassin (rarement plusieurs, mais possible) et ses droits.

Un équipement est un bassin avec juste son nom à choisir dans une liste déroulante lors de la définition de l’équipement. En interne on stacke l’id du bassin

image

Une commande est une mesure (pH, température, état éclairage, pompe, etc…). Il y a pleins de commandes créées automatiquement à la création de l’équipement. Le type et la quantité de commande en fonction des droits sur le bassin.


etc…

Ca vaut ce que ça vaut, mais c’est structuré.


Je reviens sur ton plugin : il est donc possible et voulu que sur le même Jeedom plusieurs login soient utilisés : pour les parents et les enfants ? C’est la raison pour laquelle tu définis un compte utilisateur (parent ou enfant) au niveau équipement, parce qu’il faut pouvoir gérer plusieurs accès ?
Tu dois savoir que tu peux sauvegarder des choses dans l’équipement. La liste des enfants peut être sauvegardée dans l’équipement sans passer par un fichier (et c’est même plus propre).
Tu peux aussi définir un logicalId pour des commandes gérées uniquement par le plugin (l’utilisateur ne peut pas les supprimer) du type enfant_1, enfant_2, … dont le name serait le nom de l’enfant.

→ pas de fichier. tu n’en as pas besoin.

Tu parles d’un script python : il fait quoi ? S’il va chercher des infos sur une API web, pourquoi ne pas le faire en php ?

Merci pour toutes ces informations qui vont me donner matière à étudier.

Le script python je l’utilise obligatoirement car je passe par wrapper en Python nommé ProjotePy

Nouvelle question concernant :

$eqLogic->getConfiguration('fromName', '');

Il faut le script :

<input class="eqLogicAttr form-control" data-l1key='configuration' data-l2key='fromName' />

Pour déclarer la variable de configuration à Jeedom ?

Tu devrais définir qu’est-ce que tu veux où en premier.
En interprétant un peu, c’est un système d’accès aux notes des élèves ? Si un équipement de niveau parent est défini, qu’est-ce qui empêche l’enfant qui a accès à Jeedom d’aller voir les infos dans l’équipement de ses parents ?

C’est du html dans la page de configuration de l’équipement. Ce code HTML permet au core de définir une clé de configuration dans l’équipement au moment de la sauvegarde.

1 « J'aime »

L’identifiant pour chaque équipement est :
Login
Passw
Parent ?
Si oui
Nom de l’enfant