2012-10-28 105 views
4

我使用Yii的組嵌套的行爲,這有助於我保持我的嵌套類爲在這裏看到(請不要介意標題行,他們是在俄羅斯):enter image description hereYii的嵌套設置下拉菜單

所有我想要做的就是有引導嵌套的菜單,這應該是這樣的:

$criteria = new CDbCriteria; 
    $criteria->order = 'root, lft'; 
    $categories = Category::model()->findAll($criteria); 
    foreach($categories as $i => $category) { 
     $items[$i]['label'] = $category->title; 
     $items[$i]['url'] = $category->url; 
     $items[$i]['active'] = false; 
     $items[$i]['items'] = array(
     array('label'=>'123', 'url'=>'#'), 
     array('label'=>'123', 'url'=>'#'), 
     array('label'=>'123', 'url'=>'#', 'items'=>array(
      array('label'=>'1234', 'url'=>'#'), 
      array('label'=>'1234', 'url'=>'#'), 
      array('label'=>'1234', 'url'=>'#', 'items'=>array(
       array('label'=>'1234', 'url'=>'#'), 
       array('label'=>'1234', 'url'=>'#'), 
       array('label'=>'1234', 'url'=>'#'), 
      )), 
     )), 
    ); 
} 
$this->widget('bootstrap.widgets.TbMenu', array(
    'type'=>'pills', 
    'stacked'=>false, // whether this is a stacked menu 
    'items'=>$items 
)); 

我不知道如何得到這個工作,順便說一句我讀this topic,只是不知道如何實際運用此功能我的問題。感謝任何幫助。

回答

1

最後,我自己的遞歸解決方案(多根工程):

public function getTreeRecursive() { 
    $criteria = new CDbCriteria; 
    $criteria->order = 'root, lft'; 
    $criteria->condition = 'level = 1'; 
    $categories = Category::model()->findAll($criteria); 

    foreach($categories as $n => $category) { 
     $category_r = array(
      'label'=>$category->title, 
      'url'=>'#', 
      'level'=>$category->level, 
     );    
     $this->category_tree[$n] = $category_r; 

     $children = $category->children()->findAll(); 
     if($children) 
      $this->category_tree[$n]['items'] = $this->getChildren($children); 
    } 
    return $this->category_tree; 
} 
private function getChildren($children) { 
    $result = array(); 
    foreach($children as $i => $child) { 
     $category_r = array(
      'label'=>$child->title, 
      'url'=>'#', 
     );   
     $result[$i] = $category_r; 
     $new_children = $child->children()->findAll(); 
     if($new_children) { 
      $result[$i]['items'] = $this->getChildren($new_children); 
     }   
    } 
    return $result_items = $result; 
} 
+0

Greate謝謝你 –

1

這是我用來格式化爲json對象的函數,你可以修改它來生成一個php數組。

protected function formatJstree(){ 
     $categories = $this->descendants()->findAll(); 
     $level=0; 
     $parent = 0; 
     $data = array(); 
     foreach($categories as $n => $category) 
     { 
      $node = array(
       'data'=> "{$category->title}", 
       'attr'=>array('id'=>"category_id_{$category->category_id}") 
      ); 
      if($category->level == $level){ 
       $data[$parent]["children"][] = $node; 
      } 
      else if($level != 0 && $category->level > $level){ 
       if(!isset($data[$n]["children"])){ 
        $data[$n]["children"] = array(); 
       } 
       $data[$parent]["children"][] = $node; 
      } 
      else 
      { 
       $data[] = $node; 
       $parent = $n; 
      } 
      $level=$category->level; 

     } 
     return $data; 

    } 
+0

你在哪裏把這個代碼?如果我使用$ categories = $ this-> descendants(),我會得到:「語法錯誤或訪問衝突:1064您的SQL語法錯誤;檢查與您的MySQL服務器版本對應的手冊, 'AND' t'.'gtgt' <)AND('t'.'root' = NULL)ORDER BY't'.'lft''at line 1.執行的SQL語句是:SELECT * FROM'tbl_category'' t''和't'.'gtgt' <)AND('t'.'root' =:ycp0)ORDER BY't'.'lft'「。 如果我使用$ categories = Category :: model() - > findAll(),我只是得到錯誤形成的樹:( –

+0

多數民衆贊成在文檔中,確保您有correclty設置擴展名,數據庫是一致的https://github.com/yiiext/nested-set-behavior#getting-all-descendants-of-a-node – Asgaroth

+0

也許我有一些問題,因爲我有很多根? –