Yii, показывающий древовидный вид в раскрывающемся списке из базы данных


У меня есть категории и подкатегории, сохраненные в базе данных. Я хочу показать их в раскрывающемся списке cHTML следующим образом:

Patrent_cat
   sub_cat1
   sub_cat2
Parent_cat2
  ...

Моя таблица категорий выглядит так

id name parent_id

И parent_id равно 0, если кортеж сам является родителем

Я уже пробовал это в своей модели категории:

public function relations()
{
    return array(
                'getparent' => array(self::BELONGS_TO, 'Category', 'parent_id'),
                'childs' => array(self::HAS_MANY, 'Category', 'parent_id', 'order' => 'id ASC'),
    );
}

public function getCategoryTree() 
    {
        $subitems = array();
        if($this->childs) foreach($this->childs as $child) 
        {
            $subitems[] = $child->getListed();
        }
        $returnarray = array($this->id => $this->title);
        if($subitems != array()) 
            $returnarray = array_merge($returnarray, array('items' => $subitems));
        return $returnarray;
    }

И, на мой взгляд:

<?php 
         echo CHtml::dropDownList('category', 'id', 
                        Category::model()->CategoryTree,
                        array('empty' => '(Select a category'));
?>

Но это дает мне пустой выпадающий список. Как я могу показать это древовидное представление в раскрывающемся списке с группами опций? (Группы опций являются родительскими категориями и параметры являются вложенными категориями.

Author: Mahsa Teimourikia, 2012-11-27

3 answers

Попробуйте это

echo $form->dropDownList($model,'id',CHtml::listData(SubCat::model()->findAll(),'id', 'name','relation_name.name'),array('prompt'=>'Choose'));

В раскрывающемся списке будут показаны родители и подкатегории

 7
Author: WebDevPT, 2012-11-27 16:57:32

Вы создаете пустую модель и пытаетесь получить ее ребенка Category::model()->CategoryTree, чтобы получить пустой результат.

Попробуйте метод, чтобы получить список дочерних категорий в вашей модели:

public function getChildList() {
    $return = array();
    if ($this->childs !== null) {
        foreach ($this->childs as $child) {
            $return[$child->id] = "--".$child->title;
        }
    }
    return $return;
}

О действии вашего контроллера:

...
$categotyList = array();
$parentCategories = Category::model()->findAllByAttributes(array('parent_id'=>'0'));
foreach ($parentCategories as $category) {
    array_merge($categoryList, 
               array('$category->id' => '$category->name'), 
               $category->getChildList()
    );
}
...

И просмотр:

echo CHtml::dropDownList('category', 'id', 
                        $categoryList,
                        array('empty' => '(Select a category'));

Проверьте код на наличие ошибок и внесите необходимые изменения.

 0
Author: driver_by, 2012-11-28 05:03:48
public function getDropdownCategories()
    {
        $array = self::find()->select(['id', 'parent_id', 'name'])->asArray()->all();
        $array = self::buildTree($array);
        $array = ArrayHelper::map($array, 'id', 'name');
        return $array;
    }

private function buildTree($array, $parentId = null, $preWord = '')
    {
        if(!empty($preWord))
            $preWord.='-';

        $tmpArray = [];
        foreach ($array as $element) {
            if ($element['parent_id'] == $parentId) {
                $tmpArray[] = ['id' => $element['id'], 'name' => $preWord.$element['name']];
                $tmp = self::buildTree($array, $element['id'], '-');
                if(!empty($tmp) && is_array($tmp)) {
                    foreach ($tmp as $item) {
                        $tmpArray[] = ['id' => $item['id'], 'name' => $item['name']];
                    }
                }
            }
        }
        return $tmpArray;
    }
 0
Author: den, 2017-01-13 08:53:28