optgroup в dropDownList

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
vanderv
Сообщения: 62
Зарегистрирован: 2012.07.10, 14:03

optgroup в dropDownList

Сообщение vanderv »

Есть бд

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `tbl_products_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `parent` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10 ;

INSERT INTO `tbl_products_category` (`id`, `name`, `parent`) VALUES
(1, 'test1', 0),
(2, 'test2', 0),
(3, 'test3', 0),
(4, 'test4', 0),
(5, 'test10', 1),
(6, 'test12', 1),
(7, 'test13', 1),
(8, 'test14', 1),
(9, 'test15', 1);
 
Мне надо вывести выпадающий список сгруппированный по категориям либо сделать подгружаемый (выбрал одну категория - появились все подкатегории)
Для первого варианта все просто :

Код: Выделить всё

$c = CHtml::listData(Category::model()->findAll('parent != 0'), 'id','name', 'parent');
echo $form->dropDownList($product, 'cid', $c); 
Только вместо название родителя категории идет id, А мне бы хотелось видеть название категори - тобеж не 1, а test1
Если рассматривать второй вариант - то пока в замешательстве, может есть готовые решения?
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: optgroup в dropDownList

Сообщение vova07 »

Если делать по правилам Yii то можно вот так :
В модели категории пишем вот такие функции, можно все в одной конечно написать, но так быстрее разобраться.
В итоге функция categoriesListData() возвращает готовый CHtml::listData который можно юзать.

Код: Выделить всё

 # Здесь мы делаем выборку категорий, по нужной сортировке (Именно сортировка по родителю играет тут большую роль)
public function getCategories() {
        $criteria = new CDbCriteria;
        $criteria->order = 'parent ASC, id ASC';
        $categories = self::model()->findAll($criteria);
        return $this->buildTree($categories);
    }
 
# Тут мы создаем дерево категорий, которое будем использовать для реализации наших целей.
protected function buildTree(&$data, $rootID = 0) {
        $tree = array();
        foreach ($data as $id => $node) {
            if ($node->parent == $rootID) {
                unset($data[$id]);
                $node->childs = $this->buildTree($data, $node->id);
                $tree[] = $node;
            }
        }
        return $tree;
    }
 
# Основная функция которая и возвращает нужный результат
public function categoriesListData(){
        $categoriesTree = $this->getCategories();
        $categories = array();
        foreach($categoriesTree as $category) {
            if($category->parent == 0) {
                $categories[$category->title] = CHtml::listData($category->childs, 'id', 'name');
            }
        }
        return $categories;
    }
Пример использования CHtml::listData :

Код: Выделить всё

echo $form->dropDownList($model, 'categories', Categories::model()->categoriesListData(), array('empty' => 'Выберите категорию'));
Ответить