2013-03-13 50 views
0

我正在使用https://github.com/blt04/doctrine2-nestedset來管理我的分層數據。使用doctrine2-nestedset包裝li標籤的分層數據

它管理層次結構與以下數據庫結構:

categories 
-id 
-root 
-lft 
-rgt 
-name 

我需要包裝與Li的標籤的節點如下:

Vehicles 
    Bikes 
     Pulsor 
     Hero Honda 
    Automobiles 
    Trucks 

這束提供以下用於操作節點的方法:

$tree=fetchTreeAsArray($nodeId); //fetches tree for that node 
$node->getNumberDescendants(); //returns all descendants for that node 

更多關於方法的說明https://github.com/cbsi/doctrine2-nestedset/blob/master/README.markdown

我想環繞李標籤節點:

我試過至今:

  $tree = $nsm->fetchTreeAsArray(8); 
    $treeLiTags="<ul>"; 
    foreach ($tree as $node) { 
     $treeLiTags.="<li>".$node; 
     if ($node->hasChildren()) { 
      echo $node->getNumberDescendants(); 
      $treeLiTags.="<ul>"; 
      $closeParent=true; 
     } 
     else { 
      if ($closeParent && !$node->hasNextSibling()) { 
       $closeParent=false; 
       $treeLiTags.="</ul>"; 
      } 
      $treeLiTags.="</li>"; 
     } 
    } 
    $treeLiTags.="</ul>"; 
    echo $treeLiTags; 

這將返回如下:

Vehicles 
    Bikes 
     Pulsor 
     Hero Honda 
      250 cc 
     Automobiles 
     Trucks 

我應該得到:

Vehicles 
    Bikes 
     Pulsor 
     Hero Honda 
     250 cc 
    Automobiles 
    Trucks 

任何算法wou ld有幫助嗎?

回答

1

您是否考慮過使用Doctrine Extensions執行nested set (tree)

它已經實現你要實現的目標是什麼 - 你可以簡單地使用:

$repo = $em->getRepository('Entity\Category'); 
$options = array(
    'decorate' => true, 
    'rootOpen' => '<ul>', 
    'rootClose' => '</ul>', 
    'childOpen' => '<li>', 
    'childClose' => '</li>', 
    'nodeDecorator' => function($node) { 
     return '<a href="/page/'.$node['slug'].'">'.$node[$field].'</a>'; 
    } 
); 
$htmlTree = $repo->childrenHierarchy(
    null, /* starting from root nodes */ 
    false, /* load all children, not only direct */ 
    $options 
); 
+0

感謝鏈接嵌套集樹自述文件。我想我會嘗試這個擴展 – sonam