[PHP] Suckerfish menu met 3 lagen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Onderstaand script gebruik ik al een tijdje om een navigatie met submenu's te maken. Nu heb ik dit script omgezet, zodat het werkt met suckerfish. Dit gaat ook prima. Nu wil ik een derde submenu toevoegen, dat uit het submenu komt. Dit noem ik subsubmenu. Alleen lukt me dat niet. Ik weet niet meer hoe ik verder moet. Ik krijg het niet voor elkaar om een derde submenu uit de database te halen.

Wie weet hoe ik verder moet of wat ik moet aanpassen?

Mijn database ziet er als volgt uit:
Tabel menu:
menu_id | navigatie_id | subnavigatie_id | subsubnavigatie_id | bestandsnaam

Dit script is dus het script met een hoofdmenu en 1 submenu.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
$query_nav = "SELECT DISTINCT navigatie.navigatie, menu.navigatie_id
FROM menu, navigatie 
WHERE menu.navigatie_id = navigatie.navigatie_id
ORDER BY navigatie.rangorde";
$result_nav = mysql_query($query_nav) or die();

while($row_nav = mysql_fetch_array($result_nav)){

$query_subnav = "SELECT *
FROM menu, subnavigatie
WHERE menu.subnavigatie_id = subnavigatie.subnavigatie_id
AND menu.navigatie_id = '$row_nav[navigatie_id]'
ORDER BY subnavigatie.rangorde";
$result_subnav = mysql_query($query_subnav) or die();

if (mysql_num_rows($result_subnav) == 0){           //geen subnavigatie dus navigatie met link
$query_menu = "SELECT * 
FROM menu 
WHERE navigatie_id = '$row_nav[navigatie_id]'";
$result_menu = mysql_query($query_menu) or die();
$row_menu = mysql_fetch_array($result_menu);

if (($row_menu[bestandsnaam] == "page.php") || ($row_menu[bestandsnaam] == "")){
$bestandsnaam = "page.php?menu_id=$row_menu[menu_id]";
}   
else {
$bestandsnaam = "$row_menu[bestandsnaam]";
}   

echo "\n<li><a href=\"bestandsnaam\">$row_nav[navigatie]</a><ul>\n";
}


else {                              //wel subnavigatie aanwezig dus navigatie zonder link
echo "<li><a href=\"#\">$row_nav[navigatie]</a><ul>\n\n";

while($row_subnav = mysql_fetch_array($result_subnav)){     //wel subsubnavigatie aanwezig dus subnavigatie zonder link
if (($row_subnav[bestandsnaam] == "page.php") || ($row_subnav[bestandsnaam] == "")){
$bestandsnaam = "page.php?menu_id=$row_subnav[menu_id]";
}   
else {
$bestandsnaam = "$row_subnav[bestandsnaam]";
}
echo "<li><a href=\"$bestandsnaam\">$row_subnav[subnavigatie]</a></li>";
}
}
echo "</ul></li>";
}
?>

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

We zijn hier geen quickfix...wat had je zelf al geprobeerd en wat werkte daar niet aan? Waarom niet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Waar ik niet mee verder kom is dat ik gebruik heb gemaakt van mysql_num_rows. Deze controleert of er subnavigatie is, d.m.v. het tellen van rijen. Telt hij 0 rijen dan is er geen subnavigatie en geeft het script alleen de navigatie. Ik wil eigenlijk dat hij ook de subsubnavigatie telt.

ik heb het deel van de subnavigatie herhaalt voor de subsubnavigatie, alleen gaat dan het hele menu uit elkaar en toont hij altijd het subsubmenu.

Ik krijg de controle voor de subsubnavigatie er dus niet ingebouwd. Ik kom er niet verder mee.
Je hoeft geen script aan te passen, maar misschien is er iemand die me vertelt hoe het wel kan en of het eigenlijk wel op deze manier verde kan.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Je had je hele code voor het subsubmenu moeten herhalen. Dus die query voor het submenu voorzien van een DISTINCT regeltje, en die query herhalen voor je subsubmenu. Als je iets op 3 lagen wilt doen, zal je 3 while-loops nodig hebben. Je code wordt zo wel erg slecht te onderhouden, en gevoelig voor fouten.

Ik zou je datamodel dus anders neerzetten:
code:
1
2
3
4
5
6
7
8
9
10
menu
--------
id | parent | name
-------------------------
0  | NULL  | hoofditem
1  | 0     | 1e menu
2  | 1     | 1e submenu: 1.1
3  | 1     | 2e submenu: 1.2
4  | 3     | 1e subsubmenu: 1.2.1
5  | 0     | 2e menu

Het makkelijkste is het om deze tabel om te zetten in een gelaagde array. Die array moet je vervolgens doorlopen met een recursieve functie.

[ Voor 24% gewijzigd door MBV op 06-09-2006 23:42 ]


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Als ik dat deel van regel 17 tot 46 opnieuw uitvoer, krijg ik weer if(mysql_num_rows == 0) op dezelfde query, of moet ik daarboven dan weer een nieuwe query schrijven om subnavigatie en subsubnavigatie te controleren. Dit had ik namelijk al geprobeert en dan ging het fout. Dan klopte het menu niet meer, omdat dan het subsubmenu tussen het submenu kwam te staan.

Ik ga aan de slag ermee.

[ Voor 13% gewijzigd door Matthijs1982 op 06-09-2006 23:48 ]


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

je moet idd die query opnieuw doen. Maar eigenlijk vind ik dat wel ultiem ranzig. Vergeet niet dat je subsubmenu query een extra parameter nodig heeft: het submenu-id (waarom noem je idx niet gewoon id?)

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Goh, bedankt. Hoef ik dat de volgende keer niet helemaal zelf uit te zoeken hoe dat werkt in PHP :P Alhoewel ik denk dat 3 recursielagen nog niet zo'n probleem is qua performance, 't scheelt weer wat tijd aan rekenen met tupling enzo :P

Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

tip 1 : variabelen buiten quotes !

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

ik wilde net zeggen dat dat een kwestie van stijl is, maar
PHP:
1
$bestandsnaam = "$row_subnav[bestandsnaam]";

deze constructies zijn wel erg overdreven.

Mag ik hem afmaken met tip 2: maak hiervan:
PHP:
1
2
3
else {
$bestandsnaam = $row_menu['bestandsnaam'];
}
dit:
PHP:
1
2
3
else {
   $bestandsnaam = $row_menu['bestandsnaam'];
}

indenten is gratis :)

* MBV werkt momenteel met code waar dit bij in het niet valt, dus debuggen lukt me steeds beter met dit soort ranzige troep stel je regels voor van 400 tekens lang, met daarin bijv
code:
1
2
if (conditie) $var = array('ding' => $ding, 'ding2' => $ding2, .... );
else $var = array('ding' => $ding, 'ding2' => $ding4, .... );

soms zie ik in vim wel 6 regels staan die 1 regel blijken te zijn... :X

[ Voor 21% gewijzigd door MBV op 08-09-2006 11:24 ]

Pagina: 1