Multilevel menu met php gaat verkeerd
DEZE site een multilevel menu tegen gekomen.
Nu heb ik heb redelijk na behoren aan het werk.
Alleen zodra ik een 2 level wil toevoegen gaat er dingen verkeerd.
Er word op de verkeerde plekken <ul class="nav_header"> gezet.
Maar na enkele uren kijken kom ik er niet uit meer.
Wie zou even mee willen kijken waar het fout gaat?
PHP code HIER te vinden.
Het probleem zit hem in de while{}, maar hoe en wat is voor mij even hokus spokus.
Gewenste uitkomst:
PS: Ik wil de huidige bron code die word gemaakt door de PHP wel posten.
Alleen die is zo vaag, dat ik hem eerst even weg laat. Mocht er vraag na zijn post ik hem als nog.
Ik was op Nu heb ik heb redelijk na behoren aan het werk.
Alleen zodra ik een 2 level wil toevoegen gaat er dingen verkeerd.
Er word op de verkeerde plekken <ul class="nav_header"> gezet.
Maar na enkele uren kijken kom ik er niet uit meer.
Wie zou even mee willen kijken waar het fout gaat?
PHP code HIER te vinden.
Het probleem zit hem in de while{}, maar hoe en wat is voor mij even hokus spokus.
Gewenste uitkomst:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<nav id="nav_header">
<ul class="nav_header">
<li>
<a href="#">Home</a>
</li>
<li>
<a href="#">Code</a>
<ul class="sub_nav_header">
<li><a href="#">PHP</a></li>
<li><a href="#">MYSQL</a></li>
</ul>
</li>
<li>
<a href="#">Informatie</a>
<ul class="sub_nav_header">
<li><a href="#">Over Mij</a></li>
<li><a href="#">Contact</a></li>
</ul>
</li>
</ul>
</nav>
<ul class="nav_header">
<li>
<a href="#">Home</a>
</li>
<li>
<a href="#">Code</a>
<ul class="sub_nav_header">
<li><a href="#">PHP</a></li>
<li><a href="#">MYSQL</a></li>
</ul>
</li>
<li>
<a href="#">Informatie</a>
<ul class="sub_nav_header">
<li><a href="#">Over Mij</a></li>
<li><a href="#">Contact</a></li>
</ul>
</li>
</ul>
</nav>
PS: Ik wil de huidige bron code die word gemaakt door de PHP wel posten.
Alleen die is zo vaag, dat ik hem eerst even weg laat. Mocht er vraag na zijn post ik hem als nog.
Gewijzigd op 27/07/2012 03:46:18 door Remco schrubben
Ik verwacht dat je query gewoon fout is.
Omdat...
- in de functie-aanroep geef je $parent en $level mee. Daar doe je niets mee in de query ( terwijl mij dat wel logisch lijkt)
- de query wordt niet aangepast en zal dus elke keer (misschien maar 1 of 2x) hetzelfde resultaat (zelfde menu-knop) geven.
Gewijzigd op 27/07/2012 07:33:03 door Eddy E
Alleen de plekken in de while waar de <ul> en <ul class="sub_nav_header">
worden op de verkeerde plekken geopent en gesloten.
De code die word ge-ou-put kom ik niet mee weg om het wel op de goede punten te zetten.
Code die php nu out-put is:
Code (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
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
<nav id="nav_header">
<ul class="nav_header">
<ul class="sub_nav_header">
<li>
<a href="#home">Home</a>
</li>
<li>
<a href="#code">Code</a><ul class="sub_nav_header">
<li>
<a href="#php">PHP</a>
</li>
<ul class="sub_nav_header">
<li>
<a href="#scripts">Scripts</a>
</li>
<ul class="sub_nav_header">
<li>
<a href="#help">Help</a>
</li>
</ul>
</li>
<li>
<a href="#contact">Contact</a><ul class="sub_nav_header">
<li>
<a href="#archive">Archive</a>
</li>
<ul class="sub_nav_header">
<li>
<a href="#snippet">Snipet</a>
</li>
</ul>
</li>
</ul>
</ul>
</nav>
<ul class="nav_header">
<ul class="sub_nav_header">
<li>
<a href="#home">Home</a>
</li>
<li>
<a href="#code">Code</a><ul class="sub_nav_header">
<li>
<a href="#php">PHP</a>
</li>
<ul class="sub_nav_header">
<li>
<a href="#scripts">Scripts</a>
</li>
<ul class="sub_nav_header">
<li>
<a href="#help">Help</a>
</li>
</ul>
</li>
<li>
<a href="#contact">Contact</a><ul class="sub_nav_header">
<li>
<a href="#archive">Archive</a>
</li>
<ul class="sub_nav_header">
<li>
<a href="#snippet">Snipet</a>
</li>
</ul>
</li>
</ul>
</ul>
</nav>
Code (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
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
<?php
function display_children($parent, $level)
{
$result = mysql_query("SELECT
a.id,
a.label,
a.link,
Deriv1.Count
FROM
menu a
LEFT OUTER JOIN (
SELECT
parent,
COUNT(*) AS Count
FROM
menu
GROUP BY
parent
)
Deriv1 ON (a.id = Deriv1.parent)
WHERE
a.parent= $parent
");
while ($row = mysql_fetch_assoc($result))
{
echo '<li>';
echo ' <a href="' . $row['link'] . '">' . $row['label'] . '</a>';
if ($row['Count'] > 0)
{
echo '<ul class="sub_nav_header">';
display_children($row['id'], $level + 1);
echo '</ul>';
}
echo '</li>';
}
}
}
echo '<nav id="nav_header"><ul class="nav_header">';
echo display_children(0, 1);
echo '</ul></nav>';
?>
function display_children($parent, $level)
{
$result = mysql_query("SELECT
a.id,
a.label,
a.link,
Deriv1.Count
FROM
menu a
LEFT OUTER JOIN (
SELECT
parent,
COUNT(*) AS Count
FROM
menu
GROUP BY
parent
)
Deriv1 ON (a.id = Deriv1.parent)
WHERE
a.parent= $parent
");
while ($row = mysql_fetch_assoc($result))
{
echo '<li>';
echo ' <a href="' . $row['link'] . '">' . $row['label'] . '</a>';
if ($row['Count'] > 0)
{
echo '<ul class="sub_nav_header">';
display_children($row['id'], $level + 1);
echo '</ul>';
}
echo '</li>';
}
}
}
echo '<nav id="nav_header"><ul class="nav_header">';
echo display_children(0, 1);
echo '</ul></nav>';
?>
Ik heb de if-construtie eruit gehaald om maar 1x de HTML te hoeven typen.
Daarnaast heb ik een <ul> te veel weggehaald. Ook wordt <ul class="sub_nav_header"> nu maar 1x gemaakt.... en dat is volgens mij ook de bedoeling?
Ook is die <ul class="sub_nav_header"> nu uit de while-loop gehaald, maar er net buiten gezet.
Kijk er eens naar.
Het koste mij ook 20 minuten om alles precies door te krijgen hoe het werkt, maar volgens mij moet het nu goed gaan.
Tot hoe veel lagen diep wil je gaan? Dit gaat door tot oneindig, maar als je toch maar 2 lagen diep gaat....
Gewijzigd op 30/07/2012 08:42:13 door Eddy E
Ik ben even paar dagen weg geweest vandaar late reactie.
Wil eigenlijk maar eerst 2 lagen diep gaan. Maar misschien in de toekomst wel uitbreiden naar meer lagen. Dus dat hij daar nu al na kijkt is niet zo ramp dus.
Ik ga deze vanavond even testen als ik weer achter de server zit.
Bedankt.
Bedankt er voor.
Kijk wel even goed WAT ik heb gedaan. Dan leer je er nog wat van.
Want net wat je zelf al oppert.
Knip / plak = Makkelijke kind van 1 kan het nog. Maar daar leren we niks van natuurlijke.
Update:
Heb nog even een snelle vraag voer de code Eddy.
Ik zie wat jij hebt verandert met de elseif er uit te halen.
Alleen omdat de <ul class="sub_nav_header"> klapt er een deelt uit als ik op bijvoorbeeld: Scripts ga staan. Dan klapt er de volgende onderdelen uit.
- PHP
- MYSQL
- HTML
Als ik in database ingeef dat er bij PHP nog een sub menu komt, dan klapt deze gelijk uit zodra ik op scripts ga staan. Maar dit zou pas mogen als ik op PHP ga staan.
Moet ik hierbij nog na een extra stukje kijken? Omdat er dan een andere class gegeven moet worden zodat bij PHP er een naast moet komen.
Gewijzigd op 31/07/2012 21:29:40 door remco schrubben
Gebruik je Javascript om het menu te openen (zou niet hoeven!)
Je zou ook een extra class kunnen toevoegen (iets als "laag2") etc.
Die is puur HTML en CSS, ja oke en nu dan stukje ph er bij.
Ik ga ff zien na die extra class er in te prutsen.
Dus level_1, level_2 etc.
Let op dat een css-class NIET met een nummer mag beginnen. Dus 1ste_laag is niet geldig.
Ik zal dan iets maken als class="sub1_nav_header" en class="sub2_nav_header".
Maar ik neem aan dat ik dan die if{} moet uitbreiden en een elseif{} er bij maken of?
Of moet ik dan iets doen als:
Code (php)
Of is dit niet logisch PHP.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Je kan 2 classen (of meer) tegelijkertijd opgeven.
In je CSS:
Toch mis ik iets van actie in CSS.
Dit zou mooi zijn:
Zodat een ander element een randje krijgt als ik over een ander (niet child of parent) element hover. Maar goed, ontopic: probeer eens wat ik had had.
Ik zou blijven werken met $level.
Ik ga dit morgen even rustig op een rijtje zetten en dingen uitproberen.
Maar ik snap de opzet naar waar je toe wilt.
Ik laat nog even van mij horen.
Toevoeging op 01/08/2012 09:42:16:
Het probleem is opgelost.
Ik heb de nav_header en sub_nav_header er uit gehaald. En heb er de <nav></nav> anders opgemaakt zodat ik niet hoef te werken meer met verschillende sub_levels.
Nu alleen nog even kijken hoe ik met de zelfde menu er verschillende gebruikers rechten mee kan geven. Zoals:
Admin: Mag alles zien
Reporter: Mag alleen profiel en nieuws navigatie zien.
Enz.....