我有一个具有此结构的数据库表
id title parent_id is_parent
parent_id是父项的id,我将is_parent添加为boolean,以显示父项元素。
我想从这个数据库中提取一个树视图,并在下拉列表中显示它。这是我正在寻找的:
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结构两个得到我想要的结果。
答案 0 :(得分:2)
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
开始并获取所有树。
如果你需要缩进,在这个func中使用额外的param来设置它(并在每个级别增加它)
答案 1 :(得分:0)
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']);