Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
bonjour,
j'utilise actuellement les technologies flex et zend pour le dev. d'application spécifiques.
je souhaiterai récupérer des catégories dans ma DB ,
puis les retourner sous forme d'xml pour les gerer dans un tree.
tout se passe bien sauf que mes boucles de construction du xml s'arrête au premier enregistrement parent :
public function selectCategorie()
{
$table = new TCategorie();
$select = $table->select()->from($table, '*' );
$liste = $table->fetchAll($select);
$xmlSortie = '<?xml version="1.0" encoding="utf-8"?>';
foreach ($liste as $ligne)
{
if($ligne->parent_id == 0){
$xmlSortie .= '<node id="'.$ligne->id.'" label="'.$ligne->nom.'">';
//on ajoute les enfants
foreach ($liste as $ligneEnf)
{
if($ligneEnf->parent_id == $ligne->id) $xmlSortie .= '<node id="'.$ligneEnf->id.'" label="'.$ligneEnf->nom.'" />';
}
$xmlSortie .= '</node>';
}
}
return $xmlSortie;
}
le résultat :
<?xml version="1.0" encoding="utf-8"?>
<node id="1" label="Achat">
<node id="2" label="Information" />
<node id="3" label="Interim" />
</node>
et il manque :
<node id="4" label="Direction">
<node id="5" label="test" />
</node>
par avance merci pour vos réponses !
Dernière modification par Aliong (12-05-2009 15:21:00)
Hors ligne
manque des informations : contenu de la base car la on sait pas ou doit aller les nodes 4 et 5.
Ensuite regardes du coté de la récursivité pour gérer le multiniveau ou alors du coté de la représentation intervalaire
recherches des items sans parents (i.e. parent_id == 0) pour chacun de ces items recherche des items ayant pour parent_id id si recherche retourne au moins un resultat ouverture balise node parcours des resultats de la 2eme recherche ajout du node fin parcours fermeture balise node sinon ajout d'un node fin si fin pour
c'est l'idée de base à factoriser
Dernière modification par ndesaleux (11-05-2009 23:06:48)
Hors ligne
merci pour ta rapidité de réponse, en effet il y a peu d'élément mais la j'ai rien sous les yeux donc coté flex de toute facon ça n'a auun impact sur le resultat de cette fonction sinon coté base de donnee c'est une simple table :
CREATE TABLE categorie (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(100),
parent_id INTEGER NOT NULL
);
contenu
id nom parent_id
1 Achat 0
2 Information 1
3 Interim 1
4 Direction 0
5 test 4
je crois avoir trouvé mon erreur en écrivant ces lignes de tête, je vérifie demain ,
si c'est ce que je pense le code n'a rien à voir en faite j'ai pas mis 4 en parent_id de test mais 2 je crois !
je regarde demain et rectifie si c'est le cas excusez moi pour le dérangement !
cordialement,
Hors ligne
ndesaleux a écrit:
Code:
recherches des items sans parents (i.e. parent_id == 0) pour chacun de ces items recherche des items ayant pour parent_id id si recherche retourne au moins un resultat ouverture balise node parcours des resultats de la 2eme recherche ajout du node fin parcours fermeture balise node sinon ajout d'un node fin si fin pour
re bonjour,
donc j'ai bien regardé j'avais une erreur sur le dernière item qui n'avait pas le bon parent_id, par contre cette fois si tout es ok coté données, et pourtant il me manque toujours le dernier résultat. comme si il n'exécutait pas la première boucle après avoir remplie la première condition .
pour info j'ai bien regardé ce que tu m'as donné comme piste, et c'est exactement ce que je fais dans le code... d'autre piste ?
Dernière modification par Aliong (12-05-2009 10:31:45)
Hors ligne
bon j'ai fini par trouver :
public function selectCategorie() { $table = new TCategorie(); $select = $table->select()->from($table, '*' ); $liste = $table->fetchAll($select); $xmlSortie = '<?xml version="1.0" encoding="utf-8"?>'; for ($i=0; $i<count($liste); $i++) { if($liste[$i]['parent_id'] == 0){ $xmlSortie .= '<node id="'.$liste[$i]['id'].'" label="'.$liste[$i]['nom'].'">'; //on ajoute les enfants for ($j=0; $j < count($liste); $j++) { if($liste[$j]['parent_id'] ==$liste[$i]['id']) { $xmlSortie .= '<node id="'.$liste[$j]['id'].'" label="'.$liste[$j]['nom'].'" />'; } } $xmlSortie .= '</node>'; } } return $xmlSortie; }
deux foreach imbriqués ne fonctionnent pas il sort de la première boucle après avoir exécuté la seconde. donc deux bonne boucle a l'ancienne et tout fonctionne normalement ... si quelqu'un à une explication je suis preneur . merci
Dernière modification par Aliong (12-05-2009 11:06:40)
Hors ligne
Tu avais fait un erreur de conception, i.e. tu parcours la même liste 2 fois en les imbriquant, ce qui fait que lors de ta 2ème boucle, tu finis ta liste donc tu sors de ta première boucle. C'est un fonctionnement tout a fait normal.
Dans ton système, tu parcours des éléments qui n'ont pas à être parcouru.
Tout d'abord, tu devrais récupérer seulement les items n'ayant pas de parent.
pour chacun des items de cette liste
tu récuperes les enfants de cet item
pour chaque item tu refais la meme chose et ce tant que tu as des enfants.
donc tu feras plus de requetes mais tes requetes ne retourneront que les items à parcourir, de plus cela te permet de gérer une descendance de niveau X et non 2 comme ce que tu fais actuellement.
je m'auto cite
Ensuite regardes du coté de la récursivité pour gérer le multiniveau ou alors du coté de la représentation intervalaire
Hors ligne
tu as tout à fait raison et je vais faire plus simple un fonction qui retour un tableau d'enfant suivant l'parent_id
et depuis flex dans le Tree j'appelle cette fonction quand je sélectionne un item puis j'ajoute le retour en enfant .
merci pour ton aide
Hors ligne
Pages: 1