8768 sujets

Développement web côté serveur, CMS

Bonjour,
Je souhaite afficher l'arborescence de mon site sur une page html.
Pour cela, j'ai commencé par créer le code html et css pour afficher les dossiers, sous-dossiers, fichiers ... Pas de problème pour cette partie Smiley murf
Pour lister tous les dossiers et fichiers, j'utilise php. Mon idée est d'avoir un script qui effectue le listing toutes les x du mois et enregistre le résultat dans un fichier json.
L'affichage du résultat sur la page html se fera avec du javascript en parcourant ce fichier json.
Voici le code php, je récupère tous les dossiers et fichiers et je cherche à les mettre dans leur dossier parent :

function listing($iter){
        $dir = array(); // Le tableau de retour
        $folder = false; // dossier en cours
        $prevDepth = 0; // Profondeur précédente du fichier
        foreach ($iter as $entry) {
            $pathName = $iter->getPathname(); // Le chemin complet
            $iter->getPath(); // Le dossier parent
            $filename = $entry->getBasename(); // Le nom du dossier / fichier
            $depth = $iter->getDepth(); // La profondeur du fichier
            // Si la profondeur du fichier actuel est < à la précédente alors on remonte d'un cran
            $prevDepth=($depth < $prevDepth)?$prevDepth-1:$depth;
            $folder =($depth===0)?array():$folder; // Si on revient au niveau 0, on reset $folder
            // Si c'est un dossier
            if ($entry->isDir()) {
                switch($depth){
                case 0 :
                    $dir[$filename]=array();
                    $folder[0] = $filename;
                    break;
                case 1 :
                    $folder[] = $filename;
                    $dir[$folder[0]][$filename]=array();
                    break;
                case 2 :
                    $folder[] = $filename;
                    $dir[$folder[0]][$folder[1]][$filename]=array();
                    break;
                // case 3, case 4, ... case n
                default: break;
                }
                
            }
            // Si c'est fichier
            else{
                switch($depth){
                case 0 :
                    $dir[$pathName] = $filename;
                    break;
                case 1 :
                    $dir[$folder[0]][$pathName]=$filename;
                    break;
                case 2 :
                    $dir[$folder[0]][$folder[1]][$pathName]=$filename;
                    break;
                // case 3, case 4, ... case n
                default: break;
                }
            }
        }
        return $dir;
    }

    $directory =dirname(dirname(__FILE__)); 
    $iter = new RecursiveIteratorIterator(
             new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::KEY_AS_FILENAME)
             , RecursiveIteratorIterator::SELF_FIRST);
    
    $dir = listing($iter);
    // Création du fichier json
    $txt = fopen('chemin ou l\'on souhaite mettre le fichier', 'w+');
    fwrite($txt, json_encode($dir));
    fclose($txt);

Alors voilà mon bout de code Smiley bawling Smiley bawling Smiley bawling
J'en suis pas du tout content, il marche approximativement et surtout ce n'est vraiment pas très joli.

Je viens vers la communauté d'alsacreations pour demander / implorer votre aide Smiley ravi
Des remarques, des pistes ou toutes autres formes de réponse sont les bienvenus ...
Merci beaucoup !
Modifié par renard13 (17 Jan 2016 - 21:50)
Modérateur
Bonjour,

Il existe des exemples tout fait. Par exemple là : http://php.net/manual/fr/function.scandir.php

<?php
function dirToArray($dir)
{
   $result = array();
   $cdir = scandir($dir);
   foreach ($cdir as $key => $value)
   {
      if (!in_array($value,array(".","..")))
      {
         if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
            $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
         else $result[] = $value;
      }
   }
   return $result;
}

$dir = "z";
$fileName = "z.txt";
file_put_contents($fileName,json_encode(dirToArray($dir)));
?>


Amicalement,
Modifié par parsimonhi (17 Jan 2016 - 23:01)
@parsimonhi, merci beaucoup pour ta réponse.
scandir fonctionne parfaitement.
Je voulais absolument utiliser la spl et la classe RecursiveDirectoryIterator du coup je n'ai même pas cherché d'autres solutions. Smiley biggol

Mais je ne jette pas l'éponge de réussir la même chose en utilisant RecursiveDirectoryIterator et getDepth pour obtenir l'arborescence d'un dossier.

Encore merci ta solution est parfaite. Pour ceux qui sont intéressés par la spl, un article intéressant :
http://julien-pauli.developpez.com/tutoriels/php/spl/?page=page_2#LII-D