Реализовать каталог с неограниченой вложенностью.

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
ninzzo
Сообщения: 348
Зарегистрирован: 2014.04.25, 07:29

Реализовать каталог с неограниченой вложенностью.

Сообщение ninzzo »

Ребят есть у меня задание. Создать магазин. ТЗ по каталогу:
Каталог имеет неограниченное количество уровней вложенности с возможностью
размещения позиций товара на каждом уровне.
На процедурном я бы сделал таблицу. Добавил бы поле в таблице parent. Если parent есть, то в каталог выводится как подкаталог. Если parent пустое поле, то значит каталог не вложен никуда.

И при создании или редактировании каталога сделал бы выпадающий список из уже существующих. Это решало бы задачу, но как то гавнокодерски.

Есть ли на YII какое то расширение что бы решить мою задачу ? Или как лучше это сделать ? Подскажите.

Я уверен задача распространенная и для магазинов уже есть расширение каталога с вложенностью.
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Реализовать каталог с неограниченой вложенностью.

Сообщение sluchainiyznak »

Может как то так:

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

class Catalog extends CActiveRecord
{
    public function relations()
    {
        return array(
            'childs'=>array(self::HAS_MANY, "Catalog", 'parent_id'));
    }
} 
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Реализовать каталог с неограниченой вложенностью.

Сообщение mickgeek »

parent = 0 или больше, position + кэш.
Аватара пользователя
ninzzo
Сообщения: 348
Зарегистрирован: 2014.04.25, 07:29

Re: Реализовать каталог с неограниченой вложенностью.

Сообщение ninzzo »

sluchainiyznak писал(а):Может как то так:

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

class Catalog extends CActiveRecord
{
    public function relations()
    {
        return array(
            'childs'=>array(self::HAS_MANY, "Catalog", 'parent_id'));
    }
}
а можете объяснить что значит ''childs' ??? Допустим я нашел все findall. Смотрю ID первого и хочу знать его "детей". Как это сделать ?


Вот как я сделал:

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

$catal=Catalog::model()->findall();

foreach($catal as $one){
echo $one->name;
$podcatal=Catalog::model()->find('parent=:parent', array(':parent'=>$one->id));
  //вот тут пытаюсь вывести через foreach но выдает ошибку. 
} 
но это для каатлога и подкаталога 2 уровня вложености. А если их будет 50... =(
Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: Реализовать каталог с неограниченой вложенностью.

Сообщение TranceSmile »

Задам вам вопрос: чем отличается find() от findAll()?

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

$catalogs = Catalog::model()->with('childs')->findAll('parent = 0');
foreach($catalogs as $catalog) {
     // тут говнокод 
}
 
а вообще в гугле есть грамотные реализации.
Изображение
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Реализовать каталог с неограниченой вложенностью.

Сообщение yan »

ninzzo писал(а): На процедурном я бы сделал таблицу. Добавил бы поле в таблице parent. Если parent есть, то в каталог выводится как подкаталог. Если parent пустое поле, то значит каталог не вложен никуда.

И при создании или редактировании каталога сделал бы выпадающий список из уже существующих. Это решало бы задачу, но как то гавнокодерски.
чем по говнокодерски то? обычное решение проблемы, чтобы иметь быстрый доступ ко всей иерархии делаете функцию которая при изменении категорий составляет массив со всем деревом и сохраняет в какой-то кэш
Beluj
Сообщения: 37
Зарегистрирован: 2014.06.18, 19:52

Re: Реализовать каталог с неограниченой вложенностью.

Сообщение Beluj »

Я делал так

public function relations()
{
return array(
'items' => array(self::HAS_MANY, 'Sections', 'parent_id', 'order' => 'sort ASC'),
'parent' => array(self::BELONGS_TO, 'Sections', array('parent_id' => 'id')),
'catalogattrs' => array(self::HAS_MANY, 'CatalogAttr', 'sections_id', 'order' => 'sort DESC'),
);
}

Потом писал метод статический
Типа такого который рекурсивно строил масив нужный для CMenu
public static function makeCMenuItems ($root_id, $model = NULL) {
$res = array();
if ($model == NULL) {
$model = self::model()->findAll($criteria);
}
foreach ($model as $item) {
$tmp = array();
if (!empty($item->items)) {
$tmp['items'] = self::makeCMenuItems($root_id, $item->items);
}
$res[] = $tmp;
}
return $res;
}
Ответить