(sub) Categorieen in webwinkel
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:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$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 :)
Tnx alvast...
Iemand die na de Kerst nog een goed idee voor mij heeft??
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Tabel: categories
category_id - parent_id - order_nr
1 - 0 - 1
2 - 0 - 2
3 - 0 - 3
4 - 1 - 1
5 - 1 - 2
6 - 2 - 1
7 - 2 - 2
8 - 3 - 1
9 - 3 - 2
10 - 4 - 1
category_id - parent_id - order_nr
1 - 0 - 1
2 - 0 - 2
3 - 0 - 3
4 - 1 - 1
5 - 1 - 2
6 - 2 - 1
7 - 2 - 2
8 - 3 - 1
9 - 3 - 2
10 - 4 - 1
Hoofd category query:
sub category query (subcategorieën van category 1):
Eventueel nog een order_nr kolom toevoegen voor de volgorde.
Dan wordt een hoofd category query:
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.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
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?
Code (php)
1
2
3
4
5
2
3
4
5
<?php
while('haal_hoofdcategorie_op'){
$query = "WHERE parent_id = hoofdcategorie_id";
}
?>
while('haal_hoofdcategorie_op'){
$query = "WHERE parent_id = hoofdcategorie_id";
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
zo bijvoorbeeld:
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:
Code (php)
1
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.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Huidige db:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
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`)
);
`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:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$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) );
WHERE categorie_id IN
(SELECT categorie_parent
FROM products_categorieen
WHERE categorie_parent != 0)
ORDER BY categorie_naam ASC ") or die (mysql_error) );
Gewijzigd op 01/01/1970 01:00:00 door Herbert Foppen
Quote:
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.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT * FROM products_categorieen
WHERE categorie_id IN
(SELECT categorie_parent
FROM products_categorieen
WHERE categorie_parent != 0)
ORDER BY categorie_naam ASC
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
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sQuery = 'SELECT * FROM products_categorieen
WHERE categorie_parent IN
(' . $_GET['menus'] . ')
ORDER BY categorie_naam ASC'
?>
$sQuery = 'SELECT * FROM products_categorieen
WHERE categorie_parent IN
(' . $_GET['menus'] . ')
ORDER BY categorie_naam ASC'
?>
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Cat. 1
- Subcat 1A
- Subcat 1B
Cat. 2
- Subcat 2A
> Subcat 2A_1
> Subcat 2A_2
- Subcat 2B
etc...een sub hoeft niet onder meerdere te vallen! Dat kan altijd nog ;)
Gewijzigd op 01/01/1970 01:00:00 door Herbert Foppen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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 />';
$QuerySub = mysql_query ( "SELECT *
FROM products_categorieen
WHERE categorie_parent = ". $aQueryCat['categorie_id'] ."
ORDER BY categorie_naam ASC ") or die ( mysql_error() );
while ( $QuerySub2 = mysql_fetch_assoc ( $QuerySub ) )
{
echo ' --<a href="index.php?pagina=webwinkel&cat='.stripslashes ( $QuerySub2['categorie_id'] ).'">'.stripslashes ( $QuerySub2['categorie_naam'] ).'</a><br />';
}
}
?>
$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 />';
$QuerySub = mysql_query ( "SELECT *
FROM products_categorieen
WHERE categorie_parent = ". $aQueryCat['categorie_id'] ."
ORDER BY categorie_naam ASC ") or die ( mysql_error() );
while ( $QuerySub2 = mysql_fetch_assoc ( $QuerySub ) )
{
echo ' --<a href="index.php?pagina=webwinkel&cat='.stripslashes ( $QuerySub2['categorie_id'] ).'">'.stripslashes ( $QuerySub2['categorie_naam'] ).'</a><br />';
}
}
?>
alleen nu de vraag:
1. Dit werkt tot 1 niveau...hoe krijg ik dit voor meerdere niveau's??
2. Hoe krijg ik die tussenpagina's?
Gewijzigd op 01/01/1970 01:00:00 door Herbert Foppen
De aanroep:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?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']);
}
?>
$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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 />';
}
}
}
{
$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.
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.
Gewijzigd op 01/01/1970 01:00:00 door Herbert Foppen
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
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
<?php
error_reporting(E_ALL);
# De sleutels zijn dus de parentIDs
$aCat = array(
0 => array( array('catID' => '1', 'naam' => 'categorie 1'),
array('catID' => '2', 'naam' => 'categorie 2'),
array('catID' => '3', 'naam' => 'categorie 3')),
1 => array( array('catID' => '4', 'naam' => 'categorie 4'),
array('catID' => '5', 'naam' => 'categorie 5'),
array('catID' => '6', 'naam' => 'categorie 6')),
2 => array( array('catID' => '7', 'naam' => 'categorie 7'),
array('catID' => '8', 'naam' => 'categorie 8'),
array('catID' => '9', 'naam' => 'categorie 9')),
3 => array( array('catID' => '10', 'naam' => 'categorie 10'),
array('catID' => '11', 'naam' => 'categorie 11'),
array('catID' => '12', 'naam' => 'categorie 12')),
10=> array( array('catID' => '13', 'naam' => 'categorie 13'),
array('catID' => '14', 'naam' => 'categorie 14'),
array('catID' => '15', 'naam' => 'categorie 15')),
4=> array( array('catID' => '16', 'naam' => 'categorie 16')),
16=> array( array('catID' => '17', 'naam' => 'categorie 17')),
17=> array( array('catID' => '18', 'naam' => 'categorie 18')),
18=> array( array('catID' => '19', 'naam' => 'categorie 19')),
19=> array( array('catID' => '20', 'naam' => 'categorie 20')),
20=> array( array('catID' => '21', 'naam' => 'categorie 21'))
);
function show_tree( $_aCat, $_iParent = 0 )
{
static $iLevel = 0;
foreach( $_aCat[$_iParent] as $v )
{
echo ( $iLevel > 0 ? str_repeat('--', $iLevel) . '>' : '' ) , '<a href="' , $v['catID'] , '">' , $v['naam'] , '</a><br />';
if( !empty($_aCat[$v['catID']]) )
{
$iLevel++;
show_tree($_aCat, $v['catID']);
$iLevel--;
}
}
} # end function show_tree
show_tree($aCat);
?>
error_reporting(E_ALL);
# De sleutels zijn dus de parentIDs
$aCat = array(
0 => array( array('catID' => '1', 'naam' => 'categorie 1'),
array('catID' => '2', 'naam' => 'categorie 2'),
array('catID' => '3', 'naam' => 'categorie 3')),
1 => array( array('catID' => '4', 'naam' => 'categorie 4'),
array('catID' => '5', 'naam' => 'categorie 5'),
array('catID' => '6', 'naam' => 'categorie 6')),
2 => array( array('catID' => '7', 'naam' => 'categorie 7'),
array('catID' => '8', 'naam' => 'categorie 8'),
array('catID' => '9', 'naam' => 'categorie 9')),
3 => array( array('catID' => '10', 'naam' => 'categorie 10'),
array('catID' => '11', 'naam' => 'categorie 11'),
array('catID' => '12', 'naam' => 'categorie 12')),
10=> array( array('catID' => '13', 'naam' => 'categorie 13'),
array('catID' => '14', 'naam' => 'categorie 14'),
array('catID' => '15', 'naam' => 'categorie 15')),
4=> array( array('catID' => '16', 'naam' => 'categorie 16')),
16=> array( array('catID' => '17', 'naam' => 'categorie 17')),
17=> array( array('catID' => '18', 'naam' => 'categorie 18')),
18=> array( array('catID' => '19', 'naam' => 'categorie 19')),
19=> array( array('catID' => '20', 'naam' => 'categorie 20')),
20=> array( array('catID' => '21', 'naam' => 'categorie 21'))
);
function show_tree( $_aCat, $_iParent = 0 )
{
static $iLevel = 0;
foreach( $_aCat[$_iParent] as $v )
{
echo ( $iLevel > 0 ? str_repeat('--', $iLevel) . '>' : '' ) , '<a href="' , $v['catID'] , '">' , $v['naam'] , '</a><br />';
if( !empty($_aCat[$v['catID']]) )
{
$iLevel++;
show_tree($_aCat, $v['catID']);
$iLevel--;
}
}
} # end function show_tree
show_tree($aCat);
?>
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.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
@Martijn, tnx voor je voorbeeld. Alleen zie ik nog niet hoe ik dit kan combineren met mijn db. Kun je me hiermee nog helpen? Structuur van de db staat in een eerder bericht van mij!!
Zou iemand hier nog naar kunnen/willen kijken!? Kom er zelf echt niet uit...