ik ben bezig met een webwinkel, en nu heb ik een tweetal dingen waar ik niet uitkom:
1. Menu
Ik wil graag subcategorieen kunnen gebruiken. Heb een tabel met 3 velden: id, naam, parent. Huigde SQL:
$rQueryCat = mysql_query ( "SELECT *
FROM products_categorieen
WHERE categorie_id IN
(SELECT categorie_parent
FROM products_categorieen
WHERE categorie_parent != 0)
ORDER BY categorie_naam ASC ")
Nu krijg ik dus wel de hoofdcategorieen, maar niet de subs. En ik wil dit tot een aantal niveau's kunnen doen. Hoe kan ik dit wel doen??
2. Subpagina
Ik heb in mijn db nu het volgende:
Hoofd_1
Sub_1A
Sub_1B
Hoofd_2
Sub_2A
Sub_2B
Wanneer ik nu bijv. Hoofd_2 aanklik wil ik daar een aparte pagina hebben. Ook als ik op bijv. Sub_2A klik, zou ik nu daar de producten krijgen. Als ik echter een Sub_2_1A zou maken, dan wil ik een ander soort pagina hebben...
Misschien wat vaag omschreven maar dat komt later wel anders...vraag 1 vind ik belangrijker :)
sub category query (subcategorieën van category 1):
SELECT * FROM categories WHERE parent_id = 1
Eventueel nog een order_nr kolom toevoegen voor de volgorde.
Dan wordt een hoofd category query:
SELECT * FROM categories WHERE parent_id = 0 ORDER BY order_nr
Van kolommen parent_id en order_nr moet je een index maken.
edit:
Een hele mooie optie is om een subcategorie te kunnen koppelen aan meerdere parents. Want je hebt soms subcategorieën die je bij meerdere hoofdcategorieën kunt indelen.
Begrijp ik het dan goed dat je in een while lus elke keer de subcategorien ophaalt die onder de categorie vallen die je in de while lus aan het ophalen bent?
Een aantal menu's kun je makkelijk met 1 query uit de database halen.
zo bijvoorbeeld:
SELECT * FROM categories WHERE parent_id IN (0,1,4) ORDER BY parent_id, order_nr
Die 1,4 zie je dan ergens in het URL. Om het resultaat te laten zien zou je een recursieve functie kunnen gebruiken.
Met de query hierboven laten we eigenlijk categorie 10 zien en alle parents daarvan. Je hebt dan bijvoorbeeld dit URL "categorie.php?p=1,4".
Je zou die "1,4" ook in een aparte kolom kunnen opslaan, dus:
Voordeel hiervan is dat je niet je hele URL vol hebt met nummers maar gewoon 1 nummer hebt (het categorieID).
Het URL wordt dan bijvoorbeeld "categorie.php?c=10".
De qeury wordt dan:
SELECT * FROM categories WHERE parent_id IN (SELECT backtrace FROM categories WHERE category_id = 10) ORDER BY parent_id, order_nr
Misschien dat je er beter 2 queries van kunt maken. Zelf heb ik er twee van gemaakt.
Ik snap je bedoeling, maar nog niet helemaal hoe ik het nu moet doen. Het voordeel hiervan, is dus dat een bepaalde categorie onder A kan vallen, maar ook onder G (ik noem maar wat).
Huidige db:
CREATE TABLE `products_categorieen` (
`categorie_id` int(5) NOT NULL auto_increment,
`categorie_naam` varchar(255) NOT NULL default '',
`categorie_parent` int(5) NOT NULL default '0',
PRIMARY KEY (`categorie_id`)
);
Huidige sql:
$rQueryCat = mysql_query ("SELECT * FROM products_categorieen
WHERE categorie_id IN
(SELECT categorie_parent
FROM products_categorieen
WHERE categorie_parent != 0)
ORDER BY categorie_naam ASC ") or die (mysql_error) );
Het voordeel hiervan, is dus dat een bepaalde categorie onder A kan vallen, maar ook onder G (ik noem maar wat).
Daar heb ik het helemaal nog niet over gehad :D
Hiervoor zul je een aparte tabel moeten maken denk ik. Maar daar ben ik zelf ook nog niet uit.
SELECT * FROM products_categorieen
WHERE categorie_id IN
(SELECT categorie_parent
FROM products_categorieen
WHERE categorie_parent != 0)
ORDER BY categorie_naam ASC
Hier heb je helemaal geen subquery nodig omdat je deze info uit $_GET haalt.
Bijvoorbeeld (kort door de bocht): categorie.php?menus=1,2,3
<?php
$sQuery = 'SELECT * FROM products_categorieen
WHERE categorie_parent IN
(' . $_GET['menus'] . ')
ORDER BY categorie_naam ASC'
?>
Ik ben nog even aan het prutsen geweest en probeerde er een functie voor te maken.
De aanroep:
<?php
$rQueryCat = mysql_query ( "SELECT *
FROM products_categorieen
WHERE categorie_parent = 0
ORDER BY categorie_naam ASC ") or die ( mysql_error() );
while ( $aQueryCat = mysql_fetch_assoc ( $rQueryCat ) )
{
echo ' -<a href="index.php?pagina=webwinkel&cat='.stripslashes ( $aQueryCat['categorie_id'] ).'">'.stripslashes ( $aQueryCat['categorie_naam'] ).'</a><br />';
bepaalSub($aQueryCat['categorie_id']);
}
?>
Functie:
function bepaalSub($parent_id)
{
$QuerySub = mysql_query ( "SELECT * FROM products_categorieen WHERE categorie_parent = ". $parent_id ."
ORDER BY categorie_naam ASC ") or die ( mysql_error() );
while ( $QuerySub2 = mysql_fetch_assoc ( $QuerySub ) )
{
$QuerySub3 = mysql_query ( "SELECT * FROM products_categorieen WHERE categorie_parent = ". $QuerySub2['categorie_id'] ."
ORDER BY categorie_naam ASC ") or die ( mysql_error() );
echo ' -<a href="index.php?pagina=webwinkel&cat='.stripslashes ( $QuerySub2['categorie_id'] ).'">'.stripslashes ( $QuerySub2['categorie_naam'] ).'</a><br />';
while ($QuerySub4 = mysql_fetch_assoc ( $QuerySub3 ) )
{
echo ' -<a href="index.php?pagina=webwinkel&cat='.stripslashes ( $QuerySub4['categorie_id'] ).'">'.stripslashes ( $QuerySub4['categorie_naam'] ).'</a><br />';
}
}
}
Toch werkt dit niet zoals ik wil...ik wil onbeperkte subs tonen. Maar dan zou je de functie nogmaals moeten aanroepen. Wie weet raad??
mod-edit:
Bumpen
Bumpen is het herhaaldelijk posten in je eigen topic om hem weer bovenaan in de lijst te krijgen. Omdat het zéér opdringerig overkomt is bumpen is pas na 24 uur toegestaan. Bumpen kan een reden zijn voor de admins en mods om een topic te sluiten. Gebruik het knopje om je tekst aan te passen indien nodig.
We roepen de functie show_tree steeds recursief aan hierdoor kun je oneindig veel submenu's hebben. Je zou deze functie in een klasse kunnen maken en dan van de parameter $_aCat een attribuut maken. Omdat we steeds de functie aanroepen kopiëren we steeds $_aCat, dit is niet de beste manier.