(sub) Categorieen in webwinkel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Herbert Foppen

Herbert Foppen

23/12/2006 16:44:00
Quote Anchor link
Hoi allemaal,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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...
 
PHP hulp

PHP hulp

19/11/2024 10:33:21
 
Herbert Foppen

Herbert Foppen

27/12/2006 10:10:00
Quote Anchor link
Iemand die na de Kerst nog een goed idee voor mij heeft??
 
Martijn B

Martijn B

27/12/2006 10:51:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Hoofd category query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM categories WHERE parent_id = 0


sub category query (subcategorieën van category 1):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM categories WHERE parent_id = 1


Eventueel nog een order_nr kolom toevoegen voor de volgorde.
Dan wordt een hoofd category query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Robert Deiman

Robert Deiman

27/12/2006 15:03:00
Quote Anchor link
@Martijn!

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
while('haal_hoofdcategorie_op'){
    $query = "WHERE parent_id = hoofdcategorie_id";
   }

?>
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
Martijn B

Martijn B

27/12/2006 16:16:00
Quote Anchor link
Een aantal menu's kun je makkelijk met 1 query uit de database halen.

zo bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Tabel: categories
category_id - parent_id - order_nr - backtrace
10 - 4 - 1 - 1,4


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)
PHP script in nieuw venster Selecteer het PHP script
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
 
Herbert Foppen

Herbert Foppen

27/12/2006 16:33:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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`)
);


Huidige sql:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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) );
Gewijzigd op 01/01/1970 01:00:00 door Herbert Foppen
 
Martijn B

Martijn B

27/12/2006 16:44:00
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$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
 
Herbert Foppen

Herbert Foppen

27/12/2006 16:56:00
Quote Anchor link
Volgens mij gaan we langs elkaar heen...wat ik wil is gewoon dit:

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
 
Herbert Foppen

Herbert Foppen

27/12/2006 17:17:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 '&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;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 '&nbsp;&nbsp;--<a href="index.php?pagina=webwinkel&amp;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
 
Herbert Foppen

Herbert Foppen

27/12/2006 20:27:00
Quote Anchor link
Ik ben nog even aan het prutsen geweest en probeerde er een functie voor te maken.

De aanroep:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 '&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;cat='.stripslashes ( $aQueryCat['categorie_id'] ).'">'.stripslashes ( $aQueryCat['categorie_naam'] ).'</a><br />';
        bepaalSub($aQueryCat['categorie_id']);
    }

?>


Functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 '&nbsp;&nbsp;&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;cat='.stripslashes ( $QuerySub2['categorie_id'] ).'">'.stripslashes ( $QuerySub2['categorie_naam'] ).'</a><br />';

        while ($QuerySub4 = mysql_fetch_assoc ( $QuerySub3 ) )
        {
            echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-<a href="index.php?pagina=webwinkel&amp;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 Afbeelding knopje om je tekst aan te passen indien nodig.
Gewijzigd op 01/01/1970 01:00:00 door Herbert Foppen
 
Martijn B

Martijn B

27/12/2006 21:14:00
Quote Anchor link
Ik heb even een voorbeeldje gemaakt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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) . '&gt;' : '' ) , '<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
 
Herbert Foppen

Herbert Foppen

28/12/2006 11:56:00
Quote Anchor link
@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!!
 
Herbert Foppen

Herbert Foppen

04/01/2007 12:47:00
Quote Anchor link
Zou iemand hier nog naar kunnen/willen kijken!? Kom er zelf echt niet uit...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.