IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Liste de catégories dynamique, triable, indentable. Sans réinventer la roue [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 94
    Points
    94
    Par défaut Liste de catégories dynamique, triable, indentable. Sans réinventer la roue
    Bonjour,

    J'ai une base de données mysql, avec une table organisée comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Id | Nom | idparent | ordre
    Tout fonctionne très bien, le résultat donne un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     - Catégorie 1
     - - sous cat 1.1
     - - sous cat 1.2
     - - sous sous cat 1.2.1
     - - sous cat 1.3
     - catégorie 2
     ....

    Partant de là j'aimerai créer une interface pour modifier cette liste, à l'aide d'Ajax. Que je puisse intenter une branche, en remonter une, etc c'est à dire en indentant 'sous cat 1.3', il serait enfant de sous sous cat 1.2.1 par exemple.

    Est-ce qu'il espxiste déjà des scripts pour faire ça?

    Merci, Cédric

  2. #2
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Bonjour,

    Je pense que ce n'est pas la bonne approche en terme de base de données... Le problème c'est que c'est connu mais chiant à implementer.

    Regardes du côté des modèles de gestion de données hierachiques.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 94
    Points
    94
    Par défaut
    Je me suis mal exprimé. La structure de la base est fixé, je ne peux pas la modifier.

    C'est surtout une méthode pour le user qui doit modifier la liste que je cherche.

    En fait ce sont des longues table des matières qui sont importées, et qu'il faut mettre en forme de parent-enfant. Et difficulté supplémentaires ces tables des matières sont sujettes à modifications fréquentes des ouvrages (des règlements en fait).

    Actuellement on modifie un élément en sélectionnant le parent, et l'ordre, c'est tout sauf pratique.

    Cédric

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Salut,

    Où coince tu ? Pour créer l'interface de gestion de ton menu, pour les interactions ou pour enregistrer les modifs ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 94
    Points
    94
    Par défaut
    Dans l'interface. Mais ce n'est pas un menu, vraiment un moyen de rapidement hiérarchiser les chapitres.

    Dans mes rêves les plus fous j'imagine une liste d'éléments empilés que je peux drag and droper de haut en bas ou déplacer de gauche à droite pour créer des sous catégories .... Avec bootstrap.....

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Donc le problème, ce n'est pas tant la base de données que faire une interface qui recalcule toute seule les parents. Quelque chose comme ça peut-être : https://github.com/gilek/bootstrap-gtreetable ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Merci Célira de tes tuyaux.
    Moi, je voudrais juste vérifier quelque chose, encore côté db, pelloq1, peux-tu nous montrer la requête SQL qui renvoie ton résultat ?

    - Catégorie 1
    - - sous cat 1.1
    - - sous cat 1.2
    - - sous sous cat 1.2.1
    - - sous cat 1.3
    - catégorie 2
    ....
    Ta table est ce qu'on appelle une table avec une auto-jointure, un truc très classique pour une structure hiérarchique.
    Il faut donc bien vérifier que
    1) il y a une clé interne qui dit que le champ idparent est toujours un truc qui existe déjà dans id, mais il a aussi le droit d'être nul (voir 2).
    2) Seul le noeud tout au sommet, dans ton cas qui n'existerait qu'abstraitement, aurait un parent NULL. Appelle le racine par exemple.
    3) Ce qui te permet ensuite de poser les actions à mener en cascade, en cas d'update, en cas de delete... Le plus souvent, on cascade update, mais surtout, on delete, do nothing, parce que quand on veut deleter un champ parent, il faudra vérifier via le code que l'on veut bien deleter le parent ET tous ses enfants, et pas le faire direct dans la base sans sécurité.

    Parce que si on fait ce genre de table sans utiliser cette clé d'auto-jointure, on ne pourra guère en profiter, de tout le côté pratique en cascade (gérés directement dans la base) des noeuds enfants en cas de changement.

    J'ai une autre question : tes profondeurs de noeuds sont toujours mobiles, genre de 1 à n, ou bien tu ne descends jamais en dessous du niveau "sous sous cat 1.2.1" (4 noeuds maxi tout au plus) ?
    Si tu réponds, je te dirai pourquoi je pose la question, qui a une très grande importance.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 94
    Points
    94
    Par défaut
    Merci Celira, c'est bien cela qu'il me falait.

    Mainteant au niveau achitecture de la table, voilà:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `pec_documentation` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `ordering` INT(11)  NOT NULL ,
    `id_parent` INT NOT NULL ,
    `chapitre` VARCHAR(255)  NOT NULL ,
    `titre` VARCHAR(255)  NOT NULL ,
    `original` TEXT NOT NULL ,
    PRIMARY KEY (`id`)
    ) DEFAULT COLLATE=utf8_general_ci;

    Le champs ordering permet de trier les éléments dans un sous niveau.

    Pour construire l'arborescence, je fait tout d'abord un (les syntaxes sont peut etre pas juste car j'utilise une API ...):

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select id as catid, id_parent as parentid, titre as title, ordering from pec_documentation order ordering

    puis une fonction récursive qui me crée l'arbre:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	protected function _getChildCatOf($categoryList, &$par, &$vRes, $indent){
    		if(count($categoryList) > 0) {
    	    	foreach($categoryList as $category) {
    				if($category->parentid == $par) {
    		    		$vRes[] = JHTML::_('select.option', $category->catid, $indent.stripcslashes( stripslashes( stripslashes($category->title)))) ;
    					$this->_getChildCatOf($categoryList, $category->catid, $vRes, $indent);
    				}
    	    	}
    		}
    	}
    Voilà, je suis curieux de voir la réaction insurgée de Dendrite !

    Cédric

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/01/2013, 10h55
  2. Ember.js, développez des applications Web facilement sans réinventer la roue
    Par vermine dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 22/01/2013, 10h55
  3. Peut on encore innover en informatique « sans réinventer la roue » ?
    Par Idelways dans le forum Humour Informatique
    Réponses: 35
    Dernier message: 09/10/2011, 00h00
  4. Réponses: 0
    Dernier message: 01/03/2011, 10h39
  5. Réponses: 10
    Dernier message: 04/05/2004, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo