Avatar billede jammerlab Nybegynder
11. juni 2009 - 22:07 Der er 14 kommentarer og
1 løsning

Treeview

Hej derude...

Sidder og arbejder på at lave et treeview i php. Jeg kommer fint igennem mapperne ved at kalde en recursive funktion i min class... men jeg kan simpelthen ikke få det samlet i et array som har samme struktur.

Er der nogen derude som evt. har noget lignende kode liggende? - eller som vil kunne hjælpe mig med mit nuværende rod?

-----------------

class FileView {

    private $html = '';
    private $dirs = array();
   
    public function traverse_dir($dir) {
        $directories = array();

        if ($handle = opendir($dir)) {
            while (($file = readdir($handle)) !== false) {
                    if (($file != "." && $file != "..")) {
                  if(is_dir($dir. '/' . $file)) {
                     
                      $folders = explode("/", $dir. '/' . $file);
                      $directories[] = $file;

                      $count = count($folders);
                      $count = $count - 3;
                      echo $folders[$count];

                      if(substr_count($dir, "/") != 0) {
                          $test = substr(strrchr($dir, "/"), 1);
                          $this->dirs[$folders[$count]][$test][$file] = array();
                      } else {
                          $test = $dir;
                          $this->dirs[$test][$file] = array();
                      }
                        }
                }
                }
            closedir($handle);
        }
      foreach($directories as $key) {
        $this->html = $this->html . ' ' . $key;
        $this->traverse_dir($dir .'/'. $key);
      }
    }   
}


$FileView = new FileView;
$FileView->traverse_dir("level1");
Avatar billede Slettet bruger
11. juni 2009 - 22:34 #1
Jeg har før oplevet, at PHP har problemer med at håndtere arrays i arrays, så måske skulle du simpelthen lave et dynamisk aspekt til klassen, så den kan anvendes i stedet?
Avatar billede jammerlab Nybegynder
11. juni 2009 - 22:43 #2
Jeg har lavet noget andet kode som kan vise mit treeview ud fra en struktur som vist forneden... jeg vil gerne undgå et array men kan ikke rigtigt se hvordan jeg ville kunne gøre det uden :S

<ul id="browser" class="filetree treeview-famfamfam">
                        <li class="closed"><span class="folder">Folder 1</span>
                            <ul>
                                <li class="closed"><span class="folder">Item 1.1</span>
                                    <ul>
                                        <li><span class="file">Item 1.1.1</span></li>
                                    </ul>
                                </li>
                                <li class="closed"><span class="folder">Folder 2</span>
                                    <ul>
                                        <li class="closed"><span class="folder">Subfolder 2.1</span>
                                            <ul id="folder21">
                                                <li><span class="file">File 2.1.1</span></li>
                                                <li><span class="file">File 2.1.2</span></li>
                                            </ul>
                                        </li>
                                        <li class="closed"><span class="folder">Subfolder 2.2</span>
                                            <ul>
                                                <li><span class="file">File 2.2.1</span></li>
                                                <li><span class="file">File 2.2.2</span></li>
                                            </ul>
                                        </li>
                                    </ul>
                                </li>
                                <li class="closed"><span class="folder">Folder 3</span>
                                    <ul>
                                        <li><span class="file">File 3.1</span></li>
                                    </ul>
                                </li>
                                <li><span class="file">File 4</span></li>
                            </ul>
                        </li>
                    </ul>


----


Folder 1

    *
      Item 1.1
          o Item 1.1.1
    *
      Folder 2
          o
            Subfolder 2.1
                + File 2.1.1
                + File 2.1.2
          o
            Subfolder 2.2
                + File 2.2.1
                + File 2.2.2
    *
      Folder 3
          o File 3.1
    * File 4
Avatar billede Slettet bruger
11. juni 2009 - 22:48 #3
Så du vil gerne have genereret en streng direkte og altså ikke først samle dataen i arrays, klasser o.l.?
Avatar billede jammerlab Nybegynder
11. juni 2009 - 22:52 #4
Nej det skal bare outputtes i html'en så klarer jeg resten med javascripten... så ja til en streng :) det er bare at få det hele til at passe så strengen bliver lavet så mapperne kommer ind under hinanden... jeg midster fuldstændigt overblikket når jeg sidder og prøver at få den til det...

Det var bare lettere for mig i mit hovedet at lave array strukturen og så ville jeg foreache det senere med henblik på at lave den html struktur.
Avatar billede Slettet bruger
11. juni 2009 - 23:03 #5
Ja, det kan jeg godt forstå, men med lidt fiksfakserier kan det meste gøres overraskende enkelt :) Prøv at anvende en gennemgående variabel til nuværende niveau... Her er lidt pseudokode:

function FindSubDirs($dir)
{
$myDirArray = find_dirs_here;
$myFileArray = find_files_here;
$return = "<ul>";
for each $myFileArray
  $return .= "<li>".$the_current_file_name."</li>";
for each $myDirArray
  $return .= "<li>".FindSubDirs($dir)."</li>";
return $return."</ul>";
}

