hi everybody!
i try to make a clickable menu. it should be outputed as XML. i found a
solution to make it possible to decend only the selected menues. but is
there a easier solution?
my goal is to first show only the first (level=0) level. if the user clicks
on the menu it should select the second (level=1) level, but only from the
menu he clicked. (so HAVING level<=1 doesn't help :( )
does anybody know a solution or a good reference for nested sets?
(don't have the possibility to use pear - unfortunately cause there are some
great tools)
here's my db-structure:
id (int) unsigned auto_increment
left (int) unsigned
right (int) unsigned
level (int) unsigned (default: 0)
title (varchar)
link (varchar)
menu (int) unsigned (default: 0)
heres my solution (using singleton registry pattern and a sql-class working
with adodb-functions):
#######################################
$reg = ®istry::instance();
$sql = &$reg::getEntry('sql');
# $_GET['menu'] = 'About/Company/History' // <- something like this
$qry = 'SELECT
`first`.`left`,
`first`.`id`,
`first`.`link`,
`first`.`title`,
`first`.`level`,
ROUND((`first`.`right`-`first`.`left`-1)/2) AS `children`
FROM
`'.$grz->cnf['tablePluginPrefix'].'menu` AS `first`,
`'.$grz->cnf['tablePluginPrefix'].'menu` AS `second`
';
$open = array();
if(isset($_GET['menu'])) {
$open = explode(';', $_GET['menu']);
$or = join(' OR `third`.`id`=', $open);
$qry .= ', `'.$grz->cnf['tablePluginPrefix'].'menu` AS `third`
WHERE
(`first`.`left` BETWEEN `second`.`left` AND
`second`.`right`
AND `first`.`left` BETWEEN `third`.`left` AND
`third`.`right`
AND `first`.`level`<=`third`.`level`+1
AND (`third`.`id`='.$or.'))
OR
(`first`.`left` BETWEEN `second`.`left` AND
`second`.`right`
AND `first`.`level`=0)
';
} else {
$qry .= 'WHERE
`first`.`left` BETWEEN `second`.`left` AND
`second`.`right`
AND `first`.`level`=0
';
}
$qry .= 'AND `first`.`menu`='.$menuID.'
GROUP BY
`first`.`left`
ORDER BY
`first`.`left`
';
$res = $sql->query($qry);
#######################################
thx a lot for taking your time,
help would be warmly appretiated...
-ma
# life would be easier if i knew the source code...
--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php