Moin,
ich verwende momentan ein aehnliches System in meinen Applikationen und habe es so geloest:
Es gibt eine Tabelle, in der das Nested Set definiert ist - das kennst du ja bereits.
Es gibt nun eine weitere Tabelle, welche auf Gruppenbasis (auch Benutzer sind Gruppen) Rechte zuweist. Dabei gilt: wenn nichts da ist, darf der Benutzer gar nichts.
Ich lese nun als erstes mit einem
Query alle IDs aus, die der Benutzer sehen darf (natuerlich in Abhaengigkeit seiner kompletten Benutzergruppen, das ist ein etwas haessliches Dingen). Anschliessend speichere ich es folgendermassen im Array:
Code:
while ($row = $
db->fetchrow($result)) {
$allowedNodes[$row['id']] = true;
}
Diese Loesung hat schonmal den Vorteil, dass du nicht mit in_array() pruefen musst sondern mit isset(), was natuerlich schneller funktioniert.
Anschliessend hol ich mir das Nested Set raus:
Code:
$
sql = 'SELECT * FROM nested_set ORDER BY left_id ASC';
$result = $
db->
query($
sql);
Hier verwende ich nicht eine Beschraenkung auf die ID, denn ein Benutzer soll ein Child nicht sehen, wenn er den Parent nicht sehen kann - egal wie die Zugriffsrechte aufs Child sind.
In einer Schleife pruefe ich dann die ganze Sache:
Code:
$treeNodes = array();
while ($row = $
db->fetchrow($result) {
if (isset($rightID)) {
if ($row['right_id'] < $rightID) {
continue;
}
else {
unset($rightID);
}
}
if (!isset($alloowedNodes[$row['id']])) {
$rightID = $row['right_id'];
continue;
}
// Restliche Verarbeitung
$treeNodes[] = $row;
}
Wenn ich nun auf einen Node stosse, welchen der Benutzer nicht sehen darf, speichere ich mir die Right-ID und ueberspringe saemtliche Nodes, deren Right-ID kleiner ist als die gespeicherte (die also unter diesem "unsichtbaren" Node liegen). Sobald ich auf den folgenden Node treffe, loesche ich die gespeicherte Right-ID wieder und arbeite normal weiter.
Mein Tipp: lass die Finger von rekursiven Dingen bei solchen Strukturen. Sobald der Baum groesser wird wirds richtig haesslich, und selbst bei kleinen Baeumen bombardierst du den Server mit Queries, fuer die er bei MyISAM erstmal die ganze Tabelle sperrt. Da kanns dann ganz schoen heiss hergehn
Greetz
alcaeus