Multilevel menu met php gaat verkeerd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Remco schrubben

remco schrubben

27/07/2012 03:30:41
Quote Anchor link
Ik was op 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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>

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
 
PHP hulp

PHP hulp

25/04/2024 16:59:21
 
Eddy E

Eddy E

27/07/2012 07:30:41
Quote Anchor link
Wat geeft de PHP-code nu?

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
 
Remco schrubben

remco schrubben

27/07/2012 12:28:19
Quote Anchor link
De query klopt met wat ik er wil uit krijgen.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<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>
 
Eddy E

Eddy E

30/07/2012 08:40:17
Quote Anchor link
Probeer deze PHP-code eens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>';
?>


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
 
Remco schrubben

remco schrubben

30/07/2012 18:55:24
Quote Anchor link
Eddy bedankt voor de code.
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.
 
Remco schrubben

remco schrubben

31/07/2012 20:52:56
Quote Anchor link
Heb vandaag even de code van Eddy geprobeerd, en deze werkt na te vredenheid.
Bedankt er voor.
 
Eddy E

Eddy E

31/07/2012 20:56:27
Quote Anchor link
Geen dank hoor.

Kijk wel even goed WAT ik heb gedaan. Dan leer je er nog wat van.
 
Remco schrubben

remco schrubben

31/07/2012 21:11:25
Quote Anchor link
Ik had de code al naast elkaar gezet om te kijken wat anders is.
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
 
Eddy E

Eddy E

31/07/2012 21:49:23
Quote Anchor link
Dat is afhankelijk van je CSS.
Gebruik je Javascript om het menu te openen (zou niet hoeven!)

Je zou ook een extra class kunnen toevoegen (iets als "laag2") etc.
 
Remco schrubben

remco schrubben

31/07/2012 21:52:19
Quote Anchor link
Nee ik gebruik geen Javascript voor het menu.
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.
 
Eddy E

Eddy E

31/07/2012 21:57:19
Quote Anchor link
Dan wel afhankelijk van de laag waarin je zit hé.
Dus level_1, level_2 etc.
Let op dat een css-class NIET met een nummer mag beginnen. Dus 1ste_laag is niet geldig.
 
Remco schrubben

remco schrubben

31/07/2012 22:16:57
Quote Anchor link
Ja dat met die CSS-class niet met nummers mag beginnen wist ik.
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if ($row['Count'] > 0)    
{

    echo '<ul class="sub1_nav_header">';
    display_children($row['id'], $level + 1);
    echo '</ul>';
}

if ($row['Count'] > 1)    
{

    echo '<ul class="sub2_nav_header">';
    display_children($row['id'], $level + 2);
    echo '</ul>';
}

?>


Of is dit niet logisch PHP.
 
Eddy E

Eddy E

31/07/2012 22:29:09
Quote Anchor link
Ik zou het zo proberen (alleen de while):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    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 level_'.$level.'">';
            display_children($row['id'], $level + 1);
            echo '</ul>';
            }

        echo '</li>';
        }

?>


Je kan 2 classen (of meer) tegelijkertijd opgeven.
In je CSS:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
ul.level_2:hover ul.level_3
    {
    display: block;
    }


Toch mis ik iets van actie in CSS.
Dit zou mooi zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
ul.level_2:hover
    {
    div.totaalietsanders
        {
        border: 2px solid red;
        }
    }

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.
 
Remco schrubben

remco schrubben

31/07/2012 22:35:20
Quote Anchor link
Erg bedankt voor het voorbeeld.
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.....
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.