Changement auto de l'objet par défaut d'un équipement nouvellement créé

Hello à tous,

J’aurais besoin d’un petit coup de main sur la partie pure js du core.
Je souhaiterai faire un truc tout bête sur le papier mais pas simple à dev :slight_smile:

Pour résumer : l’utilisateur de mon plugin dispose d’un paramètre de config pour saisir l’objet par défaut de ses futurs équipements. Il le saisi via un select de mon fichier configuration.php
Jusque là tout va bien :slight_smile:

Je modifie ensuite mon fichier parcelTracking.php avec le code suivant :

<select id="sel_object" class="eqLogicAttr form-control" data-l1key="object_id">
	<option value="">{{Aucun}}</option>
	<?php
		$options = '';
		foreach ((jeeObject::buildTree(null, false)) as $object) {
		if ( config::byKey('defaultObject', 'parcelTracking') == $object->getId() ) { $options .= '<option value="' . $object->getId() . '" selected="selected">' . str_repeat('&nbsp;&nbsp;', $object->getConfiguration('parentNumber')) . $object->getName() . '</option>'; }
		else { $options .= '<option value="' . $object->getId() . '">' . str_repeat('&nbsp;&nbsp;', $object->getConfiguration('parentNumber')) . $object->getName() . '</option>'; }
		}
		echo $options;
	?>
</select>

Cela me permet de récupérer la valeur de mon config::byKey('defaultObject', 'parcelTracking') en php.
Mais le passage en DB rechange la valeur par défaut et revient sur aucun.

Du coup je me suis dit que j’allais intercepter un event ‹ change › de l’Id l’équipement nouvellement créé via une fonction de mon fichier parcelTracking.js :

document.querySelector('.eqLogicAttr[data-l1key="id"]').addEventListener('change', function() { }

Et dans cette fonction, j’ai tout d’abord tenté :

const selectObject = document.getElementById('sel_object');
const selectedIndex = selectElement.selectedIndex;
selectElement.selectedIndex = 1;   //on repasse à 1 puis ensuite à la valeur voulue pour actualisation
selectElement.selectedIndex = selectedIndex;

Sans succès car le passage en DB se fait après cette fonction. Par contre si je fais :

const selectObject = document.getElementById('sel_object');
const options = Array.from(selectObject.querySelectorAll('option'));
selectObject.options.length = 0;
options.forEach(function(option) {
selectObject.appendChild(option); }

Là la fonction est effectuée après le passage en DB chez moi même si je trouve ca très crade :innocent: Mais pas chez tous les beta testeurs du plugin. Dépend de la puissance de la machine Jeedom amha.

Ma question : existe-t-il un event que je peux intercepter à la fin du chargement complet de la page de l’équipement ? J’ai essayé sans plus de succès avec

document.addEventListener('DOMContentLoaded', function() { }

Ou une autre méthode que je ne connais pas et beaucoup plus propre que la mienne ? :smiley:
J’ai tenté aussi le passage en php via public function preInsert() {} mais la aussi le passage en DB se fait après.

J’espère avoir été clair !
Merci d’avance

Salut,

J’ai lu en diagonale j’avoue (occupé sur autre chose) donc si j’ai pas bien compris la question désolé

si tu veux assigner un objet par défaut, pourquoi ne le fais-tu pas en preInsert() de ton eqLogic et basta?

càd? ca veut dire quoi « passage en db »? pcq forcément le save est après puisque c’est une méthode « pre… »

Merci pour ton aide !
Tu as parfaitement bien compris :slight_smile:

Je pense que Jeedom va regarder en DB si les paramètres existent déjà pour les préremplir. S’ils n’y sont pas il met les valeurs par défaut. Je me trompe ?
En tout les cas, en jouant avec les logs, je vois bien le bon index au moment du pre insert, puis ensuite le select repasse sur « Aucun » systématiquement

toujours pas compris:

je m’en fiche de l’affichage ici, je parle juste coté php
si ton eqLogic est créé avec le bon object_id alors il sera affiché correctement sans rien faire, comme si tu l’avais choisi manuellement
il ne faut écrire aucun code js pour ca.

y a rien en db encore lors du preInsert donc non le core va pas en db
si tu écris $this->setObject_id(xxx);, ca sera la valeur sauvée en db juste après


Attention tu peux avoir un problème en assignant un objet lors de la création: si un equipement du même nom existe déjà pour cet objet, il va y avoir une exception et ton eqlogic ne sera pas créé => il faut gérer ce cas (et laisser sur « aucun »)

OK je vais retenter ca ce soir mais lorsque je l’ai fait hier, je voyais bien mon objet souhaité s’afficher très succinctement puis il revenait sur la valeur par défaut « Aucun ». J’ai peut-être fait une connerie.
Je te redis ! Merci

OK c’est bien moi qui est merdé hier, plus les yeux en face des trous :slight_smile:

Le code dans le pre insert était bien OK mais j’avais omis de supprimer la modification de mon fichier parcelTracking.php :

<select id="sel_object" class="eqLogicAttr form-control" data-l1key="object_id">
	<option value="">{{Aucun}}</option>
	<?php
		$options = '';
		foreach ((jeeObject::buildTree(null, false)) as $object) {
		if ( config::byKey('defaultObject', 'parcelTracking') == $object->getId() ) { $options .= '<option value="' . $object->getId() . '" selected="selected">' . str_repeat('&nbsp;&nbsp;', $object->getConfiguration('parentNumber')) . $object->getName() . '</option>'; }
		else { $options .= '<option value="' . $object->getId() . '">' . str_repeat('&nbsp;&nbsp;', $object->getConfiguration('parentNumber')) . $object->getName() . '</option>'; }
		}
		echo $options;
	?>
</select>

pour revenir au code par défaut :

<select id="sel_object" class="eqLogicAttr form-control" data-l1key="object_id">
	<option value="">{{Aucun}}</option>
	<?php
		$options = '';
		foreach ((jeeObject::buildTree(null, false)) as $object) {
		      $options .= '<option value="' . $object->getId() . '">' . str_repeat('&nbsp;&nbsp;', $object->getConfiguration('parentNumber')) . $object->getName() . '</option>'; 
		}
		echo $options;
	?>
</select>

Je pense que le conflit venait de là :slight_smile:
Merci pour ton support

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.