2011-08-30 5 views
6

J'ai la situation suivante. J'ai un modèle A avec les propriétés suivantes: id int nom varchar (255) parent_id int (référence même modèle A).Rendu d'arborescence récursif avec Agile Toolkit

Maintenant, j'ai besoin de rendre Tree View en utilisant cette ModelA. Bien sûr, je pourrais simplement charger toutes les données, les trier correctement par parent_id et les "rendre" en utilisant le collage de chaînes traditionnel. par exemple.

class Model_A extends Model_Table { 
... 

function render_branch($nodes, $parent){ 
    if (!isset($nodes[$parent])){ 
     return null; 
    } 
    $out = "<ul>"; 
    foreach ($nodes[$parent] as $node){ 
     $out .= "<li>" . $node["name"]; 
     $out .= $this->render_branch($nodes, $node["id"]); 
     $out .= "</li>"; 
    } 
    return $out; 
} 

function init(){ 
    parent::init(); 
    $nodes = array(); // preload from db and arrange so that key = parent and content is array of childs 
    $this->template->set("tree", $this->render_branch($nodes, 0)); 
} 

} 

maintenant, je voudrais plutôt utiliser atk4 natif listeuse/analyseur de modèle smlite dans le but. mais, si vous essayez de faire cela, alors vous finiriez avec lister méchant, où dans la ligne de format, vous essaieriez de toute façon de substituer la balise spécifique avec la sortie d'autres listeurs que vous deviez détruire pour annuler les débordements de mémoire d'exécution .

des suggestions?

p.s. code ci-dessus n'est pas testé, montre simplement le concept

merci!

+0

bien, après avoir passé un certain temps sur les options possibles, je trouve cela plus facile dans ce cas particulier est d'utiliser mentionnée ci-dessus par exemple. le seul moyen de le rendre plus natif serait d'utiliser un template externe pour les nœuds et d'utiliser smite et clone region + render pour déplacer html en dehors du template. En dehors de cela, l'utilisation de lister traditionnel ne semblait pas assez efficace. Ainsi, atk4 les gars, suivi avec le plugin de vue arborescence de la requête et créer le backend approprié! Ce serait cool. merci, j. – jancha

+1

S'il vous plaît ajouter votre solution comme une réponse ci-dessous et l'accepter. Cela marquera votre question comme résolue. Je vous remercie! – hakre

+0

Je n'accepterai pas ce que j'ai ci-dessus, parce que ce n'est pas une solution. Quand il y a une solution intégrée appropriée, je vais mettre à jour cette question avec une mise à jour appropriée. Jusqu'à présent, on peut supposer qu'il n'y a pas de solution intégrée au problème. – jancha

Répondre

0

Selon le commentaire de Jancha

bien, après avoir passé quelque temps à regarder les options possibles, je trouve que la chose la plus facile à faire dans ce cas particulier est d'utiliser mentionnée ci-dessus par exemple. La seule façon de le rendre plus natif serait d'utiliser un template externe pour les nœuds et d'utiliser smite et clone region + render pour déplacer html en dehors du template . En dehors de cela, l'utilisation de Lister traditionnel ne semble pas être suffisamment efficace. Ainsi, atk4 les gars, suivi avec l'arborescence de la requête plugin et créer le backend approprié! Ce serait cool. merci, j

.