2012-10-28 107 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

也许我有一些问题,因为我有很多根? –