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

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

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

Сообщение mixa » 2012.06.09, 12:29

Столкнулся с нескольними иерархическими таблицами такой структуры:
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 КБ) 300 скачиваний
Ищем yii-разработчиков на фриланс

Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

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

Сообщение Ryadnov » 2012.06.09, 13:26

Закачаете на GitHub?

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

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

Сообщение mixa » 2012.06.09, 14:50

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

Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

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

Сообщение Nafania » 2012.06.09, 18:49

А это viewtopic.php?f=9&t=4005 не то же самое?

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

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

Сообщение mixa » 2012.06.09, 22:25

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 » 2013.05.16, 18:00

// получаем дерево экземпляров:
$tree = ProductCategory::model()->getTree();
подскажите что дальше делать с $tree имею ввиду как получить значения??? Желательно пример? :?:

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

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

Сообщение mixa » 2013.05.17, 13:50

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

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

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

wartur
Сообщения: 11
Зарегистрирован: 2014.02.01, 21:28

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

Сообщение wartur » 2014.02.01, 21:30

Спасибо. Отличное расширение! Как раз сам начал реализовывать и решил посмотреть по округе и ровно точ в точ то что мне требуется. Спасибо!

chernousov.by
Сообщения: 1
Зарегистрирован: 2014.03.13, 23:58

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

Сообщение chernousov.by » 2014.03.14, 10:32

Приветствую, а есть какое-нибудь более подробное описание? и может уже что интереснее выходило?

JohnB0
Сообщения: 19
Зарегистрирован: 2014.02.05, 15:41

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

Сообщение JohnB0 » 2014.07.07, 19:08

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

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

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

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

Ответить