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'));
?>
Но это дает мне пустой выпадающий список. Как я могу показать это древовидное представление в раскрывающемся списке с группами опций? (Группы опций являются родительскими категориями и параметры являются вложенными категориями.
3 answers
Попробуйте это
echo $form->dropDownList($model,'id',CHtml::listData(SubCat::model()->findAll(),'id', 'name','relation_name.name'),array('prompt'=>'Choose'));
В раскрывающемся списке будут показаны родители и подкатегории
Вы создаете пустую модель и пытаетесь получить ее ребенка 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'));
Проверьте код на наличие ошибок и внесите необходимые изменения.
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;
}