mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Sa 03.12.2016 18:58 Benutzername: Passwort: Auto-Login

Thema: [PHP] Multilevel-Menü aus der Datenbank kreieren vom 30.03.2005


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [PHP] Multilevel-Menü aus der Datenbank kreieren
Seite: Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter
Autor Nachricht
Waschbequen
Account gelöscht


Ort: -

Verfasst Do 21.04.2005 08:00
Titel

Antworten mit Zitat Zum Seitenanfang

XSchinkenX hat geschrieben:
jo und deshalb postest du auf ne php frage schrottigen c# code.

Lieber C#-Code gepostet, den er adaptieren kann, als alles dumm zugemüllt Ihre Erhabenheit. Zieh dir mal den Stock ausm Arsch.

Edit: Übrigens kann man das durchaus auch in dem Fall mit XML machen - wenn die Datenbank das direkt ausliefern kann. Aber MySQL ... har har


Zuletzt bearbeitet von am Do 21.04.2005 08:37, insgesamt 1-mal bearbeitet
 
Account gelöscht


Ort: -
Alter: -
Verfasst Sa 23.04.2005 19:29
Titel

Antworten mit Zitat Zum Seitenanfang

lieber n export selber machen oder ausm netz ziehen als wordhtml zu scheißen....

is ja auch egal, ich hab mal weitermacht. vllt. kann ja einer was damit anfangen, wird aber noch erweitert (vllt. übers wochenende schon...)

darüber hinaus habe ich noch sinnvolle codeschnippsel zu nested sets gefunden:
http://www.openwin.org/mike/presentations/hierarchy/hierarchical.pdf

xml:

Code:
<?xml version="1.0"?>
<navigations>
    <menu name="1">
        <level>
            <entry id="1" page="1">
                <name>Eintrag 1</name>
            </entry>
            <entry id="2" page="2">
                <name>Eintrag 2</name>
            </entry>
            <entry id="3" page="3">
                <name>Eintrag 3</name>
            </entry>
            <entry id="4" page="4">
                <name>Eintrag 4</name>
            </entry>
            <level>
                <entry id="5" page="4.1">
                    <name>Eintrag 4.1</name>
                </entry>
                <entry id="6" page="4.2">
                    <name>Eintrag 4.2</name>
                </entry>
                <level>
                    <entry id="7" page="4.2.1">
                        <name>Eintrag 4.2.1</name>
                    </entry>
                    <entry id="8" page="4.2.2">
                        <name>Eintrag 4.2.2</name>
                    </entry>
                </level>
            </level>
            <entry id="9" page="4.3">
                <name>Eintrag 4.3</name>
            </entry>
             <entry id="10" page="4.4">
                <name>Eintrag 4.4</name>
            </entry>
            <entry id="11" page="4.5">
                <name>Eintrag 4.5</name>
            </entry>
            <level>
                <entry id="12" page="4.5">
                    <name>Eintrag 4.5</name>
                </entry>
                <entry id="13" page="4.5">
                    <name>Eintrag 4.5</name>
                </entry>
                <entry id="14" page="4.5">
                    <name>Eintrag 4.5</name>
                </entry>
                <level>
                    <entry id="15" page="4.5">
                        <name>Eintrag 4.5</name>
                    </entry>
                </level>
                <entry id="16" page="4.5">
                    <name>Eintrag 4.5</name>
                </entry>
                <entry id="17" page="4.5">
                    <name>Eintrag 4.5</name>
                </entry>
                <entry id="18" page="4.5">
                    <name>Eintrag 4.5</name>
                </entry>
                <entry id="19" page="4.5">
                    <name>Eintrag 4.5</name>
                </entry>
            </level>
        </level>
    </menu>
</navigations>


php:

