Простенький tree behavior для ActiveRecord

Выкладываем свои наработки
Ответить
mixa
Сообщения: 36
Зарегистрирован: 2012.06.09, 11:57

Простенький tree behavior для ActiveRecord

Сообщение mixa »

Столкнулся с нескольними иерархическими таблицами такой структуры:
id_primary_key
id_parent
sequence
name
...

И стояла задача работать с этой иерархией. Т.к. было несколько таблиц, получилось вполне удобное поведение.
Подключается к модели следующим образом (пример для категорий товаров):

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

  public function behaviors() {
    return array(
      'tree' => array(
        'class' => 'ActiveRecordTreeBehavior',
        'order' => 'id_parent DESC, sequence ASC',
        'idParentField' => 'id_parent',
        'with' => 'productCount',
      ),
    );
  }
 
Ну и можно использовать в коде:

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

// получаем дерево экземпляров:
$tree = ProductCategory::model()->getTree();
// кол-во корневых элементов:
$count = $tree->getChildCount();
...
Список методов:
getTree()
getParent()
getChildCount()
getChild()
isChildExists()
getChildById($id)
getParentById($id)
isAncestor(CActiveRecord $model)
isDescendant(CActiveRecord $model, $checkSelf = false)
getRootParent()

Может кому пригодится.
Вложения
ActiveRecordTreeBehavior.zip
(6.24 КБ) 379 скачиваний
Ищем yii-разработчиков на фриланс
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: Простенький tree behavior для ActiveRecord

Сообщение Ryadnov »

Закачаете на GitHub?
mixa
Сообщения: 36
Зарегистрирован: 2012.06.09, 11:57

Re: Простенький tree behavior для ActiveRecord

Сообщение mixa »

Да, вот закинул на гитхаб: https://github.com/cvek/ActiveRecordTre ... or-for-yii
Ищем yii-разработчиков на фриланс
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Простенький tree behavior для ActiveRecord

Сообщение Nafania »

А это viewtopic.php?f=9&t=4005 не то же самое?
mixa
Сообщения: 36
Зарегистрирован: 2012.06.09, 11:57

Re: Простенький tree behavior для ActiveRecord

Сообщение mixa »

Nafania писал(а):А это viewtopic.php?f=9&t=4005 не то же самое?
Признаться, похоже. Но по всем ссылкам идет 404. Поэтому наверняка сложно сказать.
Ищем yii-разработчиков на фриланс
andron_2006_83
Сообщения: 16
Зарегистрирован: 2012.05.23, 23:44

Re: Простенький tree behavior для ActiveRecord

Сообщение andron_2006_83 »

// получаем дерево экземпляров:
$tree = ProductCategory::model()->getTree();
подскажите что дальше делать с $tree имею ввиду как получить значения??? Желательно пример? :?:
mixa
Сообщения: 36
Зарегистрирован: 2012.06.09, 11:57

Re: Простенький tree behavior для ActiveRecord

Сообщение mixa »

$tree - в данном случае это объект класса ProductCategory, содержащий всю иерархию.

Чтоб получить любой экземпляр по ид, можно вызывать такой метод:
$category = $tree->getById($id);

Чтоб перебрать все категории первого уровня, можно сделать так:
foreach($tree->getChild() AS $category) {
...
}
Ищем yii-разработчиков на фриланс
wartur
Сообщения: 11
Зарегистрирован: 2014.02.01, 21:28

Re: Простенький tree behavior для ActiveRecord

Сообщение wartur »

Спасибо. Отличное расширение! Как раз сам начал реализовывать и решил посмотреть по округе и ровно точ в точ то что мне требуется. Спасибо!
chernousov.by
Сообщения: 1
Зарегистрирован: 2014.03.13, 23:58

Re: Простенький tree behavior для ActiveRecord

Сообщение chernousov.by »

Приветствую, а есть какое-нибудь более подробное описание? и может уже что интереснее выходило?
JohnB0
Сообщения: 19
Зарегистрирован: 2014.02.05, 15:41

Re: Простенький tree behavior для ActiveRecord

Сообщение JohnB0 »

Столкнулся с такой проблемой. Основная функция getTree($addCriteria = array()) не принимает параметр $addCriteria.
Делаю вызов, допустим из функЦии:

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

public function getTabList()
        {
            $tree = $this->owner->getTree();
            $array = array();
            $this->getTabListRecursive($tree, $array, false);
            return $array;
        }
 
Запутался, не пойму. Если вручную присвоить функции массив внутри getTree(), то она используется, если извне передавать параметр = используется значение по умолчанию.
В чем может быть загвоздка, коллеги?

P.S. Хотелось бы передавать туда критерий выборки, например только "published" элементы..
Ответить