suit: Rekursive Verzeichnisauflistung (PHP, XHTML, CSS und jQuery)

Guten Tag: nachdem ich unbedingt einen entsprechenden Verzeichnisbaum für eine Website benötigt habe im Netz aber nichts Ansprechendes zu finden war, hab' ich auf die schnelle etwas geschrieben.

Wenn mich die Motivation packt gibt's ggf. noch einen Artikel der das ganze nochmal etwas beschreibt - z.B. wie man das Ding einfach erweitern kann.

Möglich ist etwa ein Drag&Drop um Verzeichnisse oder Dateien zu verschieben oder das Umbenennen einzelner Knoten.

Features:

  • Funktioniert soweit ich das beurteilen kann in allen gängigen Browsern
  • der IE6 hat eine 4-Zeilen-Krücke, damits zumindest ordentlich aussieht.
  • Mit aktiviertem JavaScript sind die Äste ausklappbar.
  • Datei-Symbole werden mit dem type-Attribut und Attribut-Selektor bestimmt

Wie auch immer: seht euch die Sache einfach an, bei Gefallen darf die Sache natürlich gerne (auch kommerziell) genutzt werden.

statisch es html (demo)
live mit PHP aus dem Verzeichnis generiert (demo)
Quelltexte (.tar.gz)

  1. Hello,

    Guten Tag: nachdem ich unbedingt einen entsprechenden Verzeichnisbaum für eine Website benötigt habe im Netz aber nichts Ansprechendes zu finden war, hab' ich auf die schnelle etwas geschrieben.

    Wenn mich die Motivation packt gibt's ggf. noch einen Artikel der das ganze nochmal etwas beschreibt - z.B. wie man das Ding einfach erweitern kann.

    gefällt mir schon ganz dolle :-)
    Hast leider nur noch einen gefährlichen Denkfehler im PHP-Teil drin:

    function get\_tree($dir = './') {  
    	$tree['dir'] = array();  
    	$tree['file'] = array();  
    	  
    	$handle = @opendir($dir);  
    	while(($file = @readdir($handle)) !== false) {  
    		if ($file != '.' && $file != '..') {  
    			$dir = preg\_replace('/^(.\*)\/+$/', '$1', $dir);  
    
    			$name = $file;  
    			$path = $dir . '/' . $file;  
    
    			if (is\_dir($path)) {  
    				$tree['dir'][] = array(  
    					'name' => $name,  
    					'type' => 'dir',  
    					'path' => $path,  
    					'data' => get\_tree($path)  
    				);  
    				  
    			} else if (is\_file($path)) {  
    				$tree['file'][] = array(  
    					'name' => $name,  
    					'type' => fileinfo($path),  
    					'path' => $path  
    				);  
    			}  
    		}  
    	}  
    	  
    	sort($tree['dir']);  
    	sort($tree['file']);  
    	return array\_merge($tree['dir'], $tree['file']);  
    }  
    

    Diese Funktion ist nicht linkfest. Das bedeutet, dass sie sich aufhängen wird, wenn ein Verzeichnislink auf eine höhere Verzeichnisebene verweist.

    Dies solltest Du auf jeden Fall korrigieren.

    1. Möglichkeit: Linkverfolgung unterdrücken
    2. Möglichkeit: Mit Sammelarray und Realpath() arbeiten und den (aufgelösten)
       Link nur dann verfolgen, wenn er nicht schon im Sammelarray enthalten ist.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      das sind wieder die Leute, die Tabs anstelle von Leerzeichen für die Formatierung benutzen *tztz*

      Mal sehen, ob es diesmal klappt:

        
          function get_tree($dir = './') {  
              $tree['dir'] = array();  
              $tree['file'] = array();  
        
              $handle = @opendir($dir);  
              while(($file = @readdir($handle)) !== false) {  
                  if ($file != '.' && $file != '..') {  
                      $dir = preg_replace('/^(.*)\/+$/', '$1', $dir);  
        
                      $name = $file;  
                      $path = $dir . '/' . $file;  
      ## z.B. so:  
                      if ( is_dir($path) and !is_link($path) )  
                      {  
                          $tree['dir'][] = array(  
                              'name' => $name,  
                              'type' => 'dir',  
                              'path' => $path,  
                              'data' => get_tree($path)  
                          );  
        
                      } else if (is_file($path)) {  
                          $tree['file'][] = array(  
                              'name' => $name,  
                              'type' => fileinfo($path),  
                              'path' => $path  
                          );  
                      }  
                  }  
              }  
        
              sort($tree['dir']);  
              sort($tree['file']);  
              return array_merge($tree['dir'], $tree['file']);  
          }  
        
      
      

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. Diese Funktion ist nicht linkfest. Das bedeutet, dass sie sich aufhängen wird, wenn ein Verzeichnislink auf eine höhere Verzeichnisebene verweist.

      Danke für die Info ;)

      To understand recursion, you must first understand recursion :p