Я использую поведение вложенных множеств Yii , что помогает мне удерживать мои категории вложенными, как показано здесь (строки без названия, они на русском языке):
И все, что я хочу сделать, это иметь вложенное меню Bootstrap, которое должно быть следующим:
$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 ));
Я не понимаю, как это сделать, кстати, я читаю эту тему и просто не знаю, как применить эту функцию к моей проблеме. Цените любую помощь.
Это функция, которую я использую для форматирования в качестве объекта 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; }
Наконец, мое собственное рекурсивное решение (работает с несколькими корнями):
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; }