Partage
  • Partager sur Facebook
  • Partager sur Twitter

Système de gestion de favoris

sous-dossiers à l'infini

    6 octobre 2012 à 21:00:48

    Bonjour,

    je dois faire un système de gestion de favoris (testable ici) mais j'ai un problème : il faut que je fasse un système de gestion de sous-dossiers (on peut actuelement faire des dossiers et des favoris.

    Pour que vous compreniez mieux là où ça coince, je vais vous expliquer (c'est mieux hein :p ) :
    j'ai 2 tables dans ma BDD, respectivement "favoris" et "dossiers" la table dossier liste tous les dossier (on s'en serait douté...) et contient donc 2 champs (id et name) ; quand à la table favoris, elle contient donc les favoris ( :-° ) lié chacun à un id de dossier et elle contient donc elle aussi 2 champs (en réalité il y en a plus, mais ça ne nous intéresse pas ici ^^ ).

    Donc je ne sait pas si vous avez suivit mais comme j'ai une table spécifique pour les dossiers et une autres pour les favoris, lors de l'affichage, ça se fait comme ça en gros :
    Boucle d'affichage des dossiers
    {
         // on affiche les dossiers là
    
         Boucle affichage des favoris du dossier courant
         {
              // les favoris contenus dans un dossier sont affichés ici
         }
    
    }

    Voilà, c'est le principe de mon système.

    Donc, maintenant comment je fait pour gérer un système à sous dossiers infini (par exemple, un favoris <math>\(x\)</math> pourrait être contenu dans un dossier <math>\(Z\)</math>, lui-même contenu dans un dossier <math>\(Y\)</math>, lui-même contenu dans un dossier <math>\(X\)</math>, [...], lui-même contenu dans un dossier <math>\(B\)</math>, lui-même contenu dans un dossier <math>\(A\)</math> ?) :euh:


    C'est LA question que je me pose pour que la chose fonctionne tout en ayant un code un tant soi peu propre (je veux pas d'usine à gaz moi ^^ ). Donc si vous avez une idée, je suis preneur, à mon avis je m'y suis mal pris dès le début pour la gestion de ma BDD mais je ne vois pas vraiment comment faire autrement pour que ça permette d'utiliser un nombre infini (ou un grand nombre au moins) de sous-dossiers.



    Je laisse donc mon problème entre les mains des grands esprits de ce forum afin qu'ils éclairent ma petite lanterne à l'aide de leur grosse halogène :lol:
    • Partager sur Facebook
    • Partager sur Twitter
    http://prism-break.org, il y a toujours une alternative libre !
      6 octobre 2012 à 21:14:01

      Renseigne toi sur la Récursivitée.
      • Partager sur Facebook
      • Partager sur Twitter
        6 octobre 2012 à 21:14:45

        Ok, merci de ta réponse, mais ... tu peux développer ? :o
        • Partager sur Facebook
        • Partager sur Twitter
        http://prism-break.org, il y a toujours une alternative libre !
          6 octobre 2012 à 21:17:53

          Salut,

          je sais pas si c'est optimisé mais peut-être qu'ajouter un champ "id_pere" dans la table des dessiers qui contiendrai l'ID du dossier parent à celui-ci (0 si il n'a pas de père). (bien sûr dans les favoris il faut un champ "id_dossier")

          Ensuite avec un fonction récursive (c'est une fonction qui s'appelle elle-même) tu peux récupérer la liste des dossiers et des sous-dossiers de A à Z.

          Le problème c'est que à chaque entré dans la fonction il y a une requête SQL qui se fait et c'est donc assez lourd, donc c'est une idée, mais préfère attendre un avis autre que le mien ^^
          • Partager sur Facebook
          • Partager sur Twitter
            6 octobre 2012 à 21:20:28

            Niveau performance je pense que ta solution est la meilleur ^^
            Ce qui est sur c'est que un champ parent est obligatoire et qu'une fonction recursive pour l'affichage aussi :p
            • Partager sur Facebook
            • Partager sur Twitter
              6 octobre 2012 à 21:35:31

              J'ai survolé un billet de blog, je pense que ça peut t'aider :
              http://www.coinduwebmaster.com/menu-ar [...] rsive-php/89/
              • Partager sur Facebook
              • Partager sur Twitter
                6 octobre 2012 à 21:38:39

                Ok, merci effectivement ça à l'air intéressant, je regarderais ça quand j'aurais l'esprit un peu plus vif, sinon là ça risque de faire des noeuds dans ma tête pour un sujet comme ça :D
                • Partager sur Facebook
                • Partager sur Twitter
                http://prism-break.org, il y a toujours une alternative libre !
                  7 octobre 2012 à 22:10:59

                  Bon, je reviens vers vous car je n'ai pas réussi à résoudre mon problème malgré les heures passées à retourner mon code dans tous les sens et ce que j'ai pu trouver un peu partout sur le net (qui n'en était pas moins instructif, soit dit au passage) et ce n'est pas non plus tous les cheveux que j'ai pu perdre à chercher la solution qui ont changé quelque-chose :(

                  Voici donc ma fonction d'affichage des dossiers ; si vous pouviez me dire comment m'y prendre pour faire cette affichage "récursif" des sous-dossiers, je vous en serait reconnaissant :) :

                  <?
                  function show_list()
                  {
                  
                  $req=mysql_query('SELECT * FROM dossiers ORDER BY id ASC');
                  
                  while($data=mysql_fetch_array($req))
                  {
                  ?>
                  	  <tr class="toprow folder"  onclick="show(<?php echo $data['id'] ;?>);" id="folder_<?php echo $data['id'] ;?>">
                  		<td class="toprow_left"><span id="icon_folder_<?php echo $data['id'] ;?>"><img src="icons/folder.png" width="16" height="16"></span> <?php echo $data['name']; ?></td>
                  		
                  		<td class="toprow"><img src="icons/url_edit.png" title="Editer le fichier" onclick="ajax('edit', 'folder', <?php echo $data['id']; ?>);" width="16" height="16"> <img title="Ajouter un dossier" src="icons/doss_add.png" onclick="ajax('add', 'folder');" width="16" height="16"> &nbsp;<img title="Supprimer le dossier" src="icons/doss_del.png" onclick="ajax('delete', 'folder', <?php echo $data['id']; ?>);" width="16" height="16">&nbsp;<img src="icons/url_add.png" title="Ajouter un favoris" onclick="ajax('add', 'file', <?php echo $data['id']; ?>);" width="16" height="16"></td>
                  	  </tr>
                    
                  	<tbody class="Cfolder" id="Cfolder_<?php echo $data['id'] ;?>" >
                  	<?php
                  	
                  	
                  	$reqF=mysql_query('SELECT * FROM favoris WHERE `id_dossier`='.$data['id']); // en même temps on liste les favoris du dossier en cours
                  	
                  	while($favoris=mysql_fetch_array($reqF))
                  	{
                  		?>
                  		<tr class="file"  id="file_<?php echo $favoris['id'] ;?>">
                  			<td class="leftrow"><img src="icons/file.png" alt="" width="16" height="16"> <a href="<?php echo $favoris['url']; ?>" target="blank" class="tooltip"><?php echo $favoris['name'] ;  if(!empty($favoris['commentaire'])) { ?> <span class="classic"><?php echo $favoris['commentaire']; ?></span><?php } ?></a></td>
                  			
                  			<td><img src="icons/url_edit.png" title="Editer le favoris" onclick="ajax('edit', 'file', <?php echo $favoris['id']; ?>);" width="16" height="16">&nbsp;<img src="icons/url_del.png" title="Supprimer le favoris" onclick="ajax('delete', 'file', <?php echo $favoris['id']; ?>);" width="16" height="16"></td>
                  		</tr>
                  		<?php
                  	}
                  	?>
                    </tbody>
                  <?php
                  }
                  


                  En fait je n'arrive pas à modifier ce code de manière à ce qu'il gère une présence de sous dossiers infinie à nombre de niveaux >=5 :euh:

                  La table `dossiers` contient un champ `parent` indiquant l'id du possible dossier parent
                  • Partager sur Facebook
                  • Partager sur Twitter
                  http://prism-break.org, il y a toujours une alternative libre !
                  Anonyme
                    8 octobre 2012 à 1:42:36

                    Citation : PifyZ

                    J'ai survolé un billet de blog, je pense que ça peut t'aider :
                    http://www.coinduwebmaster.com/menu-ar [...] rsive-php/89/



                    Bof, cette techniquement a ses limites. Par exemple, comment récupérer le dossier primaire d'un sous-dossier de troisième niveau ?

                    Pour ça (et pour plusieurs autres raisons), on va préférer la représentation intervallaire. Une méthode un peu dur à mettre en place, mais combien efficace sur le plan de l'évolutivité. Elle règle aussi beaucoup de problème relié à la performance des méthodes traditionnelles !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 octobre 2012 à 16:37:55

                      Je ne connaissais pas la représentation intervallaire mais c'est sur que ça doit être assez ardu à mettre en place (au moins la première foi qu'on l'utilise)

                      Je pense avoir une technique plus simple. Je ne l'ai pas encore testé car elle m'est venu comme ça en lisant ce topic car je cherché un moyen de faire sans récursivité et améliorer l'idée champs id_pere.

                      Je suppose que cette technique existe déjà et qu'elle porte un autre nom mais celui que je lui ai trouvé est "navigation par code-barre"

                      Avant d'expliquer mon raisonnement, un petit schéma s'impose
                      Image utilisateur
                      Maintenant, comment c'est censé fonctionner :

                      Disons que "1-rep A" est le premier nœud de la branche, les nœuds suivants auront des identifiants de 1 a n, quand on arrive à un nœud les suivants sont à nouveaux numéroté de 1 a n et ainsi de suite jusqu’à ce qu'on arrive au bout de la branche.

                      C'est à partir de ce système de numérotation que je veux généré un code-barre

                      Ce sera surement plus clair avec des exemples :

                      - code-barre de navigation pour accéder a "P" 1.3.2.1 et pour ouvrir ce qu'il contient 1.3.2.1.3
                      - code-barre de navigation pour accéder a "K" 1.1.1 et pour ouvrir ce qu'il contient 1.1.1.1

                      Au niveau de la base de données je pense que cela se traduira ainsi
                      - l'identifiant unique d'un répertoire sera constitué de 2 champs "son chemin d’accès" + "son identifiant unique par rapport aux nœud parent"
                      --> quand on ajoute un répertoire, on fait "chemin d’accès"+"max(id enfant)+1"
                      - la clef étrangère de la table fichier sera la concaténation de chemin d’accès et id_repertoire

                      Au niveau de php
                      un simple algorithme qui décode le code-barre,il ne fera surement pas plus de quelque ligne et ressemblera probablement à ça
                      <?php
                      for($i=0;$i<(strlen($code_barre)/2);$i++){
                         $code_barre=substr($code_barre,0,-2);
                         $arr[]=$node;
                      }
                      $list=implode($arr, '","');
                      

                      Cela devrait donner la liste de nœud à déplier jusqu'au nœud final et il ni aura plus qu'a insérer la liste dans notre requête select pour déplier les bons répertoire.

                      Ce n'est que de la théorie pour l'instant, mais grâce aux schéma que j'ai fait pour ce post et aux recul que j'ai pris par rapport à mes idées de base en tentant d'expliquer ma méthode. tout c'est organiser dans mon petit cerveau déjanté :D

                      Je me fais peut être des idées mais j'ai l'impression que ça va être un jeu d'enfant de créer une classe de gestion de répertoire avec 4 ou 5 méthodes qui répondent a tes attentes.

                      Comme j'adore relevé les défis, je vais m'atteler a la tache en fin de journée et proposerai un code de base dans la soirée ou la nuit.

                      Même si cette technique me parait pas mal pour ce cas précis et que j'aime bien le nom de "navigation par code-barre", Je ne pense pas avoir ré-inventer la poudre donc si quelqu'un a le nom exacte de cette méthode je le remercie d'avance si il peut me le donner.

                      C'est pour que je puisse me renseigner sur les avantages-inconvénient et limites de cette technique parce que quand je tape "navigation par code-barre" sur google il me renvoi des résultats pour "code barre de navigation"
                      • Partager sur Facebook
                      • Partager sur Twitter
                      "Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité"  A.E.
                        8 octobre 2012 à 17:55:06

                        Ouch ! o_O

                        Je vous remercie beaucoup pour vos réponses mais j'ai un peut envie de dire "Tout ça pour gérer des favoris " Image utilisateur
                        Pour moi, tout ça reste trèèèèès théorique et ce n'est pas vraiment le genre d'approche que je préfère, si vous voyez ce que je veux dire ^^

                        Donc j'attends de voir ce que le code de kets14 donnerai parce-que je dois dire que niveau mise ne pratique ça reste assez flou pour moi ^^



                        PS : je tiens à rappeler que j'ai simplement besoin de LISTER les données présentes en BDD...
                        • Partager sur Facebook
                        • Partager sur Twitter
                        http://prism-break.org, il y a toujours une alternative libre !
                          8 octobre 2012 à 18:32:12

                          Citation : kets14

                          ...



                          J'aurai plutôt appelé ça "Navigation par routes"

                          Pour un système de favoris comme celui-ci, une fonction récursive fait simplement l'affaire :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 octobre 2012 à 19:21:14

                            Citation : polo03

                            j'ai un peut envie de dire "Tout ça pour gérer des favoris " Image utilisateur
                            Pour moi, tout ça reste trèèèèès théorique et ce n'est pas vraiment le genre d'approche que je préfère, si vous voyez ce que je veux dire ^^


                            Je me doute que ce n'est pas le genre d'approche que tu préfère mais seulement ta question se range dans une niche pour laquelle il ni as pas de tutoriel complet. Car cela sort du cadre strictement php.
                            Il y a un nombre limité de membre pouvant créer ce type de code sur le SDZ car il faut maitriser l'algorithmie, la modélisation de données et biensur PHP

                            Citation : polo03


                            PS : je tiens à rappeler que j'ai simplement besoin de LISTER les données présentes en BDD...

                            Si c'était juste lister les données un simple "select *" suffirais sauf que la il faut lister, trier puis ordonner les données en fonction de différents paramètres

                            Le code n'est pas encore très aboutis mais j'ai pas eu le temps de faire grand chose en 1 demi heure.
                            Pour l'instant, je n'ai fait que la méthode pour déplier l'arborescence mais si tu veux commencer a analyser le code pour comprendre comment il marche voila ou j'en suis
                            <?php
                            class directories {
                                private $_dir_id;      //identifiant du repertoire sur la branche
                                private $_dir_name;    //nom du repertoire
                                private $_dir_refNode; //liste des noeuds d'accés au repértoire
                                private $_dir_owner;   //propriètaire du repertoire donc de la liste de favoris
                                private $_cnx;
                            		
                            //constructeur	
                                public function __construct($cnx) {
                            	$this->_cnx=$cnx;
                                }
                            	
                            //accesseurs
                                public function dir_id() {
                                    return $this->_dir_id;
                                }	
                                public function dir_name() {
                                    return $this->_dir_name;
                                }
                                public function dir_refNode() {
                                    return $this->_dir_refNode;
                                }
                                public function dir_owner() {
                                    return $this->_dir_owner;
                                }
                            	
                            //mutateurs
                                public function setDir_id($id) {
                            	$this->_dir_id = $id;
                                }
                                public function setDir_name($name) {
                            	$this->_dir_name = $name;
                                }		
                                public function setDir_refNode($refNode) {
                            	$this->_dir_refNode = $refNode;
                                }
                            	public function setDir_owner($owner) {
                            		$this->_dir_owner = $owner;
                                }
                            	
                                public function dir($node=null){
                            	$arr[]='';
                            	if(!empty($node)){
                            	   $arr[]=$node;
                            	   for($i=0;$i<(strlen($node)/2);$i++){
                            		$node=substr($node,0,-2);
                            		$arr[]=$node;
                            	   }
                            	   $list=implode($arr, '","');
                            	   $clause='dir_ref in ("'.$list.'")';
                            	}else{
                            	   $list=implode($arr, '","');
                            	   $clause='dir_ref in ("'.$list.'")';
                            	}
                            	$sql='select concat(dir_ref,".",dir_id) as node, dir_name  
                            		from t_directory_dir WHERE  '.$clause.' 
                            	    order by left(concat(dir_ref,dir_id),1),
                                                 concat(dir_ref,".",dir_id)';
                            	return $this->_cnx->query($sql)->fetchAll(PDO::FETCH_OBJ);
                                }	
                            }// fin class directories
                            
                            $pdo = new PDO(	'mysql:host=localhost;dbname=test','root','');
                            $fav=new directories($pdo);
                            
                            $node=(!empty($_GET['node']))? $_GET['node'] : null;
                            echo '<table>';
                            foreach($fav->dir($node) as $key=>$dir){
                               $node=($dir->node[0]=='.')? substr($dir->node,1):$dir->node;
                               echo '<tr><td>';
                               echo preg_replace('/[0-9.]/', '-', $dir->node).'>';
                               echo '<a href="?node='.$node.'">'.$dir->dir_name.'</a>';
                               echo '</td>';
                               echo '<td><a href="?node='.$node.'&form=md">ajouter un dossier</a></td>';
                               echo '</tr>';
                            }
                            echo '</table>';
                            

                            Même si tu ne comprend pas tout de la ligne 1 a 65 essai de voir comment ça marche pour ta culture personnelle.
                            A terme de toute façon, tu n'aura que les lignes 68 a 78 a modifier car ce sont elles qui génèrent l'affichage
                            L'affichage que j'ai pour l'instant
                            -->repertoire 1               ajouter un dossier
                            --->repertoire 1.1            ajouter un dossier
                            ----->repertoire 1.1.1        ajouter un dossier
                            ----->repertoire 1.1.2        ajouter un dossier
                            --->repertoire 1.2            ajouter un dossier
                            -->repertoire 2               ajouter un dossier


                            @pifiZ

                            Citation

                            Pour un système de favoris comme celui-ci, une fonction récursive fait simplement l'affaire :)

                            je suis pas très fan des récursives si je peux m'en passer
                            Comme l'a dis luigi_home la récursion à ces limites et plus l’arbre sera compliqué plus les récursions prendrons de temps.
                            La j'ai une boucle pour lires les données et une pour décoder les code-barre et ceci qui y ai 5 ou ou 100 niveaux d'imbrications alors qu'une récursive tournera des centaines de fois pour déplier chaque niveau de l'arborescence
                            • Partager sur Facebook
                            • Partager sur Twitter
                            "Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité"  A.E.
                              8 octobre 2012 à 20:32:09

                              Citation : kets14

                              Il y a un nombre limité de membre pouvant créer ce type de code sur le SDZ car il faut maitriser l'algorithmie, la modélisation de données et biensur PHP


                              Et j'ai l'honneur d'en avoir quelques uns pour me répondre :soleil:


                              En tout cas, merci bien pour ton code kets, je vais étudier tout ça d'un peu plus près et voir ce que je peux en tirer ;)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              http://prism-break.org, il y a toujours une alternative libre !
                                8 octobre 2012 à 23:12:23

                                J'ai un petit bug d'affichage quand je veux déplier le 6 ou 7eme nœuds

                                Ça m'affiche bien le répertoire d'origine et les 4 ou 5 nœuds précédents mais j'ai l'impression qu'il me zappe quelque nœuds. Ce n'est pas grand choses, ils faut juste que je revoie la liste des nœuds que ma requête doit sélectionner.

                                De toute façon, le stockage en base de données est bon parce que quand je clique sur "déplier toute l'arborescence" tout est ok

                                affichage arborescence totalement déplié
                                ajouter un dossier
                                ------>rep test insert                                      ajouter un dossier
                                --------->rep test insert                                   ajouter un dossier
                                --------------->rep test insert                             ajouter un dossier
                                --------------------->test insert 2                         ajouter un dossier
                                --------------------------->test insert1                    ajouter un dossier
                                --------------------------------->azertyuuipo               ajouter un dossier
                                --------------------------------------->aaaa                ajouter un dossier
                                --------------------------------------->test insert1        ajouter un dossier
                                ------>azertyuuipo                                          ajouter un dossier
                                ------>test insert 2                                        ajouter un dossier
                                --------->test insert 2                                     ajouter un dossier
                                --------------->test insert1                                ajouter un dossier
                                --------------->aaaa                                        ajouter un dossier
                                --------------->test insert1                                ajouter un dossier
                                --------------->azertyuuipo                                 ajouter un dossier
                                ------>test insert1                                         ajouter un dossier
                                déplier toute l'arborescence


                                si tu veux tester le code et faire des jeux d'essai
                                - tu crée un base de données qui s'appelera test
                                - exécute le code suivant pour créer la table
                                CREATE TABLE `t_directory_dir` (
                                 `dir_ref` varchar(30) NOT NULL DEFAULT '',
                                 `dir_id` int(11) NOT NULL,
                                 `dir_name` varchar(30) NOT NULL,
                                 PRIMARY KEY (`dir_ref`,`dir_id`)
                                ) ENGINE=InnoDB DEFAULT CHARSET=latin1
                                

                                - et tu met ce code dans un fichier php
                                <?php
                                /**
                                 * Description of directories 
                                 *
                                 * @author kets14
                                 */
                                class directories {
                                    private $_dir_id;      //identifiant du repertoire sur la branche
                                    private $_dir_name;    //nom du repertoire
                                    private $_dir_refNode; //liste des noeuds d'accés au repértoire
                                    private $_dir_owner;   //propriètaire du repertoire donc de la liste de favoris
                                    private $_cnx;
                                		
                                //constructeur	
                                    public function __construct($cnx, $donnees = array()) {
                                	$this->_cnx=$cnx;
                                    }
                                	
                                //accesseurs
                                    public function dir_id() {
                                        return $this->_dir_id;
                                    }	
                                    public function dir_name() {
                                        return $this->_dir_name;
                                    }
                                    public function dir_refNode() {
                                        return $this->_dir_refNode;
                                    }
                                    public function dir_owner() {
                                        return $this->_dir_owner;
                                    }
                                	
                                //mutateurs
                                    public function setDir_id($id) {
                                	$this->_dir_id = $id;
                                    }
                                    public function setDir_name($name) {
                                	$this->_dir_name = $name;
                                    }		
                                    public function setDir_refNode($refNode) {
                                	$this->_dir_refNode = $refNode;
                                    }
                                    public function setDir_owner($owner) {
                                	$this->_dir_owner = $owner;
                                    }
                                    public function dir($node=null){
                                	if(!empty($node)){
                                	    $arr[]='';
                                	    $arr[]=$node;
                                	    for($i=0;$i<(strlen($node)/2);$i++){
                                		$node=substr($node,0,-2);
                                		$arr[]=$node;
                                	    }
                                	    $list=implode($arr, '","');
                                	    $clause='dir_ref in ("'.$list.'")';
                                	}else{
                                	    $arr[]='';
                                	    $list=implode($arr, '","');
                                	    $clause='dir_ref in ("'.$list.'")';
                                	}
                                	$sql='select concat(dir_ref,".",dir_id) as node, dir_name  
                                		from t_directory_dir 
                                               WHERE '.$clause.' 
                                	    order by left(concat(dir_ref,dir_id),1),concat(dir_ref,".",dir_id)';
                                	return $this->_cnx->query($sql)->fetchAll(PDO::FETCH_OBJ);
                                    }
                                    public function dir_all(){
                                	$sql='select concat(dir_ref,".",dir_id) as node, dir_name  
                                		from t_directory_dir 
                                	    order by left(concat(dir_ref,dir_id),1),concat(dir_ref,".",dir_id)';
                                	return $this->_cnx->query($sql)->fetchAll(PDO::FETCH_OBJ);
                                    }
                                    public function md($name, $node){
                                	$max=$this->_cnx->query('select max(dir_id) as dir_id 
                                                                   from t_directory_dir 
                                                                  where dir_ref = "'.$node.'"')->fetch(PDO::FETCH_OBJ);
                                	$sql='insert into t_directory_dir(dir_ref,dir_id,dir_name) 
                                		   values ("'.$node.'",'.($max->dir_id+1).',"'.$name.'")';
                                	$this->_cnx->exec($sql); 
                                   }	
                                }// fin class directories
                                
                                $pdo = new PDO(	'mysql:host=localhost;dbname=test','root','');
                                $fav=new directories($pdo);
                                
                                
                                $node=(!empty($_GET['node']))? $_GET['node'] : null;
                                
                                if(!empty($_GET['md'])){
                                    $fav->md($_GET['md'],$node);
                                }
                                
                                if(!empty($_GET['form'])){
                                    if($_GET['form']=='md'){
                                	echo 'Nom du repertoire';
                                	echo '<form method="get" action="">';
                                	echo '<input type="hidden" name="node" value="'.$node.'" />';
                                	echo '<input type="text" name="md"  />';
                                	echo '<input type="submit" name="btnMd" value="créer le repertoire"  />';
                                	echo '</form>';
                                	echo '<br />';
                                   }
                                }
                                if(!empty($_GET['action']) && $_GET['action']=='dir_all'){
                                    $tree = $fav->dir_all();
                                }else{
                                    $tree =$fav->dir($node);
                                }
                                echo '<a href="?form=md">ajouter un dossier</a>';
                                echo '<table>';
                                foreach($tree as $key=>$dir){
                                    $node = ($dir->node[0]=='.')? substr($dir->node,1):$dir->node;
                                    echo '<tr><td>';
                                    echo preg_replace('/[0-9.]/', '---', $dir->node).'>';
                                    echo '<a href="?node='.$node.'">'.$dir->dir_name.'</a>';
                                    echo '</td>';
                                    echo '<td><a href="?node='.$node.'&form=md">ajouter un dossier</a></td>';
                                    echo '</tr>';
                                }
                                echo '</table>';
                                echo '<a href="?action=dir_all">déplier toute l\'arborescence</a>';
                                ?>
                                

                                Je bosse demain, je n'aurai pas le temps de faire des jeux d'essai mais si tu teste et constate des bugs signales les moi je résoudrai demain soir
                                • Partager sur Facebook
                                • Partager sur Twitter
                                "Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité"  A.E.
                                  8 octobre 2012 à 23:31:31

                                  Ok je verrai tout ça demain soir je pense (moi aussi je "bosse" demain :p )
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  http://prism-break.org, il y a toujours une alternative libre !
                                    11 octobre 2012 à 17:15:24

                                    je ne sais pas ou tu en es dans ton système de gestion de favoris mais j'ai réussi à résoudre les quelques bugs que j'avais constaté dans mon premier code
                                    Avec cette nouvelle version, je peut gérer la création et l'affichage de 999 sous répertoire pour chaque répertoire.
                                    <?php
                                    class PDOFactory {
                                    	private static $_instance;
                                    
                                    	public function __construct( ) {
                                    	}
                                    
                                    	public static function getInstance() {
                                    		if (!isset(static::$_instance)) {
                                    			try {
                                    				static::$_instance = new PDO('mysql:host=localhost;dbname=test','root','',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
                                    			} catch (PDOException $e) {
                                    				echo $e;
                                    			}
                                    		}
                                    		return static::$_instance;
                                    	}
                                    }
                                    class directories {
                                        private $_dir_ref; 		//liste des noeuds d'accés au repértoire
                                    	private $_dir_id;      	//identifiant du repertoire sur sa branche
                                    	private $_dir_node;    	//identifiant unique du répertoire dans l'arborescence
                                        private $_dir_name;    	//nom du repertoire
                                    	private $_cnx;
                                    		
                                    //constructeur	
                                    	public function __construct($donnees = array()) {
                                    		$this->_cnx=pdoFactory::getInstance();
                                    		if (!empty($donnees)) $this->hydrate($donnees);
                                    	}
                                    	
                                    //accesseurs
                                        public function dir_id() {
                                            return $this->_dir_id;
                                        }	
                                    	public function dir_name() {
                                            return $this->_dir_name;
                                        }
                                    	public function dir_ref() {
                                            return $this->_dir_ref;
                                        }	
                                    	public function dir_node() {
                                            return $this->_dir_node;
                                        }
                                    	public function dir_owner() {
                                            return $this->_dir_owner;
                                        }
                                    	
                                    //mutateurs
                                        public function setDir_id($id) {
                                    		$this->_dir_id = $id;
                                        }
                                    	public function setDir_name($name) {
                                    		$this->_dir_name = $name;
                                        }
                                    	public function setDir_ref($ref) {
                                    		$this->_dir_ref = $ref;
                                        }	
                                    	public function setDir_node($node=null) {
                                    		if(empty($node)){
                                    			$this->_dir_node = $this->_dir_ref.$this->_dir_id;
                                    			
                                    		}else{
                                    			$this->_dir_node=$node;
                                    		}
                                    		
                                        }
                                    	public function setDir_owner($owner) {
                                    		$this->_dir_owner = $owner;
                                        }
                                    	public function hydrate(array $donnees){
                                            foreach ($donnees as $key => $value){
                                    			$method = 'set'.ucfirst($key);
                                    			if (method_exists($this, $method)){
                                    				$this->$method($value);// On appelle le setter
                                    			}
                                    			$this->setDir_node() ;
                                    		}
                                    	}// fin hydrate
                                    	public function dir(){
                                    		$clause='';
                                    		if(!empty($this->_dir_node)){
                                    		$arr=array();
                                    			$arr[]=$this->_dir_node;
                                    			$size=strlen($this->_dir_node);
                                    				while($size>3){
                                    					$this->_dir_node=substr($this->_dir_node,0,-3);
                                    					$arr[]=$this->_dir_node;
                                    					$size-=3;
                                    				}
                                    			$list=implode($arr, '","');
                                    			$clause='or  dir_ref in ("'.$list.'")';
                                    		}
                                    		$sql='select dir_ref, dir_id, dir_name
                                    					from t_directory_dir where dir_ref=""	'.$clause.' 
                                    					ORDER BY concat(dir_ref, dir_id )';
                                    		$dir=$this->_cnx->query($sql);
                                    		$arr_dir='';
                                    		    while ($donnees = $dir->fetch(PDO::FETCH_ASSOC)){
                                                    $arr_dir[] = new Directories($donnees);	
                                                }
                                    			return $arr_dir;
                                    
                                    	}
                                    	
                                    	public function dir_all(){
                                    		$sql='select *  
                                    				from t_directory_dir 
                                    				order by concat(dir_ref,dir_id)';
                                    				$dir=$this->_cnx->query($sql);
                                    		    while ($donnees = $dir->fetch(PDO::FETCH_ASSOC)){
                                                    $arr_dir[] = new Directories($donnees);	
                                                }
                                    			return $arr_dir;
                                    	}
                                    	
                                    	public function mkdir($name){
                                    		$max=$this->_cnx->query('select max( cast( dir_id AS signed ) )  as dir_id from t_directory_dir where dir_ref="'.$this->_dir_node.'"')->fetch(PDO::FETCH_OBJ);
                                    		if($max->dir_id==999){
                                    			echo 'Le nombre limite de sous répertoire par repertoire est de 999';
                                    		}else{
                                    			$sql='insert into t_directory_dir
                                    			                  (dir_ref,dir_id,dir_name) 
                                    				       values ("'.$this->_dir_node.'",
                                    					           "'.sprintf('%1$03d',$max->dir_id+1).'",
                                    							   "'.$name.'")';
                                    			echo ($this->_cnx->exec($sql)==1)
                                    			       ? 'repertoire '.$name.' créé' 
                                    				   : 'ECHEC : veuillez recommencer!!!';
                                    		}
                                    	}
                                    	
                                    }// fin class directories
                                    
                                    $fav=new directories();
                                    
                                    $node=(!empty($_GET['node']))? $_GET['node'] : null;
                                    
                                    $fav->setDir_node($node);
                                    
                                    if(!empty($_GET['md'])){
                                    	$fav->mkdir($_GET['md']);
                                    }
                                    
                                    if(!empty($_GET['form'])){
                                    	if($_GET['form']=='md'){
                                    		echo 'Nom du repertoire';
                                    		echo '<form method="get" action="">';
                                    		echo '<input type="hidden" name="node" value="'.$node.'" />';
                                    		echo '<input type="text" name="md"  />';
                                    		echo '<input type="submit" name="btnMd" value="créer le repertoire"  />';
                                    		echo '</form>';
                                    		echo '<br />';
                                    	}
                                    }
                                    if(!empty($_GET['action']) && $_GET['action']=='dir_all'){
                                    	$tree = $fav->dir_all();
                                    }else{
                                        $tree =$fav->dir();
                                    	
                                    }
                                    
                                    echo '<a href="?form=md">ajouter un dossier</a>';
                                    echo '<table>';
                                    foreach($tree as $key=>$dir){
                                    echo '<tr><td>';
                                    echo str_repeat("--",strlen($dir->dir_node())/3 ).'>';
                                    echo '<a href="?node='.$dir->dir_node().'">'.$dir->dir_name().'</a>';
                                    echo '</td>';
                                    echo '<td><a href="?node='.$dir->dir_node().'&form=md">ajouter un dossier</a></td>';
                                    echo '</tr>';
                                    }
                                    echo '</table>';
                                    
                                    echo '<a href="?action=dir_all">déplier toute l\'arborescence</a>';
                                    ?>
                                    

                                    J'espère que ce la pourra t'aider
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    "Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité"  A.E.
                                      11 octobre 2012 à 18:00:44

                                      Merci pour votre aide mais j'ai finalement abandonné la chose. :(
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      http://prism-break.org, il y a toujours une alternative libre !

                                      Système de gestion de favoris

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown