Fonction récursive et méthodologie sur fonctionnement

Fonction récursive et méthodologie sur fonctionnement - HTML/CSS - Programmation

Marsh Posté le 02-07-2008 à 10:37:26    

Bonjour amis développeur.
 
Je suis entrain de créer un petit module pour le portail applicatif de la société ou je travail. Sur le module de la gestio des intervenants.
J'ai rajouter des informations concernant les qualifications de ces derniers. Pour cela 2 tables. 1 table qualifications avec en autre les champs  
qualification_id
agence_id
qualification_parent_id
qualification_nom
 
et une table intervtoqualif (jointure entre l'intervenant et une qualification) avec les champs suivant
inttoqua_id
inttotqua_intervenant_id
inttoqua_qualification_id
 
de ce fait un intervenant peut avoir 1 ou plusieur qualification.
 
le champs parent_id permet de gerer les qualification par groupe genre voici une arborecence tel que l'on peut l'avoir
 
Jardinage(id1)
--tonte(id2)
--taille(id3)
----fruitier(id4)
----rosier(id5)
----arbuste(id6)
--élagage(id7)
 
de ce fait tonte, taille et élagage auront un parent_id égale à 1 (jardinage) et fruitier , rosier, arbuste
 
Jusque la tout va bien. J'ai donc créer une fonction récursive en php pour m'organiser tel une arborescence de fichier (groupe, sous groupe, sous sous groupe et ainsi de suite) mes qualification avec un checkbox a coté pour le choix.
 
tout sa sa fonctionne bien.
 
Maintenant ce que je veux c'est si je coche une qualification enfante, alors toute les qualification parent jusqu'a la racine de l'arborescence se coche, donc forcement la on part en javascript, et je suppose qu'il faudra que je fasse une fonction recursive en js pour ca. Mais je seche un peu sur le fonctionnement  
 
le code html ressemble un peu a ca  
 

Code :
  1. <input type="checkbox" name="cbx_qualif_1" id="cbx_qualif_1">
  2.     <input type="hidden" name="hidQualif_1" id="hidQualif_1" value="0">
  3.     Jardinage<br />
  4. &nbsp;&nbsp;&nbsp;<input type="checkbox" name="cbx_qualif_2" id="cbx_qualif_2">
  5.     <input type="hidden" name="hidQualif_2" id="hidQualif_2" value="1">
  6.     Tonte<br />
  7. &nbsp;&nbsp;&nbsp;<input type="checkbox" name="cbx_qualif_3" id="cbx_qualif_3">
  8.     <input type="hidden" name="hidQualif_3" id="hidQualif_3" value="1">
  9.     Taille<br />
  10. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="cbx_qualif_6" id="cbx_qualif_6">
  11.     <input type="hidden" name="hidQualif_6" id="hidQualif_6" value="3">
  12.     Fruitier<br />
  13. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="cbx_qualif_12" id="cbx_qualif_12">
  14.    <input type="hidden" name="hidQualif_12" id="hidQualif_12" value="3">
  15.    Rosier<br />
  16. &nbsp;&nbsp;&nbsp;<input type="checkbox" name="cbx_qualif_4" id="cbx_qualif_4">
  17.    <input type="hidden" name="hidQualif_4" id="hidQualif_4" value="1">
  18.    Elagage<br />


 
Les "&nbsp;" c'est pour le respect de l'arborescence, pour le visuel quoi, tout se fait automatiquement via ma function recursive en php.
Les input type hidden sont la pour recuperer justement l'id_parent pour chaque element. L'id du input checkbox contien l'id de la qualification
de ce fait j'aurais tout les élément en ma pocession id de la qualification ainsi que l'id du parent.
 
Mais j'ai du mal a me projeter et voir comment faire en JS maintenant  
 
une petite idée ? j'espere avoir ete clair dans mes explication, j'ai toujours tendance a m'expliquer comme un pied ^^
 
merci

Reply

Marsh Posté le 02-07-2008 à 10:37:26   

Reply

Marsh Posté le 02-07-2008 à 11:00:47    

tu te servirais d'ul/li pour faire ton "identation" tout sera plus simple car il te suffirait de remonter de parentNode en parentNode...
 
Mais là, AMA, ça va pas être facile.


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 02-07-2008 à 11:05:56    

j'ai deja fait ceci

 
Code :
  1. function checkedParentQualif(qualif_id){
  2.        var idParent;
  3.        if(document.getElementById('cbx_qualif_'+qualif_if)){
  4.            idParent = document.getElementById('hidQualif_'+qualif_id).value;
  5.            // on check le checkbox parent
  6.            document.getElementById('cbx_qualif_'+idParent).checked="checked";
  7.         }
  8.         // on rapell la fonction (pour la recursive)
  9.         checkedParentQualif(idParent);
  10.    }
 

Et sa marche bien sa me check bien les parent

 

cela dit maintenant il faut que je fasse l'inverse :s je sais je suis chiant lol
si je decoche un parent que tout les enfant associé se décoche :s la pas simple


Message édité par hyptnos le 02-07-2008 à 11:06:53
Reply

Marsh Posté le 02-07-2008 à 12:23:57    

Bon je galere pas mal
 
 
voici l'ensemble de mes 3 fonction
La premiere est appeler sur l'action d'un checkbox et vérifie si coché ou pas et appel une autre fonction en fonction de l'etat.
pour coché les enfant si on coche le parent sa c'est ok comme expliqué ci dessus
Par contre si je decoche un parent je veux decoché tout les enfant
j'arrive pas a faire ma recursivité sur la derniere fonction (voir commentaire)
     // Existe-t-il un input dont la value est idQualif?
     // Oui => on rappelle la fonction notCheckedChildQualif(idQualif)
         
     
     // Non, on ne fait rien et laisse se derouler la boucle for
 

Code :
  1. function verifChecked(qualif_id){
  2. if(document.getElementById('cbx_qualif_'+qualif_id).checked == true){
  3.  checkedParentQualif(qualif_id)
  4. }
  5. else{
  6.  notCheckedChildQualif(qualif_id)
  7. }
  8. }
  9. function checkedParentQualif(qualif_id){
  10.  var idParent
  11.  // on teste l'existence du checkbox
  12.  if(document.getElementById('cbx_qualif_'+qualif_id)){
  13.     // On récupère la valeur du Input Hidden associé
  14.     idParent = document.getElementById('hidQualif_'+qualif_id).value;
  15.     //On check le parent
  16.     document.getElementById('cbx_qualif_'+idParent).checked = "checked";
  17.  }
  18.  checkedParentQualif(idParent);
  19. }
  20. function notCheckedChildQualif(qualif_id){
  21. var i;
  22. var tabCbx = document.getElementsByTagName("input" );
  23. var n = tabCbx.length;   // Nombre de input dans la page (afin d'avoir une limite d'arret a la boucle)
  24. for(i=0; i<=n; i++){
  25.  // on ne traite que les input de type Checkbox
  26.  if(tabCbx[i].type.toLowerCase()=="checkbox" ){
  27.   // On récupère l'id de la qualification
  28.   idQualif = tabCbx[i].id.substring(11,tabCbx[i].id.length);
  29.   if(idQualif != 0){
  30.    // On récupère l'id parent associé  
  31.    idParentAsso = document.getElementById('hidQualif_'+idQualif).value;
  32.    // Si parent id est égale qualif_id du paramètre de la fonction alors on decheck le cbx
  33.    if(idParentAsso == qualif_id){
  34.     alert('qualification = '+idQualif+' coché ? : '+document.getElementById('cbx_qualif_'+idQualif).checked);
  35.     document.getElementById('cbx_qualif_'+idQualif).checked = false;
  36.     // Existe-t-il un input dont la value est idQualif?
  37.     // Oui => on rappelle la fonction notCheckedChildQualif(idQualif)
  38.      
  39.     // Non, on ne fait rien et laisse se derouler la boucle for
  40.    }
  41.   }
  42.  }
  43. }
  44. }


Message édité par hyptnos le 02-07-2008 à 12:25:45
Reply

Marsh Posté le 02-07-2008 à 12:28:36    

on t'a dit de foutre une putain de liste en UL LI :o et ca sera largement plus facile derrière :o :o :oi

Reply

Marsh Posté le 02-07-2008 à 12:38:20    

je ne suis pas le boss, je dois donc continuer sur cette perspective :s
 
mais en gros la il faudrait juste que j'arrive a savoir si dans la page il y a un input type hidden qui a pour valeur l'id Parent
et si oui je relance la fonction (donc recursive) avec l'id parent en valeur
 
mais j'arrive pas a vérifier cette presence
et avec ca normalement sa devrait fonctionner

Reply

Marsh Posté le 02-07-2008 à 13:18:21    

ben tu dis au gars qui a généré cette merde :  
 
- si tu me modifie ça de cette manière, je divise par 3 le temps de dev

Reply

Marsh Posté le 02-07-2008 à 13:26:41    

le gars qui a créer cette "merde" comme tu dis c'est moi lol, mais parce que l'on me la demander de cette maniere (pas de liste html)
 
mais je vais essayé une autre méthode mais pour sa faut que j'arrive a créer une chaine issus d'un tableau (php) mais la pareille je coince, j'ai poster dans la catégorie php
mais une fois la chaine créer sa ira vite, la chaine me permettra d'organisé chaque élement 1 parent et ses enfant

Reply

Marsh Posté le 02-07-2008 à 13:34:10    

hyptnos a écrit :

le gars qui a créer cette "merde" comme tu dis c'est moi lol, mais parce que l'on me la demander de cette maniere (pas de liste html)


J'adorerais connaître l'argument derrière cette contrainte.  
Avec un petit coup de css, je te sors exactement la même présentation que ta bouse via des listes.


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 02-07-2008 à 13:37:21    

Bas le truc c'est que cela refait une grosse refonte du code pour arrive a avoir les liste puisque l'arborescence est créer dynamiquement via une fonction recursive php
donc deja cela devra dire qu'il faut refaire cette fonction pour avoir un affichage avec des UL et des LI.
 
Et ensuite gerer tout cela
 
deja hier l'idée etait de faire la meme chose mais dans un select multiple
aujourd'hui avec des checkbox. :S

Reply

Marsh Posté le 02-07-2008 à 13:37:21   

Reply

Marsh Posté le 02-07-2008 à 14:00:50    

hyptnos a écrit :

Bas le truc c'est que cela refait une grosse refonte du code pour arrive a avoir les liste puisque l'arborescence est créer dynamiquement via une fonction recursive php
donc deja cela devra dire qu'il faut refaire cette fonction pour avoir un affichage avec des UL et des LI.


Tu noteras bien qu'une telle fonction prend approximativement 10 lignes à écrire :/
exemple ( dégueu avec du print html à l'intérieur mais c'est pour l'exemple):

Code :
  1. $tab = array( 'A', 'B', array('B1', 'B2', 'B3'), 'C', array('C1', array('C11', 'C12'), 'C2', 'C3'));
  2. convertToHtml($tab);
  3.  
  4. function convertToHtml( $p ){
  5.  if ( is_string($p) ){
  6.    echo "<li>",$p,"</li>\n";
  7.  } else if ( is_array($p) ){
  8.    echo "<ul>\n";
  9.    array_map("convertToHtml", $p);
  10.    echo "</ul>\n";
  11.  }
  12. }



Message édité par anapajari le 02-07-2008 à 14:01:13

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 02-07-2008 à 14:06:09    

Oui mais voila le probleme mon tableau de depart n'est pas du tout dans le meme type non plus mais comme je l'ai mis dans la partie php

Reply

Marsh Posté le 02-07-2008 à 14:17:20    

tain mais t'arrêtes de faire ton gay et au choix, tu adaptes l'exemple pour qu'il prenne ton type de tableau en entrée ou tu modifies ton tableau.


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed