Dynamisch php menu
<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)
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
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();
}
}
?>
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
waar zijn je php tags?
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)
Nog geen reactie op deze. Iemand die me kan helpen?
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
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?
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
Query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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
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)
1
2
3
4
5
2
3
4
5
menuitem | submenuitem
---------------------------
pannekoeken | suiker
pannekoeken | stroop
pannekoeken | jam
---------------------------
pannekoeken | suiker
pannekoeken | stroop
pannekoeken | jam
Gewijzigd op 02/01/2014 22:00:07 door Frank Nietbelangrijk
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
Iemand? Ik heb het gebruik van arrays niet helemaal onder de knie en daar wringt het schoentje.
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
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";
?>
$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
Behalve dan dat als een menuitem geen subitems heeft, je dan toch een lege ul krijgt.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
while ($row = $result->fetch_assoc())
$menuArray[$row['menuitem']][] = $row['submenuitem'];
// ** dus ALTIJD een array
?>
while ($row = $result->fetch_assoc())
$menuArray[$row['menuitem']][] = $row['submenuitem'];
// ** dus ALTIJD een array
?>
Op die fiets heb je een punt inderdaad. Het mooie is dat ik m getest had en het werkte prima..
Dan zullen alle menuitems submenu's gehad hebben.
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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();
}
?>
$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
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
Ger van Steenderen op 09/01/2014 23:09:38:
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.
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.
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
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>';
?>
$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