Bonjour a tous et toutes,

Voila j ai un petit soucis sûrement très débile mais je ne trouve pas comment faire, j'utilise le composant 'Tree' et j aimerai ajoute une categorie sans parent_id quand je le met a null ou 0 ca ne fonction pas... pourtant si je lui met une valeur la il n'y a aucun soucis.

Que doit on mettre au parent_id pour le mettre au plus haut niveau.

Merci de votre aide pour cette question surement tres bete =$

26 réponses


snap
Réponse acceptée

Dans ton cas l'id de la table correspond a l'id du joueur? esque c'est quand meme en clef primaire? ça peut peutetre creer des problème
le fait que lft et rgh sont a 0 est effectivement un bug.

sinon pour pas te prendre la tete tu creer une entrée Root avec une id particuliere dans ta bdd eout test t élément qui sont au top sont en fait des enfant de Root ça peut etre pratique pour plein de truc en plus.
Si tu ne veux pas cette solution tu peut aussi essayé de faire un $this->Model->recover(); apres ton save.

Salut à toi, en parent_id on doit effectivement mettre un 0. Peux-tu nous afficher un bout de ton code et la structure en base ?

pikadjou
Auteur

voici mon code:

$d'Joueur']'id'] = $this->Auth->user('id');
                      $d'Joueur']'login'] = $this->Auth->user('login');
                      $d'Joueur']'statut'] = 'membre';
                      $d'Joueur']'etat'] = 'protection';

                      $alliance = $this->Alliance->find('first', array(
                          'conditions' => array('name' => $d'Alliance']'name']),
                          'recursive' => -1,
                          'fields' => array('id')
                      ));

                      $d'Joueur']'alliances_id'] = $alliance'Alliance']'id'];
                      $id = $this->Role->find('first', array(
                           'conditions' => array('name' => 'Roi'),
                           'recursive' => -1));
                      $d'Joueur']'roles_id'] = $id'Role']'id'];
                      $d'Joueur']'parent_id'] = NULL;

                      $this->Joueur->save($d);

et ma base de donnee:

CREATE TABLE IF NOT EXISTS `joueurs` (
  `id` int(11) NOT NULL,
  `login` varchar(45) default NULL,
  `statut` varchar(45) default NULL,
  `etat` varchar(50) default NULL,
  `ligne` varchar(45) default NULL,
  `created` datetime default NULL,
  `alliances_id` int(11) default NULL,
  `roles_id` int(11) default NULL,
  `impot` int(11) NOT NULL,
  `lft` int(11) NOT NULL,
  `rght` int(11) NOT NULL,
  `parent_id` int(11) default NULL,
  `prod_or` int(11) NOT NULL,
  `prod_nourriture` int(11) NOT NULL,
  `prod_bois` int(11) NOT NULL,
  `prod_pierre` int(11) NOT NULL,
  `prod_chevaux` int(11) NOT NULL,
  `prod_PC` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `login_UNIQUE` (`login`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Je me permet de demander aussi pour le generateTreeList comment faire pour avoir le login sous forme de liste?

Merci de votre aide

Dans ton model est ce que tu as bien mis : $actsAs = array('Tree'); ?

Mets plutôt '0' pour parent_id au lieu de NULL.

pikadjou
Auteur
public $actsAs = array('Containable', 'Tree');

et meme avec '0' ca ne va pas :s

$d'Joueur']'parent_id'] = '0';

Après vérification tu peux mettre NULL en fait ^^.

Sinon tout me parait correct je ne vois pas pourquoi ton insertion ne fonctionne pas... Tu n'as vraiment pas d'insertion en base qui se fait ? Regarde dans les logs si tu n'as pas une erreur.

pikadjou
Auteur

si si justement tout le reste se met bien mais pour lft et rght il met 0 et parent_id il met null...

A bin c'est normal sa ! Si tu n'a pas de catégorie dans ta nouvelle catégorie il ne te modifiera pas lft et rght. Si tu ajoutes une catégorie à l'intérieur par contre il va s'en occuper tout seul normalement.

pikadjou
Auteur

je test ca

pikadjou
Auteur

non ca ne fonctionne pas il doit directement les mettrent convenablement meme si la categorie est au niveau supperieur.

Il faut que l'id_parent que tu lui renseigne corresponde à la catégorie parente. C'est le cas ?

pikadjou
Auteur

oui oui cela ca marche sans soucis mais si je veux ajouter une categorie qui n'a pas de parent la ca plante.

Sa plante c'est à dire ? Tu n'as pas une erreur sur ta page ou dans les logs ? Met ton debug en niveau 2 peut être aussi pour afficher les erreurs si l'application t'en retourne.

pikadjou
Auteur

Je m'exprime mal dsl, que je dis que ca plante en fait ca enregistre bien dans la bdd mais ca met lft et rght a 0 du coup l arbre n'est plus respecter :s

Sinon aucunes erreurs dans les logs ni sur la page.

Mais si c'est bon ^^. En fait sa met 0 parce que tu n'as pas de sous catégorie. Le lft et rght changeront quand tu aura une sous catégorie à l'intérieur.

pikadjou
Auteur

Pourtant, quand je rentre 2 enregistrements:

  1. id => 23 , lft => 0, rght => 0, parent_id => NULL
  2. id => 26 , lft => 0, rght => 0, parent_id => NULL

or si je met l'id 23 en sous categorie de l id 26 ca me donne:

  1. id => 23 , lft => 0, rght => 1, parent_id => 26
  2. id => 26 , lft => 2, rght => 2, parent_id => NULL

Ce n'est pas a toi de spécifier les lft et rght sinon tu vas le perdre.
Tu as uniquement un save à faire en spécifiant l'id_parent.

Si tu veux mettre l'id 26 dans l'id 23, tu fais un save de ta catégorie 26 avec id_parent = 23 et rien de plus à par son nom etc...
Sa devrait donc te faire quelque chose du genre :

id 23 => parent_id : 0 | lft : 1 | rght : 2
id 26 => parent_id : 23 | lft : 0 | rght : 0

pikadjou
Auteur

oui oui ici c est ce que la bdd écrit moi je ne spécifie que le parent_id.
et normalement ca ne doit pas donner:

id 23 => parent_id : 0 | lft : 1 | rght : 4
id 26 => parent_id : 23 | lft : 2 | rght : 3

Possible je n'ai plus le fonctionnement exact des lft/rght en tête. Mais quand tu fais un generateTreeList sa te donne la bonne arborescence ?

pikadjou
Auteur

non

Un peu plus de précisions stp ^^ Tu as quoi en retour ?

pikadjou
Auteur

Lorsque les 2 categories sont sans parent id ca me donne ca:

Array
(
    [25] => 25
    [23] => -------->23
)

lorsque je met une en dessous de l autre ca me donne:

Array
(
    [23] => 23
    [25] => 25
)

oO Bin la je comprend pas... Si tes parent_id sont renseignés comme il faut il n'y a aucune raison que sa ne sorte pas les bons résultats...

pikadjou
Auteur

sur le premiere test les 2 parent_id etait nul et les 2 lft et rght etait a 0

sur le 2ieme:

id lft rght parent_id 
25 2 2 NULL 
23 0 1 25

Il me semble que tu devrais avoir ceci :

id lft rght parent_id 
25 1 4 NULL    
23 2 3 25
pikadjou
Auteur

Oui l'id est bien primaire mais pas en AUTO_INCREMENT.

En effet l'idee du root serai un super alternative pour moi je pense que je vais faire avec le root. Un enorme merci pour l'aide.