Amélioration fonction / Tree View

Résolu
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007 - 30 juil. 2007 à 10:22
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007 - 31 juil. 2007 à 10:04
Bonjour,

J'ai récupéréi l n'y a pas longtemps un bout de code me permettant d'afficher l'aborescence d'un répertoire, jusque là tout vas bien.
Le problème qui se pose c'est que :

1/ Le code n'est pas du tout optimisé
2/ Il ne permet d'afficher qu'un nombre limité de niveau. C'est à dire qu'au bout de 6 sous-répertoires cela ne fonctionne plus. Biensur on peut rajouter les niveaux à la main mais question pratique ce n'est pas le top.

Mes connaissances en PHP ne me permette pas de l'optimiser donc si il y a une bonne âme qui serait capable de faire ça.

Exemple du code sur 2 niveaux

 

<?
function niv_0($chemin0)
{
global  $tab_rep ;
$tab_rep[]="/";
[mailto:$rep_0=@opendir($chemin0 $rep_0=@opendir($chemin0]); 
   while([mailto:$nomfichier=@readdir($rep_0 $nomfichier=@readdir($rep_0]))
  {
  if ($nomfichier !="." &amp;&amp; $nomfichier !="..")// pour eviter le premier
     {
     if(!is_file($chemin0 . "/" . $nomfichier))
    {
    echo "<li id='foldheader'>$nomfichier </li>";
?>

<?
$chemin1 = "$chemin0$nomfichier";
$tab_rep[] = $chemin1;
niv_1($chemin1);
echo"";
    }
   }// de if ($nomfichier !="."  pour eviter le premier
  }// de while($nomfichier 
//echo "";
closedir($rep_0);
//--------------------------------------------  
[mailto:$rep_0=@opendir($chemin0 $rep_0=@opendir($chemin0]);
 while([mailto:$nomfichier=@readdir($rep_0 $nomfichier=@readdir($rep_0]))
  {
  if ($nomfichier !="." &amp;&amp; $nomfichier !="..")// pour eviter le premier
     {
     if(is_file($chemin0 . "/" . $nomfichier))
    {
    $chemin = $chemin0;
    tri($chemin,$nomfichier, $tab_rep);
    }
   }// de if ($nomfichier !="."  pour eviter le premier
  }// de while($nomfichier
closedir($rep_0); 
echo "";
}
//*********************************************************************************
function niv_1($chemin1)
{
global   $tab_rep ;
 [mailto:$rep_1=@opendir($chemin1 $rep_1=@opendir($chemin1]);
 while([mailto:$nomfichier_1=@readdir($rep_1 $nomfichier_1=@readdir($rep_1]))
  {
  if ($nomfichier_1 !="." &amp;&amp; $nomfichier_1 !="..")// pour eviter le premier
     {
   if(!is_file($chemin1."/".$nomfichier_1))
    {
    //$nb_indice = count($tab_rep);
    echo "<li id='foldheader'>$nomfichier_1 </li>";
    //$indice++;
?>

<?
$chemin2 = "$chemin1/$nomfichier_1";
$tab_rep[] = $chemin2 ;
niv_2($chemin2);
echo"";
    }
     }
  }
@closedir($rep_1); 
//*******************************************************************************
[mailto:$rep_1=@opendir($chemin1 $rep_1=@opendir($chemin1]);
  while([mailto:$nomfichier_1=@readdir($rep_1 $nomfichier_1=@readdir($rep_1]))
  {
  if ($nomfichier_1 !="." &amp;&amp; $nomfichier_1 !="..")// pour eviter le premier
     {
      if(is_file($chemin1."/". $nomfichier_1))
    {
    $chemin = $chemin1;
    $nomfichier = $nomfichier_1;
    tri($chemin,$nomfichier, $tab_rep);
    }
   }// de if ($nomfichier !="."  pour eviter le premier 
  }// de while($nomfichier */
@closedir($rep_1);
}
//*********************************************************************************
function niv_2($chemin2)
{
global  $tab_rep ;
[mailto:$rep_2=@opendir($chemin2 $rep_2=@opendir($chemin2]);
 while([mailto:$nomfichier_2=@readdir($rep_2 $nomfichier_2=@readdir($rep_2]))
  {
  if ($nomfichier_2 !="." &amp;&amp; $nomfichier_2 !="..")// pour eviter le premier
     {
      if(!is_file($chemin2."/".$nomfichier_2))
    {
    //$nb_indice = count($tab_rep);
    echo "<li id='foldheader'>$nomfichier_2 </li>";
?>

<?
$chemin3 = "$chemin2/$nomfichier_2";
$tab_rep[] = $chemin3 ;
niv_3($chemin3);
echo"";
    }
     }
  }
closedir($rep_2);
//**************************************************
[mailto:$rep_2=@opendir($chemin2 $rep_2=@opendir($chemin2]);
  while([mailto:$nomfichier_2=@readdir($rep_2 $nomfichier_2=@readdir($rep_2]))
  {
  if ($nomfichier_2 !="." &amp;&amp; $nomfichier_2 !="..")// pour eviter le premier
     {
      if(is_file($chemin2."/". $nomfichier_2))
    {
    $chemin = $chemin2;
    $nomfichier = $nomfichier_2;
    tri($chemin,$nomfichier, $tab_rep);    
    }
   }// de if ($nomfichier !="."  pour eviter le premier 
  }// de while($nomfichier */
closedir($rep_2);
}



Merci de votre aide.

10 réponses

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
30 juil. 2007 à 13:26
Salut,

C'est pas possible comme ça !!!
Il faut faire une fonction récursive (qui descend automatiquement dans l'arborescence de répertoire). En plus c'est facile... Exemple:

<?php
error_reporting(E_ALL | E_STRICT);

// Uniquement pour PHP4... Où la fonction scandir n'existe pas!
if ( ! function_exists('scandir') ) {
    function scandir ( $dir ) {
        $dh = opendir($dir);
        $files = array();        while (false !($filename readdir($dh))) {
            $files[] = $filename;
        }
        return $files;
    }
}

// LA FONCTION RECURSIVE
// Parcours un dossier et s'auto-appelle si trouve un sous-dossier
function listdir ( $dir ) {
    // Parcours du dossier, pour trouver la liste de son contenu
    $files = scandir($dir);
    // Si vide, on laisse tomber
    if ( empty($files) ) return;
    // Ordonne les fichiers/sous-dossiers par ordre "naturel"
    natcasesort($files);

    // Début de la liste
    echo '';
    foreach ( $files as $file ) {
        // ne pas tenir compte de ces dossiers        if ( $file '.' or $file '..' ) continue;

        // nom complet du fichier trouvé
        $fullpath = "$dir/$file";

        // Si répertoire
        if ( is_dir( $fullpath ) ) {
            echo '<li class="dir">'.$file;
            // appel recursif
            listdir ( $fullpath );
            echo '</li>';
        }
        // sinon, affichage simple
        else echo '<li class="file">'.$file.'</li>';
    }
    echo '';
}

// TEST DE LA FONCTION

// Un peu de style
echo <<<STYLE
<style type="text/css">
li { list-style: none; }
.dir {
    font-weight: bold;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
}
.file {
    font-weight: normal;
    font-style: italic;
    font-size: smaller;
}
</style>
STYLE;

// On teste le répertoire courant
$dir = realpath(dirname(__FILE__));
// BOUM
listdir($dir);
exit;

A+
3
cs_caviar Messages postés 329 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 29 mars 2015 2
30 juil. 2007 à 12:06
    salut ...
regarde celle ci si elle ne convient pas mieux ;)
http://www.phpcs.com/codes/FONCTION-RECURSIVE-POUR-GENERER-ARBORESCENCE-FICHIERS-AVEC-FILTRES_42092.aspx
@+
0
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007
30 juil. 2007 à 12:13
Non pas vraiment, comme je l'ai dit le code que j'ai mis est vraiment le résultat que je veux. Sauf que cette fonction n'est pas récurcive là est mon problème.

Mais merci quand même.
0
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007
30 juil. 2007 à 14:34
Merci en bidoullant un peu avec mon script js ca devrait le faire.

Bye.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007
30 juil. 2007 à 14:47
Bon en fait c'est presque parfait sauf que la fonction m'affiche tout mes répertoire d'un coup et pas juste ce que je veux.
Je vais cherché mais si quelqu'un à une idée qu'il fasse signe .
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
30 juil. 2007 à 15:30
Et.... tu veux quoi ?
0
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007
30 juil. 2007 à 15:51
Je veux comme une aborescence windows quand je click sur un répertoire il m'affiche les répertoires contenu dedan etc...

Ca c'est ma fonction js c'est peut-être la dedan qu'il faudrait changer quelque chose :

#-------------------------------------------------------------------------------------------------------#

var jav_combo
var head="display:''"
img1=new Image()
img1.src="fold.gif"
img2=new Image()
img2.src="open.gif"




function change(){
   if(!document.all)
      return
   if (event.srcElement.id=="foldheader") {
      var srcIndex = event.srcElement.sourceIndex
      var nested = document.all[srcIndex+1]
      if (nested.style.display=="none") {
         nested.style.display=''
         event.srcElement.style.listStyleImage="url(images/list_rep/open.gif)"
      }
      else {
         nested.style.display="none"
         event.srcElement.style.listStyleImage="url(images/list_rep/fold.gif)"
      }
   }
}
document.onclick=change;




#-------------------------------------------------------------------------------------------------------#



Et ici un bout de code de l'apelle de la fonction :

#-------------------------------------------------------------------------------------------------------#

  <!-- premier decalage  -->
 <?
 echo "<LI ID='foldheader'>Projets</li>";
 ?>
 
 <?



  $dir = $_POST["montage"];
  listdir($dir); 
  
 ?>  






 <SCRIPT LANGUAGE="javascript">
 jav_combo ="<?echo"$le_combo"?>";
 parent.jav_combo = jav_combo;
 </SCRIPT>




#-------------------------------------------------------------------------------------------------------#


Quandje click sur "Projet" il m'affiche tout d'un seul coup (normal vu la fonction), après certes je peux réduire l'aborescence mais je voudrais que ca le fasse dès le début.(désolé si je suis pas clair )
0
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007
30 juil. 2007 à 17:23
      
En gros voila je veux l'aborescence du premier quand je click sur 'Projets' et pas celle ci-dessous. Rien ne vaut une image :)
                                         
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
30 juil. 2007 à 17:25
Salut,

Je n'ai pas lu ton code, mais juste fait une petite modif au mien pour inclure ta demande :

(Le même code sans commentaires)

function listdir ( $dir, $uid = '') {
    $files = scandir($dir);
    if ( empty($files) ) return;
    natcasesort($files);

    echo '';
    foreach ( $files as $file ) {        if ( $file '.' or $file '..' ) continue;

        $fullpath = "$dir/$file";

        if ( is_dir( $fullpath ) ) {
            $uid = uniqid();
            echo '<li class="dir">[javascript:open_close(\''.$uid.'\'); '.$file.']';
            listdir ( $fullpath, $uid );
            echo '</li>';
        }
        else echo '<li class="file">'.$file.'</li>';
    }
    echo '';
}

echo <<<HTML
<style type="text/css">
li ul { display:none; }
</style>
<script type="text/javascript">
function open_close( uid ) {
    var elt = document.getElementById( uid );
    if ( !elt ) return;
    if ( elt.style.display 'block' ) elt.style.display 'none';
    else elt.style.display = 'block';
}
</script>
HTML;

$dir = realpath(dirname(__FILE__));
listdir($dir);

exit;
?>

Tu vois... C'est toujours aussi simple : j'ai fait ça en 5 min! Bon j'ai qques années de PHP derière moi bien sûr.

Mais c'est pourquoi je refuse de travailler sur tes sources, car il est de ton ressort de comprendre mon exemple et de l'adapter à ton pb.

A toi de jouer !
0
cs_ThoMiNou Messages postés 9 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 3 août 2007
31 juil. 2007 à 10:04
Sauf que ca fait 4jours que je suis dessus et que j'en est un peu marre.. Bref c'est pas grave j'irai cherché ailleur.

Bye Merci.
0
Rejoignez-nous