Yii -在下拉列表中显示多于两个级别的树形视图

qjp7pelc  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(164)

我有一个具有以下结构的数据库表

id title parent_id is_parent

parent_id是父元素的id,我添加了is_parent作为布尔值,以显示父元素。
我想从此数据库中提取一个树视图,并将其显示在下拉列表中。下面是我要查找的内容:

level1
   level2
      child1
      child2
   level2_2
      child1
      child2
level1_2
  ...

现在,如果在我的模型中只有两个级别(父级和子级),我可以这样做:

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

并且在视图中:

<?php echo $form->dropDownListRow($model,'region',CHtml::listData(Region::model()->findAll('is_parent=0'),'id', 'title','getparent.title'),array('prompt'=>'Choose')); ?>

我不知道如何更改模型中的关系或更改listData结构,以获得我想要的结果。

mctunoxg

mctunoxg1#

Optgroup(在下拉列表中)不能嵌套,所以你必须放弃组。只需创建你自己的$model::getList()函数。
我认为你不应该使用'is_parent','parent_id'就足够了。getList()看起来像这样:

public static function getList($id=0) {
    $list = array();
    $models = Region::model()->findAllByAttributes(array('parent_id'=>$id));
    foreach ($models as $model) {
        $childList = Region::getList($model->id);
        array_merge($list, array($model->id => $model->title, $childList);
    }
    return $list;
}

它是递归的,当你不带参数调用它的时候--你从parent_id=0开始,得到所有的树。
如果需要缩进,请在此函数中使用附加参数进行设置(并在每一级增加缩进)

r1wp621o

r1wp621o2#

public static function getList($parent_id=null,$dash='',$list=array()) {
        $parents = ObjectCategory::find()->where(['parent_id' => $parent_id])->all();
        foreach($parents as $id => $p) {
             $list[$p->id] = $dash.$p->name;
             $list = ObjectCategory::getList($p->id,"-".$dash,$list);
        }
        return $list;
    }
// call on view 
echo  $form->field($model, 'parent_id')->dropDownList(backend\models\ObjectCategory::getList(null,''),['prompt' => 'Parent Category']);

相关问题