// Så kalder du bare
FindSubDirs("dit_direktorie");

Det burde virke :P
Avatar billede Slettet bruger
11. juni 2009 - 23:04 #6
Rettelse:

function FindSubDirs($dir)
{
$myDirArray = find_dirs_here;
$myFileArray = find_files_here;
$return = "<ul>";
for each $myFileArray
  $return .= "<li>".$the_current_file_name."</li>";
for each $myDirArray
  $return .= "<li>".FindSubDirs($the_current_dir)."</li>"; // Her er rettelsen
return $return."</ul>";
}
Avatar billede Slettet bruger
11. juni 2009 - 23:06 #7
"Prøv at anvende en gennemgående variabel til nuværende niveau"
Næh, det undlod jeg egentlig. Det er også mere, hvis du selv vil formattere niveauinddelingen :)
Avatar billede jammerlab Nybegynder
11. juni 2009 - 23:09 #8
Altså det er faktisk kun directories den skal vise... ikke engang filer...
Avatar billede jammerlab Nybegynder
11. juni 2009 - 23:43 #9
Nej jeg kan simpelthen ikke se det for mig :S ... nu for jeg listet mapperne ud i html'en som vi gerne vil... men kan simpelthen ikke forstå hvordan jeg kan få dem grupperet ind under hinanden



    * level_2
    * level_3
    * level_4
    * level_5
    * level_2_2
    * level_2_3
    * hdghj


sådan står de nu..

en mappe kan jo ligge under et uendeligt antal sub directories... dem finder jeg sådan set med min kode da jeg løber dirsne igennem med en recursive funcktion... men hvordan jeg for det hele skrevet ud så den holder strukturen forstår jeg ikke. Når den finder en mappe og går ind i den så kan jeg ikke se hvordan den ved at det den finder skal den vise som en undermappe til den... meget forvirrende hehe :) mulighed for at hjælpe yderligere?

      foreach($directories as $key) {
        $this->html = $this->html . ' <li class="closed"><span class="folder">' . $key . '</span></li>';
        $this->traverse_dir($dir .'/'. $key);
      }

her løber jeg de mapper igennem jeg finder i en pågælende mappe... og funktionen  $this->traverse_dir bliver så kaldt igen for at lede videre i den mappe... på den måde kommer den ned igennem mappe strukturen.
Avatar billede Slettet bruger
11. juni 2009 - 23:56 #10
Ok, det kan godt være lidt svært at begribe, så jeg forklarer lige teorien.

Forresten manglede jeg rent faktisk at tilføje selve mappernes dirs til de viste strenge i tidligere pseudokode :)

Anyway, du ønsker for hver dir at gennemløbe underdir. Dette repræsenteres ved at gå et niveau ind i visningen, hvilket let gøres med <ul>indhold</ul>. Altså er følgende muligt:

function funk(sti)
{
start strengen med at skrive "<li>sti<ul>" - det starter et nyt li-element (listepunkt) i den sidst oprettede ul (liste) og starter en ul til underelementerne;
for hver mappe under denne sti
  tilføj det samlede resultat fra det næste kald - funktion(den_aktuelle_undermappes_sti) - til strengen;
tilføj </ul></li> til strengen for at afslutte først listen over undermapper (ul) og derefter punktet for den mappe det nuværende kald arbejder med (il);
return strengen;
}

Så skriver du bare <ul>funk(sti)</ul> - du starter altså manuelt første punktniveau (ul), og resten følger med det rekursive kald.
Avatar billede Slettet bruger
12. juni 2009 - 00:03 #11
Bemærk dog, at ovenstående resulterer i, at der oprettes lister med undermapper til alle mapper - altså også dem uden egne undermapper. Dvs.:

- A
  - C
    (tom)
- B
  (tom)

Giver:

<ul>
  <li>
    A
    <ul>
      <li>
        C
        <ul> // Denne og nedenstående er overflødige, da C ikke har undermapper
        </ul>
      </li>
    </ul>
    B
    <ul> // Denne og nedenstående er overflødige, da B ikke har undermapper
    </ul>
  </li>
</ul>
Avatar billede Slettet bruger
12. juni 2009 - 00:04 #12
En lille rettelse:

<ul>
  <li>
    A
    <ul>
      <li>
        C
        <ul> // Denne og nedenstående er overflødige, da C ikke har undermapper
        </ul>
      </li>
    </ul>
  </li>
  <li>
    B
    <ul> // Denne og nedenstående er overflødige, da B ikke har undermapper
    </ul>
  </li>
</ul>
Avatar billede jammerlab Nybegynder
27. august 2010 - 23:10 #13
hf2ke> smid et svar tak :)
Avatar billede Slettet bruger
27. august 2010 - 23:53 #14
Okaj... Det er også ved at være et gammelt spørgsmål!
Avatar billede jammerlab Nybegynder
28. august 2010 - 09:32 #15
Præcis :) Også derfor det skal lukkes nu hehe
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester