Dynamisch php menu

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bart Smulders

Bart Smulders

31/12/2013 14:52:33
Quote Anchor link
Output moet worden
<ul>Categorie1</ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<ul>categorie2</ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>

database structuur die ik aanhaal.
tabel Nav_subcat_lang
Nav_subcat_id Nav_subcat_lang_NL Nav_subcat_lang_FR Nav_subcat_lang_DE Nav_subcat_lang_EN Nav_cat_id

Tabel Nav_cat_lang
Nav_cat_id Nav_cat_lang_NL Nav_cat_lang_FR Nav_cat_lang_DE Nav_cat_lang_EN

Daar de taal ook veranderen kan moet hier rekening mee gehouden worden.
Wat ik reeds heb:
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
44
45
<?php
function nav($lang,$mysqli)
{

    $langselect=$lang;
$query ="
SELECT
Nav_cat_lang.Nav_cat_id,
Nav_cat_lang.Nav_cat_lang_"
.$langselect.",
Nav_subcat_lang.Nav_subcat_lang_"
.$langselect.",
Nav_subcat_lang.Nav_cat_id,
Nav_subcat_lang.Nav_subcat_id
FROM
Nav_subcat_lang
LEFT JOIN Nav_cat_lang
ON Nav_cat_lang.Nav_cat_id = Nav_subcat_lang.Nav_cat_id"
;

if ($result = $mysqli->query($query)) {

   while ($row = $result->fetch_assoc())
   {

  $pid[]=$row["Nav_subcat_id"];
  $catlang[]=$row["Nav_cat_lang_".$langselect.""];
  $subcatlang[]=$row["Nav_subcat_lang_".$langselect.""];
   }



   foreach($catlang as $cat ){
 $html='<ul>';
 $html.= $cat;
 foreach($subcatlang as $subcat){
 $html.="<li>$subcat</li>";
 }

 $html.='</ul>';
 $html.="\n";
echo $html;
  }

  
 
 
 mysqli_free_result($result);

$mysqli->close();
}
      }

?>

Momenteel geeft ie per categorie alle subcategorieen weer.

Wat gaat er hier mis?

Heb reeds gekeken naar een ander soortgelijke functie maar daar is de structuur van de database niet dezelfde.
Gewijzigd op 01/01/2014 19:44:30 door Bart Smulders
 
PHP hulp

PHP hulp

05/02/2023 05:07:37
 
Frank Nietbelangrijk

Frank Nietbelangrijk

31/12/2013 15:03:33
Quote Anchor link
waar zijn je php tags?
 
Bart Smulders

Bart Smulders

31/12/2013 15:09:31
Quote Anchor link
Frank Nietbelangrijk op 31/12/2013 15:03:33:
waar zijn je php tags?


Deze functie staat in mijn functies.php bestand.

Word op de index pagina aangehaald met nav($lang,$mysqli)
 
Bart Smulders

Bart Smulders

02/01/2014 18:41:48
Quote Anchor link
Nog geen reactie op deze. Iemand die me kan helpen?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

02/01/2014 19:25:04
Quote Anchor link
Natuurlijk willen we helpen.. alleen waarom al dat Nav_cat_* gedoe?
Kun je dat er niet uithalen? zou een stuk leesbaarder zijn. Tenslotte heb je al een tabelnaam ook toch?

En wat zou je wel willen zien dan?
Gewijzigd op 02/01/2014 19:28:27 door Frank Nietbelangrijk
 
Bart Smulders

Bart Smulders

02/01/2014 19:45:30
Quote Anchor link
Frank Nietbelangrijk op 02/01/2014 19:25:04:
Natuurlijk willen we helpen.. alleen waarom al dat Nav_cat_* gedoe?
Kun je dat er niet uithalen? zou een stuk leesbaarder zijn. Tenslotte heb je al een tabelnaam ook toch?

En wat zou je wel willen zien dan?

Nav=navigatie cat= categorie en subcat ...
Ik heb 2 tabellen
In de eerste tabel beschrijf ik de Hoofdmenu's en in de 2 de items die onder de respectievelijke menu's komen. Ieder in de selecteerde taal.
1 Nav_cat_lang
-Nav_cat_id
-Nav_cat_lang_NL
-Nav_cat_lang_FR
-Nav_cat_lang_DE
-Nav_cat_lang_EN
2 Nav_subcat_lang
-Nav_subcat_id
-Nav_subcat_lang_NL
-Nav_subcat_lang_FR
-Nav_subcat_lang_DE
-Nav_subcat_lang_EN
-Nav_cat_id

Nav_cat_id is dan de gemeenschappelijke waarde die duidelijk maakt waar welk item komen moet.
Nav_subcat_id is dan het id dat ik gebruik om bv index?pid=1 mee aan te maken

Helemaal bovenaan staat het beoogde resultaat.

<ul>Nav_cat_lang_NL of DE </ul>
<li>Nav_subcat_lang_NL of DE</li>

enz
Gewijzigd op 02/01/2014 19:47:49 door Bart Smulders
 
Frank Nietbelangrijk

Frank Nietbelangrijk

02/01/2014 21:59:36
Quote Anchor link
Twee tabellen zonder al die voorvoegsels:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
category:
  `id`
  `lang_NL`

subcategory:
  `id`
  `cat_id`
  `lang_NL`


Query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
    category.lang_NL    AS 'menuitem',
    subcategory.lang_NL AS 'submenuitem'
FROM
    subcategory
LEFT JOIN
    category
ON
    category.id=subcategory.cat_id
WHERE
    subcategory.cat_id=1


Restultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
menuitem     |  submenuitem
---------------------------
pannekoeken  |  suiker
pannekoeken  |  stroop
pannekoeken  |  jam
Gewijzigd op 02/01/2014 22:00:07 door Frank Nietbelangrijk
 
Bart Smulders

Bart Smulders

03/01/2014 18:35:31
Quote Anchor link
@Frank
Bedankt voor jou reactie en inzet maar ik krijg hier echter nog steeds niet het gewenste resultaat.

Alles komt nog steeds dubbel er uit. Ik krijg het maar niet correct weergegeven zodat het ipv :

Menuitem1
subitem van Menuitem1
subitem van Menuitem1
subitem van Menuitem2

Menuitem1
subitem van Menuitem1
subitem van Menuitem1
subitem van Menuitem2
Menuitem2
subitem van Menuitem1
subitem van Menuitem1
subitem van Menuitem2

Zou moeten worden:

MenuItem1
Subitem van Menuitem 1
Subitem van Menuitem 1
MenuItem2
Subitem van Menuitem 2

En het is net dat wat niet werken wil.

Alvast bedankt
 
Bart Smulders

Bart Smulders

06/01/2014 23:00:26
Quote Anchor link
Iemand? Ik heb het gebruik van arrays niet helemaal onder de knie en daar wringt het schoentje.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/01/2014 01:29:21
Quote Anchor link
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
<?php

$menuArray
= array();

$query = "SELECT bla bla bla";

if($result = $mysqli->query($query))
{

    // we gebruiken heel handig een associatieve array om de subitems als array onder de items te krijgen
    while ($row = $result->fetch_assoc())
        $menuArray[$row['menuitem']][] = $row['submenuitem'];
}


// laat onze array nu eens zien
echo '<pre>';
print_r($menuArray);
echo '</pre>';

// maak het menu uit de array
echo "<ul>\n";
foreach($menuArray as $menuitem => $subitems)
{

    echo "\t<li>" . $menuitem;
    if(is_array($subitems))
    {

        echo "\n\t\t<ul>\n";
        foreach($subitems as $subitem)
        {

            echo "\t\t\t<li>".$subitem."</li>\n";
        }

        echo "\t\t</ul>\n\t";
    }

    echo "</li>\n";
}

echo "</ul>\n";
?>
Gewijzigd op 07/01/2014 01:42:21 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/01/2014 11:49:45
Quote Anchor link
Behalve dan dat als een menuitem geen subitems heeft, je dan toch een lege ul krijgt.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/01/2014 12:18:03
Quote Anchor link
Ger, kijk eens goed.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    if(is_array($subitems))
    {

        echo "\n\t\t<ul>\n";
        // ....
    }
?>
Gewijzigd op 07/01/2014 12:18:21 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/01/2014 12:46:10
Quote Anchor link
Kijk jij eens goed:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
while ($row = $result->fetch_assoc())
        $menuArray[$row['menuitem']][] = $row['submenuitem'];
//                                  ** dus ALTIJD een array
?>
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/01/2014 13:36:47
Quote Anchor link
Op die fiets heb je een punt inderdaad. Het mooie is dat ik m getest had en het werkte prima..
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/01/2014 14:56:33
Quote Anchor link
Dan zullen alle menuitems submenu's gehad hebben.
 
Bart Smulders

Bart Smulders

09/01/2014 22:39:10
Quote Anchor link
Ik heb deze raad opgevolgt en dit is dan ook gelukt zoals Frank en ger al hebben getest. maar nu zou ik ook het Pagina id willen toewijzen in de link en dat lukt me weer niet wederom aangezien ik niet mee ben met het gebruik van arrays.
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
$langselect
=$lang;
$query ="
SELECT
Nav_cat_lang.Nav_cat_id,
Nav_cat_lang.Nav_cat_lang_"
.$langselect." AS Categorie,
Nav_subcat_lang.Nav_subcat_lang_"
.$langselect." AS Subcategorie,
Nav_subcat_lang.Nav_cat_id,
Nav_subcat_lang.Nav_subcat_id AS PID
FROM
Nav_subcat_lang
LEFT JOIN Nav_cat_lang
ON Nav_cat_lang.Nav_cat_id = Nav_subcat_lang.Nav_cat_id"
;


if($result = $mysqli->query($query))
{

    // we gebruiken heel handig een associatieve array om de subitems als array onder de items te krijgen
     while ($row = $result->fetch_assoc())
   {

        $menuArray[$row['Categorie']][]  = $row['Subcategorie'];
        $menuArrays[$row['Subcategorie']][]  = $row['PID'];
        

    $pgid[]=$row['PID'];
    
    
   }

// maak het menu uit de array

foreach($menuArray as $menuitem => $subitems)
{

                
    echo "\t<ul>" . $menuitem."\n";
    if(is_array($subitems))
    {
    
    }

        foreach($subitems as $subitem)
        {

        if(!empty( $subitem) )
        {

            $html="\t\t\t<li><a href='?pid=";
            foreach ($pgid as $pid){
            $html.=$pid ;
            }

            $html.="'>".$subitem."</a></li>\n";
            echo $html ;
        }
            
        
        
    }

    echo "</ul>\n";
    
}

 
//

 
 /* free result set */

mysqli_free_result($result);
/* close connection */
$mysqli->close();
}

?>

Het resultaat dat ik krijg is het juiste alleen krijg ik bij de id's 12345 achter elkaar bv

index.php?id=12345 ipv index.php?id=1 enz

Ik ga dit meer moeten gebruiken om bepaalde waarden uit de tabel de halen . Enige uitleg bij een oplossing zou mogen.

mvg
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/01/2014 23:09:38
Quote Anchor link
Bart Smulders op 09/01/2014 22:39:10:
Ik heb deze raad opgevolgt en dit is dan ook gelukt zoals Frank en ger al hebben getest.

Ger heeft helemaal niets getest, maar Ger weet heel zeker dat, indien een menu item geen subitems bevat, je niet te zien krijgt wat je verwacht.
Gewijzigd op 09/01/2014 23:10:04 door Ger van Steenderen
 
Bart Smulders

Bart Smulders

09/01/2014 23:28:16
Quote Anchor link
Ger van Steenderen op 09/01/2014 23:09:38:
Bart Smulders op 09/01/2014 22:39:10:
Ik heb deze raad opgevolgt en dit is dan ook gelukt zoals Frank en ger al hebben getest.

Ger heeft helemaal niets getest, maar Ger weet heel zeker dat, indien een menu item geen subitems bevat, je niet te zien krijgt wat je verwacht.


Hier snap ik de bijdrage niet van ... Heb het wel iets aangepast zodat indien geen item's beschikbaar zijn <li> niet word weergegeven.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/01/2014 09:19:26
Quote Anchor link
Je kan ook gewoon door het resultaat lopen:
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
<?php
$sql
= "SELECT
            m.menu_name,
            m.menu_id,
            m.menu_link,
            s.submenu_name,
            s.submenu_link
        FROM
            menus AS m
        LEFT JOIN
            submenus s ON m.menu_id = s.menu_id
        ORDER BY
            m.menu_id"
;
$result = mysqli_query($con, $sql);
$menuid = -12; //pointer om bij te houden waar we zijn
$end = '';
$anchor = '<a href="http://examplecom/%s">%s</a>';
echo '<ul>';
while ($item = mysqli_fetch_assoc($result)) {
    if ($item['menu_id'] != $menuid) { //nieuwe groep beginnen
        $menuid = $item['menu_id'];
        echo $end, '<li>';
        if ($item['menu_link'] != '') {
            echo sprintf($anchor, $item['menu_link'], $item['menu_name']);
        }

        else {
            echo $item['menu_name'];
        }

        if ($item['submenu_name'] == '') {
            $end = '</li>';
            continue;
        }

        echo '<ul>';
        $end = '</ul></li>';
    }

    echo '<li>', sprintf($anchor, $item['submenu_link'], $item['submenu_name']), '</li>';
}

echo $end, '</ul>';
?>
Gewijzigd op 10/01/2014 09:19:59 door Ger van Steenderen
 



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.