Catégorie illimité , sous-catégorie^n etc...

Résolu
tibine974 Messages postés 43 Date d'inscription jeudi 19 août 2004 Statut Membre Dernière intervention 15 novembre 2009 - 2 nov. 2006 à 13:12
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013 - 21 nov. 2006 à 21:28
Bonjour à tous !!

Voilà mon probléme je dois construire une application qui doit permettre d'ajouter des catégories , sous-catégorie, sous-sous-catégorie ( un nombre illimité avec des profondeurs aussi illimités ) .

ex :
<li>Cat A</li><li>Sous-Cat A_0</li><li>Sous-Cat A_1</li><li>Sous-sous Cat A_1_0</li><li>Sous-sous-sous Cat A_1_0_0</li><li>Sous-sous-sous Cat A_1_0_0
</li><li>etc...</li><li>Cat B</li><li>Cat C</li>Mais voilà je bloque sur la maniére de créer ma base et mes requêtes.
J'ai pensé que vu que je ne savais pas combien de catégorie , ss-cat etc... je comptais mettre tous dans une même table : voir ci dessous :

CREATETABLE`table`(
`cat_id`INT(5)NOTNULLAUTO_INCREMENTPRIMARYKEY,
`cat_libelle`VARCHAR(255)NOTNULL,
`cat_parent`INT(5)NOTNULL
)ENGINE=innodb;

Cat_parent  : pour l'élément qui correspond à une Catégorie, le cat_parent est égale à 0 . Pour les sous-cat , il correspondra à l'id de l'élément dont il est le parent.

Voici ma question : est-ce que ce systéme vous semble correct , sinon voyez-vous une autre solution ??

Merci d'avance pour les réponses positives ou négatives, car j'avoue bloquer .

10 réponses

JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
6 nov. 2006 à 00:59
Voilà... c'est un peu spaghetti, pas des masses commenté, mais ça a l'air de marcher


<?php

// objet "cat"

class cat{

    // variables

    var $id;

    var $nom;

    var $enfants;

    // constructeur

    function cat($id,$nom){

        $this->id = $id;

        $this->nom = $nom;

        $this->enfants = array();

    }

}

// fonction  de récursivité

function setchild($parent,$id_parent,$id,$nom){

    if($parent->id==$id_parent){

        // on set

        $parent->enfants[count($parent->enfants)] = new cat($id,$nom);

        return 1;

    }else{

        for($j=0;$j<count($parent->enfants);$j++){

            // on parcours les enfants et on applique la récurence

            if(setchild($parent->enfants[$j],$id_parent,$id,$nom)==1){

                // c'est bon

                return 1;

            }

        }

        return 0;

    }

}

// fonction d'affichage récursif

function display($parent){

    echo $parent->nom ."
";

    for($i=0;$i<count($parent->enfants);$i++){

        display($parent->enfants[$i]);

    }

}

// ouverture mysql

$db_link = mysql_connect("localhost","root","");

mysql_select_db("test");

$requete = mysql_query("select * from table_cat",$db_link)or die(mysql_error());

// conteneur des cats...

    $objs = array();

// on parcours les résultats

    for($i=0;$i<mysql_num_rows($requete);$i++){

        $nom = mysql_result($requete,$i,'nom');

        $id = mysql_result($requete,$i,'id');

        $parent = mysql_result($requete,$i,'parent');

        // on enregistre le nouvel objet...

        if($parent==0){

            $objs[count($objs)] = new cat($id,$nom);

        }else{

            // par récursivité on tente de trouver le parent

            for($j=0;$j<count($objs);$j++){

            // on parcours les enfants et on applique la récurence

            if(setchild($objs[$j],$parent,$id,$nom)==1){

                // c'est bon

                break;

            }

        }

        }

    }

// on devrait tout avoir...

// on affiche

    for($i=0;$i<count($objs);$i++){

        display($objs[$i]);

    }

// fermeture mysql

mysql_close($db_link);

?>


pour ce qui est de la table mysql:


"id";"nom";"parent"

"1";"cat1";"0"

"2";"cat2";"0"

"3";"cat3";"0"

"4";"subcat2.1";"2"

"5";"subcat1.1";"1"