Code:
<?
/************************************************************/
/*              XML Menu 2005 von Schinken                  */
/*                                                          */
/*       PHP 5.0.3 Apache 2.0 DomXML + XPath enabled        */
/*                                                          */
/*                   Todo: - Errorhandling                  */
/*                         - Pflege der XML                 */
/************************************************************/
class xmlMenu
{

private $dom,
        $xpath,
        $lvl = 0,
        $offset,
        $htmlTree;

public function __construct()
{
    $this->dom = new domDocument;
    $this->dom->preserveWhiteSpace = false;
    $this->dom->load("menu.xml");
    $this->xpath = new DOMXPath($this->dom);
}

/**
 *  params: $mid        Menuid
 *          $link       einzufügender href="XY" link
 *          $params     array (
 *                          single  schalter für einzeleintrag TRUE|FALSE
 *                          id      id/pid des einzeleintrags/des teilbaums
 *                          offset  tiefe des teilbaums
 */

public function getTree($mid = FALSE,
                        $link = FALSE,
                        $params = array ("single" => FALSE,
                                         "id" => FALSE,
                                         "offset" => FALSE),
                        $node = FALSE,
                        $root = FALSE
                        )
                       
{
   
if (!$params["single"]) {
   
/* ---- Ganzen Baum inkl Startnode ausgeben ----*/
    if (!$node) {
       
        $this->lvl = 0;
        $this->offset = $params["offset"];
        $this->htmlTree = "<div class=\"menu{$id}\">";
       
        /* PID gegeben */
        if ($params["id"]) {
            $query = "descendant::entry[@id={$params["id"]}]/following-sibling::*";
            $node = $this->xpath->query($query);
           
            /* erster Sibling ist level */
            if ($node->item(0)->nodeName == "level") {
                $node = $node;
                $this->getTree($id, $link, FALSE, $node, $root = TRUE);
                 
            /* eintrag hat keine "Kindelemente" */
            } else {
                /* ... Errorhandling*/
            }
           
           
        /* ganzen Baum ausgeben */
        } else { 
            $query = "descendant::menu[@name={$mid}]";
            $node = $this->xpath->query($query);
           
            $node = $node->item(0)->childNodes;
            $this->getTree($id, $link, FALSE, $node);
           
        }
       
        $this->htmlTree .= "\n</div>";
        return $this->htmlTree;

/* ---- wird nur Ausgeführt, wenn nichts als $node übergeben wird, loop evtl. bis offset ----*/
    } else {
        foreach ($node AS $item) {
            if ($item->tagName == "level" && (!$this->offset || ($this->offset && $this->lvl < $this->offset))) {
                $this->lvl++;
                $einr = $this->einr();
                $this->htmlTree .= "\n{$einr}<ul class=\"menuLvl{$this->lvl}\">";
                $this->getTree(0, $link, FALSE, $item->childNodes);
                $this->lvl--;
                $this->htmlTree .= "\n{$einr}</ul>";
               
            }
            elseif ($item->tagName == "entry") {
                $einr = $this->einr();
                $this->htmlTree .= "\n{$einr}    <li>";
                $this->htmlTree .= $this->makeLink($item, $link);
                $this->htmlTree .= "</li>";
            }
        }       
    }

/* ---- Einzelnen Eintrag mit best. ID auswählen ----*/
} else {
    if ($params["id"]) { // Entry-Id vorhanden?
        $query = "descendant::entry[@id={$params["id"]}]";
        $item = $this->xpath->query($query);
        $item = $item->item(0);
       
        // Level des Eintrags mit XPath rausfinden
        $query = "descendant::entry[@id={$params["id"]}]/ancestor::level";
        $result = $this->xpath->query($query);
        foreach ($result AS $a) {
            $this->lvl++;
        }
        $this->htmlTree = "<div>".$this->makeLink($item, $link)."</div>";
        return $this->htmlTree;
    }
}
}

/* ---- Alle <entry> informationen zu nem Link verwurschteln ---- */
private function makeLink($item, $link)
{
$attr = $item->childNodes;
$page = $item->getAttribute("page");
foreach ($attr AS $b) {
    $str = "<a href=\"{$link}?page={$page}\" class=\"menuLvl{$this->lvl}\">{$b->nodeValue}</a>";
}
return $str;
}

/* ---- Einrückung der HTML Source ----*/
private function einr()
{
    $einr="";
    for ($i=0; $i<$this->lvl; $i++) {
        $einr.="    ";
    }   
    return $einr;
}
}


$menu = new xmlMenu;

/*** Beispiele ***/

echo $menu->getTree(1, "menu.php")."\n"; // Ganzen Baum von 1-n einlesen

echo "<hr />\n";

echo $menu->getTree(1, "menu.php", array("single" => TRUE, "id" => 7))."\n"; // einzelnen Eintrag mit geg. Id einlesen

echo "<hr />\n";

echo $menu->getTree(1, "menu.php", array("single" => FALSE, "id" => 11, "offset" => 1)); // Teilbaum mit geg. PID und Bereich (1 lvl) einlesen

echo "<hr />\n";

echo $menu->getTree(1, "menu.php", array("single" => FALSE, "id" => 11, "offset" => 2)); // Teilbaum mit geg. PID und Bereich (2 lvl) einlesen

?>


Zuletzt bearbeitet von am So 24.04.2005 09:48, insgesamt 1-mal bearbeitet
 
Anzeige
Anzeige
bennihaag

Dabei seit: 09.12.2005
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 09.12.2005 11:35
Titel

Antworten mit Zitat Zum Seitenanfang

muss den Thread mal ausgraben...

Wollte grad das Beispiel von XSchinkenX austesten wollen, leider kam mir aber folgender Fehler:

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in menue/index.php on line 13


Woran liegt das?


Thx schonmal vorab...
  View user's profile Private Nachricht senden
Waschbequen
Account gelöscht


Ort: -

Verfasst Fr 09.12.2005 11:42
Titel

Antworten mit Zitat Zum Seitenanfang

Wo du es schon ausgegraben hast: SQL Server 2005 rulez!

http://msdn2.microsoft.com/en-us/library/ms186243.aspx

Ätschebätsch * huduwudu! * *hehe* *zwinker*
 
gtz

Dabei seit: 15.04.2002
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Fr 09.12.2005 11:46
Titel

Antworten mit Zitat Zum Seitenanfang

ihre microsoft-apologese könnense sich getrost ans knie nageln.

edit: shice, ich wollt ja sietzen jetze.


Zuletzt bearbeitet von gtz am Fr 09.12.2005 11:46, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bennihaag

Dabei seit: 09.12.2005
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 09.12.2005 11:46
Titel

Antworten mit Zitat Zum Seitenanfang

d.h., des geht so nimmer?
  View user's profile Private Nachricht senden
Waschbequen
Account gelöscht


Ort: -

Verfasst Fr 09.12.2005 11:55
Titel

Antworten mit Zitat Zum Seitenanfang

gtz hat geschrieben:
ihre microsoft-apologese könnense sich getrost ans knie nageln.

edit: shice, ich wollt ja sietzen jetze.

Haha ... der Neid bringt dein Gesicht gleich zum Platzen mein Liebster. Zeig mir mal was im OS-Bereich, was rekursive Abfragen so einfach macht wie das. Finde da hat sich Microsoft mal wieder selbst übertroffen Grins

Btw.: das ganze steht auch in SQL Express zur Verfügung denke ich - und die DB ist übrigens komplett und ohne Performance-Einschränkungen umsonst nutzbar. Falls jemand interesse hat auf den Rechten Weg geführt zu werden, einfach PN an mich.

*ha ha*
 
gtz

Dabei seit: 15.04.2002
Ort: -
Alter: 41
Geschlecht: Männlich
Verfasst Fr 09.12.2005 12:09
Titel

Antworten mit Zitat Zum Seitenanfang

Waschbequen hat geschrieben:

der Neid bringt dein Gesicht gleich zum Platzen


ne, eigentlich nich. is keine besonders ausgeprägte eigenschaft meiner.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ähnliche Themen [PHP/MySQL] Datum aus Datenbank per PHP umwandeln
Bild Datenbank in PHP
PHP - Datenbank auswählen?
[PHP/MySQL] Datenbank auslesen.
[PHP] Verfallsdatum für Datenbank-Eintrag
Script in PHP für Bildupload in Datenbank
Neues Thema eröffnen   Neue Antwort erstellen Seite: Zurück  1, 2, 3, 4, 5, 6, 7, 8  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.