
Dit telt alleen de producten binnen de toplevel categorie. Terwijl er ook producten binnen subcategorieen kunnen staan, deze worden niet meegeteld.
Mijn structuur is nu als volgt:
categorie:
id - categorie id
parent_id - id van parent categorie (topcategory is altijd 1), dit is hetzelfde als het id van zijn parent categorie.
artikel(product)
id - id van het product
catid - id van de categorie waar hij onder hangt (zelfde als id van de categorie)
Dus als mijn data er zo uitziet:
categorie - wastafels - 2 producten
subcategorie - wastafelssub - 5 producten
subsubcategorie - wastafelssubsub - 2 producten
Met mijn huidige code krijg ik naast Wastafels een 2, maar ik zou willen dat hij alles optelt, dus dat er 9 komt te staan.
Dit is nu mijn code:
//Haal alle toplevel categorieen op
$pcat = "SELECT * FROM `snm_categories` WHERE published = 1 and level = 1 and id NOT IN (1) order by rgt ";
$pcatcon = $conn->query($pcat);
$catids = '';
while ($pcat = $pcatcon->fetch_assoc()){
$catids[] = $pcat['id'];
// Alle producten binnen bovenstaande categorieen
$aantal = "SELECT DISTINCT id FROM `snm_content` WHERE catid = ".$pcat['id']." and state = 1";
$aantalcon = $conn->query($aantal);
$aantal = $aantalcon->fetch_assoc();
if(is_null($aantal)){
$totaal = '';
}else{
$totaal = $aantalcon->num_rows;
}
if($totaal != 0){
$amount = '('.$totaal.')';
}else{
$amount = $totaal;
}
$productcatoverzicht .= '
<li class="cat-item"><a href="'.$pcat['alias'].'">'.$pcat['title'].'</a><span class="count">'.$amount.'</span></li>';
}
echo productcatoverzicht;
Moet ik dit net als mijn menu code recursief oplossen? Mijn menu code ziet er zo uit:
<?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
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="'.$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);
?>
Hoe kan ik dit het beste oplossen?