Dit is de situatie:
Momenteel is het menu opgebouwd uit categorieën, dat houd in, hoofdcategorieen en subcategorieen, je kan die oneindig door linken onder elkaar. Dat werkt prima maar nu heb ik in mijn CMS ook `artikelen` dit zijn pagina's die alleen maar onder categorieën kunnen hangen en dus niet oneindig diep, deze gaan maar 1 niveau diep, altijd onder een categorie.
parent_id is het id waarmee een categorie aan een andere categorie is gekoppeld
catid is het id waarmee een artikel aan een categorie is gekoppeld
Het lukt mij niet dit artikelen te tonen in mijn menu.
Momenteel is dit de hoofdquery die alle categorieen ophaalt:
SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias as content_alias
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7, 8)
AND cat.published = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC
Op de volgende manier stop ik dan alles in een menu:
<div id="main-menu" class="main-nav zn_mega_wrapper ">
<ul id="menu-main-menu" class="main-menu zn_mega_menu">
<li><a href="home">Home</a></li>
<?PHP
$alias = $_GET['alias'];
//Haal alle categorieen en check gelijk of de desbetreffende categorie artikelen onder zich heeft hangen.
$menu = "
SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias as content_alias
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7, 8)
AND cat.published = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC";
$menuconn = $conn->query($menu);
// Maak een nieuwe array om te vullen met onderstaand resultaat
$menuData = array(
'items' => array(),
'parents' => array()
);
// Maak een nieuwe array met simpelweg items en parents, welke gekoppeld zitten aan cat_id/parent_id
while($menu = $menuconn->fetch_assoc())
{
$menuData['items'][$menu['cat_id']] = $menu;
$menuData['parents'][$menu['parent_id']][] = $menu['cat_id'];
}
// Functie om menu te maken, $parentId is 1 (de categorieen die geen parent hebben)
function buildMenu($parentId, $menuData)
{
$html = '';
if (isset($menuData['parents'][$parentId]))
{
//Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat) anders een ul
if($parentId == '1'){
$html = '<li>';
}else{
$html = '<ul class="sub-menu">';
}
foreach ($menuData['parents'][$parentId] as $itemId)
{
$html .= '<li class="menu-item"><a href="info/'.$menuData['items'][$itemId]['cat_alias'].'">'.$menuData['items'][$itemId]['cat_title'].'</a>';
// Voer deze functie uit binnen de functie loop (recursief)
$html .= buildMenu($itemId, $menuData);
$html .= '</li>';
}
//Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat)
if($parentId == '1'){
$html .= '</li>';
}else{
$html .= '</ul>';
}
}
return $html;
}
// Echo het resultaat van de functie en geef 1 mee als parent_id
echo buildMenu(1, $menuData);
?>
</ul>
</div>
Nu probeer ik de artikelen op deze manier erbij te plaatsen:
<div id="main-menu" class="main-nav zn_mega_wrapper ">
<ul id="menu-main-menu" class="main-menu zn_mega_menu">
<li><a href="home">Home</a></li>
<?PHP
$alias = $_GET['alias'];
//Haal alle categorieen en check gelijk of de desbetreffende categorie artikelen onder zich heeft hangen.
$menu = "
SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias as content_alias
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7, 8)
AND cat.published = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC";
$menuconn = $conn->query($menu);
// Maak een nieuwe array om te vullen met onderstaand resultaat
$menuData = array(
'items' => array(),
'parents' => array()
);
// Maak een nieuwe array met simpelweg items en parents, welke gekoppeld zitten aan cat_id/parent_id
while($menu = $menuconn->fetch_assoc())
{
$menuData['items'][$menu['cat_id']] = $menu;
$menuData['parents'][$menu['parent_id']][] = $menu['cat_id'];
// Hier haal ik de artikelen onder de juiste categorie
$submenu = "SELECT * FROM snm_content WHERE catid = '".$conn->real_escape_string($menu['cat_id'])."' AND catid NOT IN (8) AND state = 1 ORDER BY ordering";
$submenuconn = $conn->query($submenu);
while($submenu = $submenuconn->fetch_assoc()){
$artikelsubs = '<li class="menu-item"><a href="info/'.$submenu['alias'].'">'.$submenu['title'].'</a>';
}
}
// Functie om menu te maken, $parentId is 1 (de categorieen die geen parent hebben)
function buildMenu($parentId, $menuData)
{
$html = '';
if (isset($menuData['parents'][$parentId]))
{
//Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat) anders een ul
if($parentId == '1'){
$html = '<li>';
}else{
$html = '<ul class="sub-menu">';
}
foreach ($menuData['parents'][$parentId] as $itemId)
{
$html .= '<li class="menu-item"><a href="info/'.$menuData['items'][$itemId]['cat_alias'].'">'.$menuData['items'][$itemId]['cat_title'].'</a>';
// Voer deze functie uit binnen de functie loop (recursief)
$html .= buildMenu($itemId, $menuData);
$html .= '</li>';
}
//Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat)
if($parentId == '1'){
$html .= '</li>';
$html .= $artikelsubs;
}else{
$html .= '</ul>';
}
}
return $html;
}
// Echo het resultaat van de functie en geef 1 mee als parent_id
echo buildMenu(1, $menuData);
?>
</ul>
</div>
Maar helaas zie ik niks in de broncode staan of op de website qua artikelen. Weet iemand waar het misgaat?
Als ik de query in phpmyadmin test met bijvoorbeeld '9' op de plaats van '".$conn->real_escape_string($menu['cat_id'])."' dan krijg ik de juiste data te zien.