Listen mit DB_NestedSet

“NestedSets” nennt man verschachtelte Datensätze,in SQL sind die relativ komplex zum Abbilden. Das Prinzip ist auf develnet.org schön erklärt.

Ich hab mich vor einer ziemlichen Weile mal entschieden, die PEAR-Klasse DB_NestedSet [1] von Daniel Khan zu nutzen. Die aktuelle Version ist 1.3.1. Was für mich nicht ganz optimal ist, dass bei der Klasse nur Output-Driver für Java-Script bestehen. Da mir das aber nicht passt, weil ich ganz normale Listen möchte, hab ich folgende kleine Funktion
geschrieben:

<?php
function makeList($root_id, $parent_id, $lft, $rgt, $level){
global $linkCats;
global $list;
if($rgt - 1 != $lft):
$list .= '<ul>'."n";
$children = $linkCats->getChildren($parent_id);
foreach($children AS $key=>$val):
$list .=' <li>';
$list .=$val->name;
$li++;
makeList($val->root_id, $val->id, $val->l, $val->r, $val->level);
$list .='</li>'."n";
endforeach;
if($val->order != "1"):
$list .= '</ul>'."n";
endif;
endif;
return $list;
}
?>


Das gibt mir jedenfalls eine XHTML-Strict konforme Liste zurück. Das Unschöne ist, dass ich dem Nested-Set-Prinzip widersprechend in Rekursion gehen muss und entsprechend Performance-lastig werden kann. Da ich die Resultate aber in ein File schreibe, muss ich das nur bei einer Änderung der Navigation laufen lassen.

An der Version 2 dürfte laut Daniel Khan ab Mai weiterentwickelt werden.

Als Alternative zu der PEAR-Klasse gibt es noch eine andere Klasse, die genau auf dem Prinzip der NestedSets in SQL beruht, wie es auf develnet.org [2] beschrieben ist. Arne Klempert hat dies ins Netz gestellt [3].

[1] http://oss.webcluster.at
[2] http://develnet.org/36.html
[3] http://klempert.de/php/nested_sets/

Leave a Reply

Your email address will not be published. Required fields are marked *