"6";"subcat2.1.1";"4"

"7";"subcat1.2";"1"

"8";"subcat1.1.1";"5"


Voilà, n'hésite pas à demander si t'as rien compris, il est tard quand je poste...
3
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
2 nov. 2006 à 13:33
Je pense que c'est la seule façon que tu puisse utiliser. ça marche pas
trop mal (quand même pas mal de requetes pour tout récupérer et trier).


Après ce que tu peux faire pour éviter les requetes multiples est de
créer une classe catégorie qui comprenne un champ "sous_categories" qui
lui contien un nouvel élément catégorie. ça peut peut être t'éviter de
faire 300 requetes mysql, mais je ne suis sur de rien (pas testé).
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
2 nov. 2006 à 18:04
Hello,

je pense aussi que c'est la seule solution.
Mais j'éviterais les requêtes multiples pour trouver toutes les occurences liées à une catégorie. Je récupèrerais tout dans un tableau multidimensionnel, et ferais le tri en PHP (l'algo est simple, en php).
0
tibine974 Messages postés 43 Date d'inscription jeudi 19 août 2004 Statut Membre Dernière intervention 15 novembre 2009
2 nov. 2006 à 20:30
Re !

Tout d'abord merci pour les réponses ! Comme tu l'as dit malalam moi aussi j'ai pensé récupérer dans un tableau multidimensionnel. Mais voilà , un autre probléme survient comment trier ce dit tableau , voici ce que cela donne aprés la requête :

$stockage = array (
  array (1, "cat a",  0 )  ,
  array (2 , "cat b",  0 ) ,
  array (3 , "cat c",  0 ) ,
  array (4 , "sous-cat a_0",  1 ) ,
  array (5 , "sous-cat a_1",  1 ) ,
  array (6 , "sous-sous cat a_1_0",  5 ) ,
  array (7 , "sous-sous-sous cat a_1_0_0",  6 )
);

Je sais ensuite qu'il faut passer en boucle le tableau, mais à l'intérieur de la boucle je ne vois pas comment faire pour que le array1 recherche dans les autres array la valeur souhaité .

foreach ( $stockage as $tab => items ):

endforeach;

Si vous avez un début de réponse ou me proposer une démarche je suis preneur . merci d'avance

Meuh ! Fais la vache
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
3 nov. 2006 à 00:29
je reste convaincu que c'est possible (probablement plus simple) avec
des classes... donne moi un peut de temps que je te bricole quelque
chose...
0
tibine974 Messages postés 43 Date d'inscription jeudi 19 août 2004 Statut Membre Dernière intervention 15 novembre 2009
3 nov. 2006 à 06:13
Merci à toi de regarder mon probléme ! moi aussi de mon côté je continue de chercher.On se tient au courant :

Meuh ! Fais la vache
0
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
6 nov. 2006 à 01:01
Pour ce qui est du tri, tu tries les parents puis par récurence les enfants... tout ça dans la joie et la bonne humeur
0
tibine974 Messages postés 43 Date d'inscription jeudi 19 août 2004 Statut Membre Dernière intervention 15 novembre 2009
7 nov. 2006 à 07:12
Re !!
Je viens de regarder et tester ton code , cela à l'air de bien marcher . Merci encore d'avoir regardé mon probléme.

++

Meuh ! Fais la vache
0
prophete56 Messages postés 1 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 novembre 2006
20 nov. 2006 à 13:59
Salut

Je travaille sur un problème similaire mais je suis bloqué....

Je voudrais   
 - pouvoir deplacer par categories ou sous catégories
 - pouvoir ajouter un controle sur la suppression des catégories (si il existe des sous categories )

etc...
0
JulSoft Messages postés 354 Date d'inscription dimanche 3 juin 2001 Statut Membre Dernière intervention 11 mars 2013
21 nov. 2006 à 21:28
pour ce qui est de déplacer une catégorie, il suffit de changer le parent de l'élément concerné (les enfants suivent leurs parents, que c'est beau la famille...), pour supprimer cherche d'abord la liste des enfants et des générations suivantes puis supprime le tout (comme ça t'as personne perdu en pleine base de donnée, et pas de façon logique de les retrouver)
0
Rejoignez-nous