php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 24-03-2012, 14:23
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard Rekursive Navigation springt zurück

Guten Morgen zusammen

Ich bin dabei eine Funktion zu programmieren, welche eine Navigation aus einem Verzeichnis erzeugt. Dieses wird mit dem Funktionsaufruf mitgegeben.
Wenn ich auf eine Ebene klicke übergebe ich mit GET den Pfad, worauf geklickt wurde.

Mein Problem ist: Sobald ich auf die 2 Ebene klicke, woraus die 3. Ebene aufgehen sollte, bin ich wieder auf der ersten. Der Pfad wird jedoch richtig übergeben.
Also z.B.
1. Ebene --> Verwaltung
2. Ebene --> Organigramme
3. Ebene --> Informatik

Also um nochmals zu erläutern: Wenn ich auf Verwaltung klicke gehen die Unterordner korrekt auf, jedoch wenn ich jetzt auf Organigramme klicke übergibt er mir zwar den Pfad korrekt, springt aber wieder zurück zur Ausgangsposition und schliesst alle Untermenüs.

Hier mal mein Code:

PHP-Code:
<?php 
function navigation_rekursiv($verzeichnis

    
$handle =  opendir($verzeichnis); 
    while (
$datei readdir($handle)) 
    { 
        if (
$datei != "." && $datei != ".."
        { 
            if (
is_dir($verzeichnis."/".$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist 
            

                echo 
"<a href=\"./Startseite.php?l=$verzeichnis$datei\">$datei</a><br>";
                
                if (isset(
$_GET['l'])) {
                    if (
$verzeichnis.$datei == $_GET['l']) {
                        
navigation_rekursiv($verzeichnis.$datei.'/');
                    }
                }
            }
            else
            { 
                
// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
                
echo "<a href=\"./Startseite.php?l=$datei\">$datei</a><br>";
            }            
        }
    }
        
    
closedir($handle); 
}
navigation_rekursiv("./Inhalt/"); 
?>
Sieht jemand meinen Fehler??? Bin jetzt schon seit gestern dran und bekomms nicht raus..
Ich bin mir nicht sicher, aber müsste ich nicht die Funktion ein drittes mal aufrufen für die 3. Ebene? Nur wo?

MFG derLehrling
Mit Zitat antworten
  #2 (permalink)  
Alt 24-03-2012, 15:53
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Willkommen im Forum.

Das Problem lässt sich sicher auch so sehen, aber es würde dennoch immens helfen, wenn du deine Verzeichnisstruktur mit angeben könntest.

Die hast eben nur du vor dir.

Edit: Na gut, steht da im Grunde. Ich habe gepennt.

PHP-Code:
            if (isset($_GET['l'])) {
                if (
$verzeichnis.$datei === substr($_GET['l'], 0strlen($verzeichnis.$datei))) {
                    
navigation_rekursiv($verzeichnis.$datei.'/');
                }
            } 
Ist aber wohl mehr ein Hack.

Geändert von mermshaus (24-03-2012 um 16:07 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 24-03-2012, 16:02
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

Dankeschön und auf eine gute Zeit

Also meine Ordnerstruktur hat maximum 3 Ebenen. Also spätenstens bei der 3. Ebene müssen es Files sein.
Der Gesamte Inhalt ist im Ordner Inhalt abgelegt.
Dieser hat folgenden Inhalt(was für ein wortspiel ):

Allgemein
Abkuerzungen.pdf
Aufbewahrungfristen.pdf
Telefonlisten intern.pdf
Verwaltung
Abkuerzungen.pdf
Funktionendiagramme
Bauabteilung.pdf
Informatik.pdf
Verwaltung.pdf
Bauabteilung
File Upload
Informatik
Links


Also das ist jetzt nicht 100% identisch, das würde noch ein wenig dauern.. Aber wenn ich es richtig verstehe gehts einfach prinzipiell um den Aufbau?
Mit Zitat antworten
  #4 (permalink)  
Alt 24-03-2012, 16:03
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Willkommen im Forum.

Das Problem lässt sich sicher auch so sehen, aber es würde dennoch immens helfen, wenn du deine Verzeichnisstruktur mit angeben könntest.

Die hast eben nur du vor dir.

Edit: Na gut, steht da im Grunde. Ich habe gepennt.

oh shit und ich hab das zu spät gesehen
Mit Zitat antworten
  #5 (permalink)  
Alt 24-03-2012, 16:08
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Ja, macht nichts. Ich habe deine Posts auch nicht gesehen. Schau dir aber noch mal meinen ersten Post an.
Mit Zitat antworten
  #6 (permalink)  
Alt 24-03-2012, 16:25
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

Erstens: Vielen dank für deine Hilfe! Hat also das funktioniert.

Kannst du mir evtl noch erklären was du da genau machst?

Wenn ich es richtig verstehe: Du schneidest vom GET Parameter den letzten Teil ab, und Vergleichst ihn mit dem Wert der beim Funktionsaufruf übergeben wurde und dem neuen Handle?
Ist diese Bedingung erfüllt rufen wir die Funktion nun auf.
Mit Zitat antworten
  #7 (permalink)  
Alt 24-03-2012, 16:26
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

ah und wieso hack?
Mit Zitat antworten
  #8 (permalink)  
Alt 24-03-2012, 16:46
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

Gibt es jetzt eine Möglichkeit die verschiedenen Ebenen einzeln anzusprechen? Nicht oder?

Die 2. und 3. Ebene müsste man ja ein wenig einrücken, der Übersicht halber. Das ist so wie ich es jetzt habe nicht möglich oder?
Mit Zitat antworten
  #9 (permalink)  
Alt 24-03-2012, 17:24
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Mit Hack meine ich, dass die Lösung nicht besonders sauber und nicht vollständig durchdacht ist.

Ein Problem ist etwa, dass die Bedingung auch erfüllt ist, wenn der aktuelle Pfad „path“ lautet, und in $_GET['l'] etwa „patha“ steht. Das ist ein anderes Verzeichnis, erfüllt aber die Substring-Bedingung. Da müsste noch geprüft werden, ob das nächste Zeichen in $_GET['l'] ein Slash ist oder ob der String beendet ist.

So was „ordentlich“ zu schreiben, ist gar nicht so leicht.

PHP-Code:
function navigation_rekursiv($path$activePath$depth 0)
{
    
$path rtrim($path'/');

    
$ret = array();

    
$ret[] = array(
        
'depth' => $depth,
        
'path'  => $path,
        
'title' => basename($path)
    );

    if (
        
is_dir($path)
        && 
$path === substr($activePath0strlen($path))
        && 
in_array(substr($activePathstrlen($path), 1), array(false'/'))
    ) {
        
$handle opendir($path);

        while (
$datei readdir($handle)) {
            if (
$datei === '.' || $datei === '..') {
                continue;
            }

            
$ret array_merge(
                
$ret,
                
navigation_rekursiv($path '/' $datei$activePath$depth 1)
            );
        }

        
closedir($handle);
    }

    return 
$ret;
}

$rootPath './Inhalt';

if (!isset(
$_GET['l'])) {
    
$_GET['l'] = '';
}

$entries navigation_rekursiv($rootPath$_GET['l'], 0);

foreach (
$entries as $entry) {
    echo 
str_repeat('&nbsp;'$entry['depth'] * 4)
       . 
'<a href="./Startseite.php?l=' $entry['path'] . '">' $entry['title'] . '</a><br />';

Eigentlich müsste man eine Baumstruktur aufbauen.

Geändert von mermshaus (24-03-2012 um 17:35 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 24-03-2012, 18:16
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

also erst mal wow! was du da aus meinem einfach code gemacht hast ist für mich wirklich erstaunlich..

Nun wärst du so gütig und würdest mir das erklären? Weil ich müsste ja noch selber anpassen..

ich bin noch in der ausbildung, kann zwar schon einiges, aber das ist sehr hohes niveau und übersteigt meinen jetzigen horizont..!
Mit Zitat antworten
  #11 (permalink)  
Alt 24-03-2012, 18:24
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Was verstehst du denn konkret nicht?
Mit Zitat antworten
  #12 (permalink)  
Alt 24-03-2012, 18:44
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

ok ich bin jetzt mal ein wenig schritt für schritt durchgegangen und langsam komm ich dahinter.

geh ich richtig in der annahme das du keinen unterschied in der behandlung von verzeichnisen und dateien machst?
Mit Zitat antworten
  #13 (permalink)  
Alt 24-03-2012, 21:59
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Ja, kann man so sagen. Das wird derzeit nur dort beachtet, wo es darum geht, zu entscheiden, ob Rekursion durchgeführt wird. Du könntest aber den Datensätzen in der Rückgabe (den einzelnen assoziativen Arrays) auch problemlos noch ein Feld 'is_file' => is_file($path) mitgeben und bei der Ausgabe entsprechend auslesen und je nach Wunsch eine andere Formatierung wählen.

Wesentlich bei meinem Ansatz ist die Trennung von der Ermittlung der Daten und der tatsächlichen Ausgabe (Kapselung, EVA-Prinzip). Bei mir ist klar definiert, welche Eingaben die Funktion erhält und welche Ausgabe sie liefert. Es gibt keine Seiteneffekte wie die Ausgabe innerhalb der Funktion und es wird auch nicht auf globale Variablen ($_GET) zugegriffen. Die Funktion kennt nur das, was ihr beim Aufruf übergeben wird. Das gestattet weitreichende und einfache Wiederverwendbarkeit des Codes, da er auch in Umgebungen einsetzbar ist, die nicht auf $_GET['l'] setzen und die nicht gleich an der Stelle des Aufrufs eine Ausgabe wünschen.

Dass ich den eigentlich Code zur Durchführung der Rekursion so umgeschrieben habe, dass jeder Aufruf definitiv ein Element („sich selbst“) zurückliefert, ist nicht zwangsläufig objektiv besser. Ich habe das gemacht, weil es erfahrungsgemäß gut ist, wenn Baumstrukturen ein einziges Wurzelelement haben.

Das muss jetzt keinen Sinn ergeben. Ich sage ja, es ist kompliziert, so was „ordentlich“ zu machen. Poste vielleicht später noch mehr dazu. Das deckt sich gerade mit etwas, das auch für mich interessant ist.
Mit Zitat antworten
  #14 (permalink)  
Alt 25-03-2012, 15:20
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Ja, kann man so sagen. Das wird derzeit nur dort beachtet, wo es darum geht, zu entscheiden, ob Rekursion durchgeführt wird. Du könntest aber den Datensätzen in der Rückgabe (den einzelnen assoziativen Arrays) auch problemlos noch ein Feld 'is_file' => is_file($path) mitgeben und bei der Ausgabe entsprechend auslesen und je nach Wunsch eine andere Formatierung wählen.
Also die Dateien werden ja mit Dateipfad übergeben, also kann ich das so in meinem Content-Bereich einfliessen lassen. Werd ich aber wenn ich ein wenig mehr Zeit habe probieren! Wär evtl. spannend um ein Datei/Ordnersymbol vor den Link zu setzten um ein wenig zu verdeutlichen was es ist..

Zitat:
Das muss jetzt keinen Sinn ergeben.
doche ergibt sinn! ist zwar nicht einfach zu verstehen, aber es geht immer besser!

also was ich jetzt gemacht habe: ich hab es so geändert das dass root verzeichnis nicht mehr ausgegeben wird. ob es elegant ist weiss ich nicht, das würd ich jetzt gerne von dir wissen
PHP-Code:
if (!isset($_GET['l'])) {
    
$_GET['l'] = './Inhalt/';
}

$entries navigation_rekursiv($rootPath$_GET['l'], 0);

foreach (
$entries as $entry) {
    if (
$entry['path'] != './Inhalt'){
    echo 
str_repeat('&nbsp;'$entry['depth'] * 4)
       . 
'<a href="./Startseite.php?l=' $entry['path'] . '">' $entry['title'] . '</a><br />';
    }

also ein paar fragen hab ich noch, wenn das ok für dich ist..
mir ist noch nicht ganz klar wie du auf die 3. ebene kommst. machst du das mit diesem Aufruf?
PHP-Code:
$ret array_merge(
                
$ret,
                
navigation_rekursiv($path '/' $datei$activePath$depth 1)
            ); 
bei der ersten if abfrage ist mir nicht klar wozu du die dritte bedingung hast? wieso braucht es die?

nun nur noch etwas: was ich gerade am probieren ist, lange dateinamen beim Zeilenumbruch auf gleicher Höhe zu halten. Hast du einen Tipp für mich?

Einen schönen Nachmittag & bis später!
Mit Zitat antworten
  #15 (permalink)  
Alt 11-04-2012, 09:40
Lehrling1991
 Registrierter Benutzer
Links : Onlinestatus : Lehrling1991 ist offline
Registriert seit: Mar 2012
Beiträge: 20
Lehrling1991 befindet sich auf einem aufstrebenden Ast
Standard

Hei Mermshaus

Möchte nur nochmal Zaghaft nachfragen Bin gerade verzweifelt am Probieren die Zeilenumbrüche auch einzurücken, aber bis jetzt kein Erfolg in Sicht..

Mfg Lehrling1991
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
navi springt jhaustein HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 6 20-08-2008 18:14
Programm springt in falsche If Abfrage Gonzo01 Archiv / Trash 5 11-01-2007 14:37
Php-Chat und Scrollbalken springt Teelicht Off-Topic Diskussionen 0 24-10-2006 09:26
Zeit springt! Son PHP Developer Forum 9 25-04-2006 22:26
Wiso springt esa zurück? jessi PHP Developer Forum 3 12-07-2001 13:52

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 07:22 Uhr.