'home', 'parentId' => 'root', 'title' => 'Home', 'tooltip' => 'zurück zum Anfang', 'order' => '1', 'value' => null);
$list[] = array('id' => 'links', 'parentId' => 'root', 'title' => 'Links', 'tooltip' => 'meine Links', 'order' => '2', 'value' => null);
$list[] = array('id' => 1, 'parentId' => 'links', 'title' => 'yaslaw´s tolle Seite', 'tooltip' => 'gehe zu los, ohne..','order' => '1', 'value' => 'http://yaslaw.info');
$list[] = array('id' => 45, 'parentId' => 'links', 'title' => 'tutorials', 'tooltip' => null, 'order' => '2', 'value' => 'http://www.tutorials.de');
$list[] = array('id' => 'foo', 'parentId' => 'home', 'title' => 'Foo', 'tooltip' => null, 'order' => null, 'value' => 'foo');
$list[] = array('id' => 'bar1', 'parentId' => 'foo', 'title' => 'bar 1', 'tooltip' => null, 'order' => null, 'value' => 'bar');
$list[] = array('id' => 'bar2', 'parentId' => 'foo', 'title' => 'bar 2', 'tooltip' => 'noch ein bar', 'order' => 2, 'value' => 'bar');
/**
* Beispiel für eine indiviudale Anwendung des Trees
* Eine Ableitung der Node-Class bei der die Sortierung und der Ausgabetext geändert ist
* @author C754943
*
*/
class AdjacencyTreeNodeByName extends AdjacencyTreeNode{
//Geänderter Text
protected function setText(){
$this->text = '• ' . str_repeat('→ ', $this->level) . $this->title;
}
//Sortierung innerhalb der Gruppen anhand der Parameter 'order' und 'title'
protected function setSortText($sortParent){
$this->sort = sprintf('%sZZZ%04d%s', $sortParent, $this->order, $this->title);
}
}
//Tree erstellen
$tree = new AdjacencyTree('AdjacencyTreeNodeByName', 'root');
$usedKeys = array_flip(array('id', 'parentId', 'title'));
foreach($list as $item){
$tree->createNode($item['id'], $item['parentId'], $item['title'], array_diff_key($item, $usedKeys));
}
//Tree berechnen
$tree->calcTree();
//und ausgeben
foreach($tree as $node){
echo sprintf('%s
', $node->value, $node->tooltip, $node->text);
}
?>
nodeClass = $nodeClass;
$this->rootKey = $rootKey;
}
/**
* Hinzufügen eines Nodes. Es wird geprüft dass es ein Objekt der Klasse AdjacencyTreeNode ist.
* @see ArrayObject::append()
*/
public function append($value){
if(is_a($value, self::C_NODE_INTERFACE)) $this->offsetSet($value->id, $value);
}
public function exchangeArray($input){
foreach($input as $node){
$this->append($node);
}
}
/**
* Direktes Erstellen eines Nodes
* @param Integer $id ID des Nodes
* @param Integer $parentId ID des Parentnodes
* @param String $title Beschriftung
* @param Array $paramArray Ein assozierter Array mit weiteren Informationen für den Node
*/
public function createNode($id, $parentId, $title, $paramArray = null){
// $node = $this->nodeClass::create($id, $parentId, $title);
$node = call_user_func("\\MyBundleNamespace\\{$this->nodeClass}::create", $id, $parentId, $title);
if(is_array($paramArray)){
foreach($paramArray as $name => $value){
$node->$name = $value;
}
}
$this->append($node);
return $node;
}
/**
* Starte die Berechnung des Trees
*/
public function calcTree(){
//Den Tree aufbauen
$this->addTreeInfos($this->rootKey);
//und sortieren
$this->uasort(array($this, 'sortByNodeSort'));
}
/**
* Wird intern für die Sortirung gebraucht
*/
public static function sortByNodeSort($a, $b){
if ($a->sort == $b->sort) {
return 0;
}
return ($a->sort < $b->sort) ? -1 : 1;
}
/**
* Dei rekursive Funktion für die Treeberechnung
* @param Integer $parentId ID des Parentnodes
* @param String $sortParent Sortierung des ParentNodes
* @param Integer $level Level dieses Nodes
*/
private function addTreeInfos($parent, $sortParent = '', $lvl = 0){
$iter = $this->getIterator();
foreach($iter as $key => &$node){
if((string) $node->parentId == (string) $parent){
$node->addTreeInfos($sortParent, $lvl);
//Und dasselbe für alle Kinder des aktellen Nodes
$this->addTreeInfos($node->id, (string)$node->sort, $lvl+1);
}
}
}
}
/**
* Interface der Node-Class
* Wird verwendet wenn man eine eigene Klasse schreiben will
*/
interface IAdjacencyTreeNode{
/**
* Konstruktor
* @param Integer $id ID des Nodes
* @param Integer $parentId ID des Parentnodes
* @param String $title Beschriftung
*/
public static function create($id, $parentId, $title);
/**
* TreeInfos des Nodes erstellen
* @param String $sortParent Sortierung des ParentNodes
* @param Integer $level Level dieses Nodes
*/
public function addTreeInfos($sortParent, $level);
}
/**
* Ein einzelner Node des Trees
* Um die Reihenfolge und/oder die TreeTexte zu verändern muss dies in dieser Klasse getan werden
*/
class AdjacencyTreeNode implements IAdjacencyTreeNode{
private $id;
private $parentId;
private $title;
private $sort;
private $level;
private $text;
private $order;
/**
* Konstruktor
* @param Integer $id ID des Nodes
* @param Integer $parentId ID des Parentnodes
* @param String $title Beschriftung
*/
public static function create($id, $parentId, $title){
$instance = new AdjacencyTreeNode();
$instance->id = $id;
$instance->parentId = $parentId;
$instacne->title = $title;
return $instance;
}
/**
* TreeInfos des Nodes erstellen
* @param String $sortParent Sortierung des ParentNodes
* @param Integer $level Level dieses Nodes
*/
public function addTreeInfos($sortParent, $level){
$this->level = $level;
$this->setSortText($sortParent);
$this->setText();
}
/**
* Setzt den TreeText des Nodes
*/
protected function setText(){
$this->text = str_repeat('-- ', $this->level) . $this->title;
}
/**
* Setzt den Sort-Value. In diesem Fall nach id
* @param String $sortParent Sortierung des ParentNodes
*/
protected function setSortText($sortParent){
$this->sort = sprintf('%s.%04d', $sortParent, $this->id);
}
/**
* generic Getter & Setter
*/
public function __set($name, $value){$this->$name = $value;}
public function __get($name){
//Falls ein Parameter fehlt, diesen mit NULL zurückgeben und jeden Fehler ignorieren
$errLvl = error_reporting();
error_reporting(0);
$retVal = $this->$name;
error_reporting($errLvl);
return $retVal;
}
}
?>