Hallo ik ben bezig met een menu in elkaar te zetten

ik heb een tabel zoals hieronder (alleen ndan veel langer)

id | titel | menu_id
---------------------
1 | hooft p1| H
2 | sub p1 | 1
3 | sub p2 | 1
4 | sub p3 | 5
5 | sub p4 | -
6 | hoofd p2| H

hieruit moet het volgende menu worden gegenereerd

hooft p1
- sub p1
- sub p2

hoofd p2
- sub 5
- sub p2

Ik kom er alleen niet uit hoe ik dit moet aanpakken. Hoe kan ik dit voor elkaar krijgen? of moet ik mijn menu heel anders in elkaar gaan zetten?
Ja ik wil het in de css cript zetten

<ul>
<li class="home">a</li>
<li class="home">b</li>
<li class="home">c</li>
</ul>
<li>Specialisaties</li>
<li>Activiteiten</li>
<li>Contact</li>
</ul>

maar ik weet niet hoe ik het in de JUISTE volgorde kan genereren
Het komt uit een database zo te zien. Dan maak je toch een veld met "volgorde" aan en dan sorteer je bij je output op volgorde?

<?php
$sql_m = "SELECT * FROM menu ORDER BY volgorde";
?>

Succes ermee!
Het is ingewikkelder ben ik bang. Er bestaat een relatie tussen de pagina's onderling omdat het veld menu_id verwijst naar de pagina waaronder de huidige pagina hangt. Om zo'n database-structuur te vertalen naar een goed CSS menu is heel wat code nodig.

Ik heb wel een voorbeeld liggen van iets dat heel erg op dit probleem lijkt. Je zult het naar je eigen situatie moeten omzetten, maar wellicht heb je er iets aan. Geef maar een seintje als je geïnteresseerd bent.
Ik heb een scriptje gebaseerd op dat script met het wijzigen van de menu volgorde.
Dat script werkt mo <ul>'s en <li>'s. Het is een menu met categoriën en per cat nog onderliggende items.
Ik post het zodadelijk.
De weergave pagina voor de menu:
<?
include ('includes/config.php');//DB connectie maken

$sql = "SELECT * FROM menucats ORDER BY nummer ASC";
$cres = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($cres) >= 1)
{
echo '<ul class="menucats">';
while ($crow = mysql_fetch_array ($cres))
{
echo'<li>'.$crow['catname'].'</li>';
$sql = "SELECT * FROM menuitems WHERE catid = ".$crow['nummer']."";
$res = mysql_query ($sql) or die (mysql_error ());
if (mysql_num_rows ($res) >= 1)
{
echo '<ul class="menuitems">';
while ($row = mysql_fetch_array ($res))
{
echo '<li><a href="'.$row['url'].'">'.$row['tekst'].'</a></li>';
}
echo '</ul>';
}
}
echo '</ul>';
}

?>

De db structuur:

CREATE TABLE `menucats` (
  `id` int(11) NOT NULL auto_increment,
  `catname` varchar(100) NOT NULL default '',
  `nummer` int(2) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `menuitems` (
  `id` int(11) NOT NULL auto_increment,
  `url` varchar(200) NOT NULL default '',
  `tekst` varchar(200) NOT NULL default '0',
  `catid` int(2) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



Om de volgorde van de cats te wijzigen:

<?php
//haal hoogste nummer op
$maxnr_row = mysql_fetch_assoc(mysql_query("SELECT MAX(nummer) AS maximum FROM menucats"))or trigger_error(mysql_error());
$maxnr = $maxnr_row['maximum'];

//controleer of er op de downlink is geklikt
if(isset($_GET['down']) && is_numeric($_GET['down']) && isset($_GET['nummer']) && is_numeric($_GET['nummer'])){
if($_GET['nummer'] > $maxnr || $_GET['nummer'] < 1){
echo 'U moet het script zijn werk laten doen en er niet zelf mee gaan prutsen';
}
else{
//bepaal het nummer van de andere link die van plaats veranderd
$nr_change=$_GET['nummer']+1;
//controleer of het wel mogelijk is een item nog verder op te schuiven
if($nr_change >$maxnr){
echo 'Dit Item kan niet nog verder naar het einde van het menu worden geschoven';
}
//als op kan schuiven, voer dan de update uit
else{
$downqry = "SELECT id FROM menucats WHERE nummer = '".$nr_change."'";
$downrow = mysql_fetch_assoc(mysql_query($downqry));
$update_down = mysql_query("UPDATE menucats SET nummer = nummer+1 WHERE id=".$_GET['down']);
if (!$update_down){
trigger_error(mysql_error());
}
$update_up = mysql_query("UPDATE menucats SET nummer = nummer-1 WHERE id=".$downrow['id']);
if (!$update_up){
trigger_error(mysql_error());
}
}
}
}
//controleer of op de uplink is geklikt
if(isset($_GET['up']) && is_numeric($_GET['up']) && isset($_GET['nummer']) && is_numeric($_GET['nummer'])){
if($_GET['nummer'] > $maxnr || $_GET['nummer'] < 1){
echo 'U moet het script zijn werk laten doen en er niet zelf mee gaan prutsen';
}
else{
// bepaal het nummer van de andere link die van plaats veranderd
$nr_change=$_GET['nummer']-1;
// controleer of het mogelijk is het gekozen item nog verder omhoog te schuiven
if($nr_change == 0){
echo 'Dit Item kan niet nog verder naar het begin van het menu worden geschoven';
}
//als het goed is gekeurd, dan de rijen weer updaten.
else{
$upqry = "SELECT id FROM menucats WHERE nummer = '".$nr_change."'";
$uprow = mysql_fetch_assoc(mysql_query($upqry));
$update_up = mysql_query("UPDATE menucats SET nummer = nummer-1 WHERE id=".$_GET['up']);
if (!$update_up){
trigger_error(mysql_error());
}
$update_down = mysql_query("UPDATE menucats SET nummer = nummer+1 WHERE id=".$uprow['id']);
if (!$update_down){
trigger_error(mysql_error());
}
}
}
}


$sql = "SELECT * FROM menucats ORDER BY nummer ASC";
$result = mysql_query($sql);
if($result){
echo '<ul class="menucats">';
while($row = mysql_fetch_assoc($result)){
echo '<li>'.$row['catname'].'&nbsp;&nbsp;&nbsp;<a href="?up='.$row['id'].'&nummer='.$row['nummer'].'"><img src="../images/arrowu.gif" border="0" alt="Omhoog"></a>&nbsp;&nbsp;<a href="?down='.$row['id'].'&nummer='.$row['nummer'].'"><img src="../images/arrowd.gif" border="0" alt="Omlaag"></a></p>';
}
echo '</ul>';
}
else{
trigger_error(mysql_error());
}

//Credits Robert (PHPHulp, http://www.phphulp.nl/php/scripts/3/832/)
?>

De CSS ga je zelf moeten maken ;)

Normaal gezien meot dit werken.
Ik heb de code juist een beetje aangepast aan jouw vraag:)

Mvg Jens

Reageren