0

この構造のデータベーステーブルがあります

id title parent_id is_parent

parent_id は親の ID であり、is_parent をブール値として追加して、親である要素を表示しました。

このデータベースからツリービューを抽出し、ドロップダウン リストに表示したいと考えています。これが私が探しているものです:

level1
   level2
      child1
      child2
   level2_2
      child1
      child2
level1_2
  ...

今のところ、モデルに次のように 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 構造を変更する方法がわかりません。

4

2 に答える 2

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;
}

paramsなしで呼び出すと、再帰的になります。最初parent_id=0にすべてのツリーを取得します。

インデントが必要な場合は、この関数で追加のパラメーターを使用して設定します(そしてすべてのレベルで増やします)

于 2012-11-29T09:18:06.337 に答える