Hoe kan ik dat het beste aanpakken?
Mijn database structuur is als volgt:
(tabelnaam van de categorieen) snm_categories
id - het id van de categorie
parent_id - het parent id van de categorie, deze is gelijk aan het id van een bepaalde categorie, hangt een categorie niet onder een andere categorie, dan is het parent_id altijd 1
level - het niveau van de categorie (top level is 1, hangt een categorie onder een topcategorie dan is die 2, hangt die onder een subcategorie dan is hij 3 enzovoort).
title - titel van de categorie
alias - alias van de categorie (de titel maar dan url friendly)
Momenteel haal ik op deze manier alle topcategorieen op:
(snm_content zijn artikelen/producten deze wil ik later ook kunnen hangen onder categorieen maar dat is voor nu even niet relevant)
<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)
AND cat.published = 1
AND cat.level = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC";
$menuconn = $conn->query($menu);
//Loop het resultaat
while($menu = $menuconn->fetch_assoc()){
//Code om te checken of de huidige pagina gelijk is aan de alias
if($menu['alias'] == $alias){
$class='current';
} else {
$class = '';
}
$menuresult .= '<li class="'.$class.' menu-item"><a href="'.$menu['cat_alias'].'">'.$menu['cat_title'].'</a>';
$menuresult .= '</li>';
}
echo $menuresult;
?>
<li><a href="contact">Contact</a></li>
</ul>
</div>
Dit was mijn menu code eerst (let niet op de slordigheid, het is meer als referentie hoe ik het eerst opgelost heb):
<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>
<?
$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)
AND cat.published = 1
AND cat.level = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC";
$menuconn = $conn->query($menu);
//Loop het resultaat
while($menu = $menuconn->fetch_assoc()){
$cat_ids = '';
$subcatmenulijst = '';
$subcats = '';
//Code om te checken of de huidige pagina gelijk is aan de alias
if($menu['alias'] == $alias){
$class='current';
} else {
$class = '';
}
//Stop alle ids van de categorieen in een array
$cat_ids[] = $menu['cat_id'];
//Implodeer ze met commas ertussen zodat ze bruikbaar zijn in een query
if(!empty($cat_ids)) {
$useableids = implode(',', $cat_ids);
}
// Query voor de subcats
$subcatmenu = 'SELECT * FROM snm_categories WHERE parent_id IN ('.$conn->real_escape_string($useableids).') and published = 1 ORDER BY lft';
$subcatmenucon = $conn->query($subcatmenu);
while($subcatmenu = $subcatmenucon->fetch_assoc()){
$subcatids[] = $subcatmenu['id'];
$subsubcatmenulijst = '';
$subsubartmenulijst = '';
if(!empty($subcatids)) {
$useablesubcatids = implode(',', $subcatids);
}
$subcatmenulijst .= '<li>';
$subcatmenulijst .= '<a href="'.$subcatmenu['alias'].'">'.$subcatmenu['title'].'</a>';
//Subsub categorieen
$subsubcatmenu = 'SELECT * FROM snm_categories WHERE parent_id IN ('.$conn->real_escape_string($useablesubcatids).') and published = 1 ORDER BY lft';
$subsubcatmenucon = $conn->query($subsubcatmenu);
while($subsubcatmenu = $subsubcatmenucon->fetch_assoc()){
$subsubcatmenulijst .= '<li><a href="'.$subsubcatmenu['alias'].'">'.$subsubcatmenu['title'].'</a></li>';
}
//Subsub artikelen
$subsubartmenu = '
SELECT ct.id, ct.title, ct.alias as content_alias, ct.ordering, ct.state, ct.catid, cat.alias as cat_alias
FROM snm_content ct
LEFT JOIN snm_categories cat
ON ct.catid = cat.id
WHERE ct.catid IN ('.$conn->real_escape_string($useablesubcatids).')
AND ct.state = 1
ORDER BY ct.ordering';
$subsubartmenucon = $conn->query($subsubartmenu);
while($subsubartmenu = $subsubartmenucon->fetch_assoc()){
$subsubartmenulijst .= '<li><a href="'.$subsubartmenu['cat_alias'].'/'.$subsubartmenu['content_alias'].'">'.$subsubartmenu['title'].'</a></li>';
}
// Wanneer er sub sub categorieen of artikelen zijn, laat deze dan zien
if($subsubcatmenucon->num_rows > 0 OR $subsubartmenucon->num_rows > 0){
$subcatmenulijst .= '<ul class="sub-menu">';
$subcatmenulijst .= $subsubcatmenulijst;
$subcatmenulijst .= $subsubartmenulijst;
$subcatmenulijst .= '</ul>';
}
$subcatmenulijst .= '</li>';
}
// Als
if(!empty($subcatmenulijst)){
$subcats = 'true';
}
//Loop alle categorieen
$menuresult .= '<li class="'.$class.' menu-item"><a href="'.$menu['cat_alias'].'">'.$menu['cat_title'].'</a>';
//Haal alle artikelen op waar het catid gelijk is aan het id van een categorie (binnen bovenstaande loop, zodat het gebeurd voor elke categorie)
$submenu = "SELECT * FROM snm_content WHERE catid = '".$conn->real_escape_string($menu['cat_id'])."' AND state = 1 ORDER BY ordering";
$submenuconn = $conn->query($submenu);
//Als er het id van een artikel niet leeg is (dus als er artikelen onder hangen) OF als er subcategorieeen aanwezig zijn:
if(!empty($menu['content_id']) OR $subcats == 'true'){
$menuresult .= '<ul class="sub-menu">';
//Loop het resultaat
while($submenu = $submenuconn->fetch_assoc()){
$menuresult .= '<li><a href="'.$menu['cat_alias'].'/'.$submenu['alias'].'">'.$submenu['title'].'</a></li>';
}
// Plak de categorieen onder artikelen
$menuresult .= $subcatmenulijst;
$menuresult .= '</ul>';
}
$menuresult .= '</li>';
}
echo $menuresult;
?>
<li><a href="contact">Contact</a></li>
</ul>
</div>