Bonjour,

On 19/01/2012 17:33, MoYo wrote:
Le 19/01/2012 10:40, Damien Touraine a écrit :
Bonjour,

Je suis en train de travailler sur la représentation des NetworkPort dans les équippements (ordinateurs et autres switchs). J'essaie d'ajouter les informations réseaux et tout ce qui est nécessaire. Mais je me heurte à une difficulté : j'ai une ligne de tableau par port. Mais, pour chaque port, je peux avoir plusieurs nom réseau. Chacun de ces noms réseau peut avoir plusieurs adresses IP avec ses informations de réseau (adresse, masque et passerelle). De même, indépendemment de l'adresse IP, chaque nom réseau peut avoir plusieurs alias. L'idéal serait de faire du "rowspan". Mais pour cela, il faut pouvoir pré-définir l'ensemble de la ligne afin de savoir, pour chaque élément (nom réseau, adresse IP, alias) à chaque niveau quel est le nombre de ligne qu'il occupe. Une autre solution serait de créer un nouveau tableau à l'intérieur de la cellule, mais les en-têtes ne plomberaient plus avec les cases des sous-tableaux.

Salut,

dans un premier temps tu peux mettre effectivement un tableau dans la cellule sans pour autant mettre d'entêtes dans les sous-tableaux. Ces entêtes doivent pouvoir être positionnées dans celles du tableau complet.

Une fois cela en place on pourra réfléchir à améliorer l'affichage.
Je pensais créer une classe Table qui gèrerait l'affichage de ce type de table. C'est relativement compliqué, mais je devrais pouvoir proposer quelque chose dans le courant de la semaine prochaine.

Autre remarque sinon au niveau du schéma de la DB.
J'ai fait une analyse rapide et je pense qu'il y a des problèmes par rapport aux conventions standards de GLPI. Exemple pour la liaison networkports / networkportethernets. La liaison entre ces 2 tables se fait quand les id sont identiques. Cela ne correspond pas aux conventions de GLPI. L'id devrait rester en autoincrément et donc non forcé. On devrait avoir un champ networkports_id pour faire la liaison entre les tables.
Sans cela on va avoir des problèmes au niveau du moteur de recherche.
Cela fait partie de la difficile équation à résoudre : il y a bijection entre le NetworPort et son instanciation : un NetworkPort <=> une instanciation. L'un n'existe pas sans l'autre.

Dans une première version, je me suis rendu compte qu'il était lourd de charger un NetworkPort (par getFromDB ou autre), puis de faire une recherche de l'ID de sont instantiation (SELECT id FROM glpi_networkport??? WHERE networkports_id='?') pour enfin pouvoir charger son instantiation (toujours getFromDB ou autre). J'ai, donc, cherché une solution pour éviter d'avoir cette double recherche et trouver directement l'instantiation d'une seule requête.

Une première solution est de mettre un "networkports_id" dans l'instanciation et un "networkportinstantiations_id" dans le NetworkPort. Comme cela, pour obtenir l'instanciation, il suffit de chercher directement ** $networkport->fields['networkportinstantiations_id'] **. Mais qui de l'oeuf ou de la poule est le premier ? En effet, il faut gérer ce double chaînage. De plus, cela oblige à charger le NetworkPort si l'on veut avoir accès directement à son instantiation.

J'ai essayé de redéfinir la méthode CommonDBTM::getIndexName(). Mais il y avait quelques effet de bord (des requêtes hors de CommonDBTM utilisent directement `id` et non CommonDBTM::getIndexName()). C'est pourquoi je suis parti sur la solution avec un id commun entre le NetworkPort et son instanciation.

Je viens de voir que EntityData et TicketSatisfaction redéfinissaient la méthode CommonDBTM::getIndexName(). Cela n'introduit-il pas trop de problème ? Mais cela risque de devenir caduque si on change de point de vue sur la gestion des différentes instanciations.

Pour revenir sur un autre sujet discuté en interne, je penche de plus en plus pour migrer les données qui semblent génériques dans networkports (mac par exemple) et ne garder dans les tables liées uniquement les éléments spécifiques aux types (non partagés par plusieurs types).
Hormis l'adresse MAC et la carte réseau physique associée (mais cela ne concerne que Wifi et Ethernet pour le moment), je ne vois pas quels sont les autres informations que nous pourrions centraliser.
L'alternative initiale de vraiment tout migrer dans networkports me semble aussi une solution viable malgré les contraintes sur l'évolutivité que tu exposais.
C'est l'une des solutions de l'équation brièvement esquissée ci-dessus. Cela semble plus robuste et plus simple. Mais les évolutions futures seront plus lourdes à faire. Avec une classe par type d'instantiation, cela permet de faire le ménage dans la classe NetworkPort et de gérer plus finement chaque type de port (méthodes spécifiques pour le Wifi, pour le port Ethernet, pour l'aggrégat, ...). De plus, une idée que je n'ai pas osé mettre en oeuvre (tiens, j'ai été frileux sur ce coup :D) était de faire le même type de découpage avec les carte réseau : DeviceWifiNetworkCard, DeviceEthernetNetworkCard, ... Ainsi, une partie des champs disponibles pour les cartes réseaux serait "adaptable" dans l'instanciation (une carte réseau Ethernet 10/100/1000 verrait l'instanciation du NetworkPort configuré en 10, 100 ou 1000).



En conclusion : l'équation <modularité, robustesse, facilité d'utilisation et de maintenance, ...> est difficile à résoudre. Dans cette première implémentation, je l'ai pris sous un certain point de vue. On peut changer d'angle de vue, pourvu qu'il soit justifié.

Damien

_______________________________________________
Glpi-dev mailing list
Glpi-dev@gna.org
https://mail.gna.org/listinfo/glpi-dev

Reply via email to