em_aly: baumstruktur

hallo!

ich programmiere gerade einen file-browser in php.
ich will, das er so aussieht wie der windows-explorer, also so, dass er sich jedesmal aufklappt, wenn ich einen ordner anklicke.

wie löse ich das am besten?

  1. Hi,

    wie löse ich das am besten?

    da Du vermutlich nicht möchtest, dass bei jedem Klick eine neue Seite vom Server abgerufen wird, der eine Vielzahl Daten übergeben werden müssen, damit der aktuelle Zustand zugrundeliegend bleibt: Mit etwas clientseitigem. Ich würde hier zu Java tendieren, weil das ganze mit JavaScript vierfach programmiert werden müsste.

    Cheatah

    1. hi,
      es kann auch ruhig jedesmal eine neue seite aufgerufen werden...ich will nur php,javascript und natürlich html verwenden.

      1. Hi,

        es kann auch ruhig jedesmal eine neue seite aufgerufen werden...

        okay[1]. Und wo genau ist dann Dein Problem? Wenn es daran liegt, dass Du Rekursion noch nicht verstanden hast, empfehle ich Dir, zunächst einmal Rekursion zu verstehen ;-)

        Cheatah

        [1] Einige entscheidende Vor- und Nachteile wurden ja bereits genannt.

    2. Hi!

      Ich würde hier zu Java tendieren, weil das ganze mit JavaScript vierfach programmiert werden müsste.

      Was meinst du mit 4-fach??

      Grüße
      Andreas

      1. Hi,

        Ich würde hier zu Java tendieren, weil das ganze mit JavaScript vierfach programmiert werden müsste.

        Was meinst du mit 4-fach??

        document.all, document.layers, document.getElementById, non-DHTML.

        Cheatah

        1. Hallo

          Was meinst du mit 4-fach??

          document.all, document.layers, document.getElementById, non-DHTML.

          Bei geschickter Programmierung beschränkt sich die 4-fache Programmierung auf 4x3 Codezeilen.

          Ich denke nicht, dass dies bei einer solchen Sache ein Problem darstellt. Ich habe eine ähnliche Sache in JS umgesetzt mit ca. 600 Zeilen Code. Leider ist die Parametrisierung nicht gerade benutzerfreundlich. Ich stricke sporadisch an einem brauchbaren Interface, leider dauert das aber noch ein Weilchen.

          Grüsse
          Eisbär

  2. Hallo,

    ich will, das er so aussieht wie der windows-explorer,

    Warum? Denk dir doch mal was neues aus, was es noch nicht gibt :)

    also so, dass er sich jedesmal aufklappt, wenn ich einen ordner
    anklicke.

    wie löse ich das am besten?

    Am sinnvollsten serverseitig. Einfach deshalb, weil du nur so eine
    akzeptable Geschwindigkeit sicherstellen kannst -- es waere
    schliesslich ziemlich bloed, immer den kompletten Datei-Baum auslesen
    zu muessen.

    Ok, mal zur Umsetzung. Du definierst ein beliebiges Startverzeichnis.
    Dort liest du alle Dateien aus (ja, auch Verzeichnisse sind Dateien).
    Den stellst du dar, am besten in einer verschachtelten 'ol' (ordered
    list) oder 'ul' (unordered list) -- je nach dem, ob du die Eintraege
    sortierst oder nicht. Dann speicherst du das Verzeichnis (im
    Session-Environment oder im Query-String, bleibt sich gleich). Und
    jedesmal, wenn der User ein neues Verzeichnis aufklickt, musst du
    das neu hinzugekommene Verzeichnis zu der Verzeichnis-Liste (im
    Query-String oder Session-Environment) hinzufuegen und zusaetzlich
    zum Wurzel-Verzeichnis auslesen und darstellen. Ob ein Verzeichnis
    ein direktes Kind des vorherigen ist, kannst du problemlos pruefen,
    indem du es in seine Einzelpfade zerlegst und eine dementsprechende
    Struktur aufbaust. Beispiel: gegeben sind die Verzeichnisse

    • /
    • /html
    • /html/kruse
    • /html/kruse/htdocs
    • /html/nassi
    • /var

    Die entsprechende Datenstruktur saehe, in PHP formuliert, jetzt so
    aus:

    $dirs = Array(
      '/', Array(
        Array('/html',
          Array('/html/kruse'
            Array('/html/kruse/htdocs')
          ),
          Array('/html/nassi')
        ),
        Array('/var')
      )
    );

    Sieht kompliziert aus, ich weiss :) Ist aber letztenendes ganz
    einfach. Fuer jedes Kind-Verzeichnis legst du einen weiteren Array
    an, das als erstes Element sich selbst enthaelt. Alle folgenden
    Elemente sind Kind-Verzeichnisse des Kind-Verzeichnisses. Gibt es
    kein weiteres Kind-Verzeichnis, so hat der Array eben nur ein Element.

    Ich hoffe, ich hab mich nicht zu kompliziert ausgedrueckt.

    Gruesse,
     CK

    1. Hi!

      ich will, das er so aussieht wie der windows-explorer,

      Warum? Denk dir doch mal was neues aus, was es noch nicht gibt :)

      Ist doch für "normale" Windowsbenutzer einfacher wenn es wie bei Ihrem geliebten OS funktioniert!

      Am sinnvollsten serverseitig. Einfach deshalb, weil du nur so eine
      akzeptable Geschwindigkeit sicherstellen kannst -- es waere
      schliesslich ziemlich bloed, immer den kompletten Datei-Baum auslesen
      zu muessen.

      Wirklich? Ich denke gerade wegen der der Geschwindigkeit ist es doch besser z.B. Javascript zu verwenden, d.h. Deine Arrays... alles eine eingebundene Javascriptdatei zuschreiben, dann sind nämlcih alle Daten einmal auf dem Client, wenn DU nur ein eine Untermenü gehst hast Du die VErzeichnisse direkt alle zur Verfügung, das solte doch schneller gehen, oder?
      Ich bin bestimmt kein Javascript-Frund und da auch nicht wirklich talentiert, aber ich denke das es so schneller geht, als immer den Baum neu vom Server zu holen!

      Grüße
      Andreas

      1. Hallo,

        Ist doch für "normale" Windowsbenutzer einfacher wenn es wie bei
        Ihrem geliebten OS funktioniert!

        Wer sagt das?

        Wirklich? Ich denke gerade wegen der der Geschwindigkeit ist es doch
        besser z.B. Javascript zu verwenden, d.h. Deine Arrays... alles
        eine eingebundene Javascriptdatei zuschreiben, dann sind nämlcih
        alle Daten einmal auf dem Client, wenn DU nur ein eine Untermenü
        gehst hast Du die VErzeichnisse direkt alle zur Verfügung, das solte
        doch schneller gehen, oder?

        Nein. Denn es dauert eine ganze Zeit, den kompletten Datei-Baum
        auszulesen. Und nicht nur das: es belastet den Server unglaublich.
        Immer nur bestimmte Verzeichnisse (nicht rekursiv) auszulesen, ist
        sowohl ressourcen-schonender als auch schneller geschehen.

        Ich bin bestimmt kein Javascript-Frund und da auch nicht wirklich
        talentiert, aber ich denke das es so schneller geht, als immer
        den Baum neu vom Server zu holen!

        Man holt ja nur einen Teilbaum, nicht den ganzen.

        Gruesse,
         CK

        1. Hi Christian,

          Ist doch für "normale" Windowsbenutzer einfacher wenn es wie bei
          Ihrem geliebten OS funktioniert!

          Wer sagt das?

          die Usability ;-)

          Nein. Denn es dauert eine ganze Zeit, den kompletten Datei-Baum
          auszulesen.

          Das ist eine Sache der Datenstruktur und -menge, der Code-Präsentation, von Caching- und anderen Optimierungs-Mechanismen usw.

          Und nicht nur das: es belastet den Server unglaublich.

          Die Informationen bei n Requests mit n unterschiedlichen Fällen n Mal zu berechnen ist vermutlich deutlich ressourcenhungriger, als einen allgemeinen Fall entweder einmalig pro Session, oder sogar nur täglich oder noch seltener zu berechnen. Statische Daten kann man auslagern, bei dynamischen Berechnungen fällt das schon deutlisch schwerer.

          Der Vorteil der serverseitigen Variante ohne JavaScript liegt ganz einfach darin, dass es bei 100% der User funktioniert, was bei clientseitigen Techniken nie der Fall ist.

          Man holt ja nur einen Teilbaum, nicht den ganzen.

          Du weißt doch eigentlich sehr gut, dass (optimierte Programmierung vorausgesetzt) der Roundtrip das Teuerste an einer Client-Server-Architektur ist :-)

          Cheatah

    2. hallo,

      so weit war ich auch schon...nur muss ich das ja in eine tabelle setzen...mein größtes problem ist die anzeige der struktur....

      Hallo,

      ich will, das er so aussieht wie der windows-explorer,

      Warum? Denk dir doch mal was neues aus, was es noch nicht gibt :)

      also so, dass er sich jedesmal aufklappt, wenn ich einen ordner
      anklicke.

      wie löse ich das am besten?

      Am sinnvollsten serverseitig. Einfach deshalb, weil du nur so eine
      akzeptable Geschwindigkeit sicherstellen kannst -- es waere
      schliesslich ziemlich bloed, immer den kompletten Datei-Baum auslesen
      zu muessen.

      Ok, mal zur Umsetzung. Du definierst ein beliebiges Startverzeichnis.
      Dort liest du alle Dateien aus (ja, auch Verzeichnisse sind Dateien).
      Den stellst du dar, am besten in einer verschachtelten 'ol' (ordered
      list) oder 'ul' (unordered list) -- je nach dem, ob du die Eintraege
      sortierst oder nicht. Dann speicherst du das Verzeichnis (im
      Session-Environment oder im Query-String, bleibt sich gleich). Und
      jedesmal, wenn der User ein neues Verzeichnis aufklickt, musst du
      das neu hinzugekommene Verzeichnis zu der Verzeichnis-Liste (im
      Query-String oder Session-Environment) hinzufuegen und zusaetzlich
      zum Wurzel-Verzeichnis auslesen und darstellen. Ob ein Verzeichnis
      ein direktes Kind des vorherigen ist, kannst du problemlos pruefen,
      indem du es in seine Einzelpfade zerlegst und eine dementsprechende
      Struktur aufbaust. Beispiel: gegeben sind die Verzeichnisse

      • /
      • /html
      • /html/kruse
      • /html/kruse/htdocs
      • /html/nassi
      • /var

      Die entsprechende Datenstruktur saehe, in PHP formuliert, jetzt so
      aus:

      $dirs = Array(
        '/', Array(
          Array('/html',
            Array('/html/kruse'
              Array('/html/kruse/htdocs')
            ),
            Array('/html/nassi')
          ),
          Array('/var')
        )
      );

      Sieht kompliziert aus, ich weiss :) Ist aber letztenendes ganz
      einfach. Fuer jedes Kind-Verzeichnis legst du einen weiteren Array
      an, das als erstes Element sich selbst enthaelt. Alle folgenden
      Elemente sind Kind-Verzeichnisse des Kind-Verzeichnisses. Gibt es
      kein weiteres Kind-Verzeichnis, so hat der Array eben nur ein Element.

      Ich hoffe, ich hab mich nicht zu kompliziert ausgedrueckt.

      Gruesse,
      CK

      1. Hallo,

        so weit war ich auch schon...nur muss ich das ja in eine tabelle
        setzen...mein größtes problem ist die anzeige der struktur....

        Wo genau soll da das Problem liegen? Liegt es daran, dass du
        Rekursivitaet nicht begriffen hast? Liegt es an fehlenden
        HTML-Kenntnissen (Einrueckung, Wahl der Elemente, etc)? Glaskugel, wo
        bist du?!

        Gruesse,
         CK

  3. schaut euch mal das bild an...so weit bin ich jetzt schon...
    brauche hilfe!!!!

    hallo!

    ich programmiere gerade einen file-browser in php.
    ich will, das er so aussieht wie der windows-explorer, also so, dass er sich jedesmal aufklappt, wenn ich einen ordner anklicke.

    wie löse ich das am besten?

    1. Moin

      schaut euch mal das bild an...so weit bin ich jetzt schon...
      brauche hilfe!!!!

      Daraus lässt sich wunderbar erkennen, wo's fehlt ...
      In meiner Glaskugel steht wie bei den anderen grade etwas verschwommen "Rekursivität".
      Rekursive Funktionen sind Funktionen, die sich selbst aufrufen.

      Ich darf dazu etwas Lektüre empfehlen:
      http://diuf.unifr.ch/courses/info2b/Transparents/notes11-D.pdf

      Und noch mehr:
      http://www.google.de/search?sourceid=navclient&hl=de&querytime=WPRXjB&q=Rekursivit�t

      Ciao,

      Harry
       (der echte)