begin process at 2012 02 15 17:43:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Général

 > 

amélioration fonction / Tree View


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

amélioration fonction / Tree View

lundi 30 juillet 2007 à 10:22:54 | amélioration fonction / Tree View

ThoMiNou

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

[code]

<?
function niv_0($chemin0)
{
global  $tab_rep ;
$tab_rep[]="/";
$rep_0=@opendir($chemin0); 
   while($nomfichier=@readdir($rep_0))
  {
  if ($nomfichier !="." && $nomfichier !="..")// pour eviter le premier
     {
     if(!is_file($chemin0 . "/" . $nomfichier))
    {
    echo "<li id='foldheader'>$nomfichier </li>";
?>
<ul STYLE="margin-left: 1em" id="foldinglist" style="display:none" style=&{head};>
<?
$chemin1 = "$chemin0$nomfichier";
$tab_rep[] = $chemin1;
niv_1($chemin1);
echo"</ul>";
    }
   }// de if ($nomfichier !="."  pour eviter le premier
  }// de while($nomfichier 
//echo "</ul>";
closedir($rep_0);
//--------------------------------------------  
$rep_0=@opendir($chemin0);
 while($nomfichier=@readdir($rep_0))
  {
  if ($nomfichier !="." && $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 "</ul>";
}
//*********************************************************************************
function niv_1($chemin1)
{
global   $tab_rep ;
 $rep_1=@opendir($chemin1);
 while($nomfichier_1=@readdir($rep_1))
  {
  if ($nomfichier_1 !="." && $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++;
?>
<ul STYLE="margin-left: 1em" id="foldinglist" style="display:none" style=&{head};>
<?
$chemin2 = "$chemin1/$nomfichier_1";
$tab_rep[] = $chemin2 ;
niv_2($chemin2);
echo"</ul>";
    }
     }
  }
@closedir($rep_1);
//*******************************************************************************
$rep_1=@opendir($chemin1);
  while($nomfichier_1=@readdir($rep_1))
  {
  if ($nomfichier_1 !="." && $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 ;
$rep_2=@opendir($chemin2);
 while($nomfichier_2=@readdir($rep_2))
  {
  if ($nomfichier_2 !="." && $nomfichier_2 !="..")// pour eviter le premier
     {
      if(!is_file($chemin2."/".$nomfichier_2))
    {
    //$nb_indice = count($tab_rep);
    echo "<li id='foldheader'>$nomfichier_2 </li>";
?>
<ul STYLE="margin-left: 1em" id="foldinglist" style="display:none" style=&{head};>
<?
$chemin3 = "$chemin2/$nomfichier_2";
$tab_rep[] = $chemin3 ;
niv_3($chemin3);
echo"</ul>";
    }
     }
  }
closedir($rep_2);
//**************************************************
$rep_2=@opendir($chemin2);
  while($nomfichier_2=@readdir($rep_2))
  {
  if ($nomfichier_2 !="." && $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);
}

[/code]

Merci de votre aide.

lundi 30 juillet 2007 à 12:06:18 | Re : amélioration fonction / Tree View
lundi 30 juillet 2007 à 12:13:23 | Re : amélioration fonction / Tree View

ThoMiNou

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.

lundi 30 juillet 2007 à 13:26:09 | Re : amélioration fonction / Tree View

J_G

Réponse acceptée !
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 '<ul>';
    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 '</ul>';
}


// 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+

lundi 30 juillet 2007 à 14:34:18 | Re : amélioration fonction / Tree View

ThoMiNou

Merci en bidoullant un peu avec mon script js ca devrait le faire.

Bye.
lundi 30 juillet 2007 à 14:47:31 | Re : amélioration fonction / Tree View

ThoMiNou

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 .
lundi 30 juillet 2007 à 15:30:14 | Re : amélioration fonction / Tree View

J_G

Et.... tu veux quoi ?
lundi 30 juillet 2007 à 15:51:43 | Re : amélioration fonction / Tree View

ThoMiNou

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 :

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

<div id="treeview">
 <UL STYLE="margin-left: 2em"> <!-- premier decalage  -->
 <?
 echo "<LI ID='foldheader'>Projets</li>";
 ?>
 <ul STYLE="margin-left: 1em" id="foldinglist" style="display:none" style=&{head};>
 <?

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


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

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

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 )

lundi 30 juillet 2007 à 17:23:10 | Re : amélioration fonction / Tree View

ThoMiNou

      
En gros voila je veux l'aborescence du premier quand je click sur 'Projets' et pas celle ci-dessous. Rien ne vaut une image :)
                                         
lundi 30 juillet 2007 à 17:25:41 | Re : amélioration fonction / Tree View

J_G

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 '<ul id="'.$uid.'">';
    foreach ( $files as $file ) {
        if ( $file == '.' or $file == '..' ) continue;

        $fullpath = "$dir/$file";

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



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 !

1 2

Cette discussion est classée dans : while, tab, rep, eviter, nomfichier


Répondre à ce message

Sujets en rapport avec ce message

tri tableau 2 dimensions [ par lebobby ] Bonjour je voudrais savoir comment je pourrais faire pour trier ce tableau :$tab[0]=array("i"=>"23", "c" => "rge", "date" =>'2002-08-03 12:00:00');$ta ODBC connection occupé [ par pascalcargouet ] j'ai une connection ODBC pour attaque une base de type sql serveurMais j'ai une erreur à un moment de type "la connection est occupé avec des résultat mkdir et droits [ par elanspeech ] salut, dans ma page php, je fais la commande suivante : mkdir ("rep/", 0777); le repertoire est bien cree mais pas avec les bons droits.... j'obtiens prob de newbie [ par LeManchot ] bonjour, je debute en php, je mexcuse de poser une question qui doit vous paraitre trop conne mais ca fait 2 jours que javance pas. Voile Mon probleme Problème pour trier des données [ par WRom1 ] Bonjour à tous,J'ai un prb pour trier des données : je récupère le nom des fichiers d'un répertoire, et j'aimerai les classer par ordre alphabétique. Créer un repertoire et modifier un script [ par ElGaunt ] Bonjour à tous, Voila ci dessous un script dédié à autorier un visiteur à poster un commentaire. J'aimerais le modifier afin de pouvoir le mettre en p pb actualisation ds tab [ par kinooo ] J'ai utiliser des pseudo-frame (grace a un tableau) et mon menu et rechargé a chaque fois. comment fait on pour empecher la reactualistion de mon menu passage d'un tableau dans l'url [ par jbardet ] Bonjour,Je voudrais passer un tablo en parametre de mon url. J'ai trouvé des fonctions pour transformer mon tablo en string mais je dois encore faire Eviter un proxy [ par Dionysos33 ] Bonjour à tous,J'aimerais savoir s'il est possible de faire un page en php qui afficherait un autre site.Je m'explique : au boulot on a un proxy qui b Chmod [ par RockmanX ] Salut,j'ai un petit problèmevoici le code que j'utilise:$nomfichier = "tftsony.pdf";$chmod = "0664";chmod($nomfichier, $chmod);et voici l'erreur qu'on


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,803 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales