Formular-Select mit Hierarchie aufbauen (aus PHP-Array)

Ja klar, die Sortierung ist Voraussetzung, da sonst auch die Dokumentstruktur nicht richtig wiedergegeben würde.
 
Ich seh noch nicht ganz wie das funktioniert. Mit $$parent und $$current ist nicht mehr ganz einfach lesbar für mich (ja, ich kenne die Schreibweise..).
...
Hallo,

wenn im Ausgangs-Array das ID-Element vom Aufzählungstyp ist und auch die Reihenfolge der Elemente in der Struktur kennzeichnet, dann ist faktisch alles sortiert. Das wäre also Voraussetzung für die Funktion des Scripts.

Kurz zur Funktion: Bei jedem Array-Durchlauf wird in $current der Variablenname angelegt, der aus Namenspräfix und Index besteht:
Code:
$current = 'element_id'.$element['id'];
Beim ersten Durchlauf ergibt sich also $current = 'element_id1' und in der Variablen $$current (hier gleichbedeutend mit $element_id1) wird der erste OPTION-Knoten angelegt.
Zur Ermittlung der Strukturtiefe dieses Knotens wird das PARENT-Array-Element ausgelesen und damit ggf. wieder ein Variablenname gebildet. Falls es sich dabei nicht um das Wurzelelement handelt, dann wird die Anzahl der Präfix-Strings gezählt und diese Anzahl inkrementiert.
Wichtig: Das PARENT-Element, auf das aktuell zugegriffen wird, muss im DOM-Dokument bereits existieren! Mit diesem Strukturtiefe-Wert wird dann die Größe des Präfix-Strings gesteuert.

Tut mir leid, dass ich erst jetzt darauf eingehe.
 
Irgendwie war ich mit dem gebastel nicht so zufireden. ich mag es nciht wenn man einen Code ein zweites mal braucht, dass man dann alles anpassen muss. Ergo musste eine Klasse her.
Das Resultat davon ist eine Klasse AdjacencyTree und AdjacencyTreeNode. Da steckt die ganze Logik drin. Wenn man anpassungen machen will (andere Sortierung, andere Ausgabetete) kann man einfach AdjacencyTreeNode ableiten und die entsprechende Funktion überschreiben.

http://wiki.yaslaw.info/wikka/PhpAdjacencyTreeClass

Ein Beispiel für eine komplexe Anwednung
PHP:
<?php
//Die AdjacencyTree-Klassen laden
include_once 'AdjacencyTree.php';
//$pdo als PDO-Objekt erstellen. Ich hab das hier mal ausgelagert
include_once '../../test/connectPDO.php';


/**
 * Beispiel für eine indiviudale Anwendung des Trees
 * Eine Ableitung der Node-Class bei der die Sortierung und der Ausgabetext geändert ist
 */
class AdjacencyTreeNode1 extends AdjacencyTreeNode{
   
    /**
     * TreeText der ausgegeben werden soll. In diesem Fall mit eienm Ball gefolgt von Pfeilen und dem TreeText
     * @see AdjacencyTreeNode::createTreeText()
     */
    protected function createTreeText(){
        $this->treeText = '&bull; ' . str_repeat('&rarr; ', $this->level) . $this->title;
    }
    /**
     * Sortierung innerhalb der Gruppen anhand der Parameter 'order' und 'title'
     * @param String     $sortParent    Sortierung des ParentNodes
     * @see AdjacencyTreeNode::setSortText()
     */
    protected function setSortText($sortParent){
        $this->sort = sprintf('%s.[%04d_%s]', $sortParent, $this->order, $this->title);
    }
}

//TreeObject erstellen
$tree = new AdjacencyTree('AdjacencyTreeNode1', 'root');

//Die Daten aus der DB laden
$sql = <<<SQL
    -- Sicherstellen dass die Felder gleich heissen wie die Properties der Node-Klasse,
    -- denn so können wir sie über PDO::fetchAll() einfach erstellen
    SELECT
        t.parent_id AS parentId,
        t.*
    FROM
        tbl_adjacency_tree AS t;
SQL;
$stmt = $pdo->prepare($sql);
$stmt->execute();

//und als AdjacencyTreeNode1-Objekte dem TreeObject übergeben
$tree->exchangeArray($stmt->fetchAll(PDO::FETCH_CLASS, 'AdjacencyTreeNode1'));

//Tree berechnen
$tree->calcTree();

//und ausgeben. In diesem Fall als Link
foreach($tree as $node){
    echo sprintf("<a href='%s' title='%s'>%s</a><br />\n", $node->value, $node->tooltip, $node->treeText);
}
?>
 
Zurück