11. juni 2009 - 22:07Der 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)) {
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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?
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
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.
Synes godt om
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
Synes godt om
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>"; }
Synes godt om
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 :)
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
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?
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.
Synes godt om
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.
Synes godt om
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>
Synes godt om
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>
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.