DbTreeBehavior - вложенные множества
- Stepan Selyuk
- Сообщения: 198
- Зарегистрирован: 2010.02.03, 05:51
- Откуда: Cyprus, Limassol
- Контактная информация:
DbTreeBehavior - вложенные множества
Сделал поведение для моделей, для работы со вложенными множествами (nested sets). Может кому пригодиться.
Основано на оригинальном классе CDBTree автора Maxim Poltarak, сайт http://dev.e-taller.net/dbtree/
Комментить пытался на английском - так как Zend 7.1.1 не хочет форматировать код с русскими комментариями. Так что не пинайте.
Некоторая функциональность реализована для использования на конечной системе. Но все равно старался сделать универсальной.
Подключается в модель обычным способом, как и все другие поведения.
Отвечу на вопросы, задавайте.
Код длинный, прикрепляю файл.
Основано на оригинальном классе CDBTree автора Maxim Poltarak, сайт http://dev.e-taller.net/dbtree/
Комментить пытался на английском - так как Zend 7.1.1 не хочет форматировать код с русскими комментариями. Так что не пинайте.
Некоторая функциональность реализована для использования на конечной системе. Но все равно старался сделать универсальной.
Подключается в модель обычным способом, как и все другие поведения.
Отвечу на вопросы, задавайте.
Код длинный, прикрепляю файл.
- Вложения
-
- DbTreeBehavior.zip
- (3.88 КБ) 266 скачиваний
Сначала невидимое, затем видимое. И так у всех программистов :)
- Stepan Selyuk
- Сообщения: 198
- Зарегистрирован: 2010.02.03, 05:51
- Откуда: Cyprus, Limassol
- Контактная информация:
Re: DbTreeBehavior - вложенные множества
Почитал TODO для скучающих, оказывается есть уже расширение такое!
http://www.yiiframework.com/extension/nestedset/
http://www.yiiframework.com/extension/nestedset/
Сначала невидимое, затем видимое. И так у всех программистов :)
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: DbTreeBehavior - вложенные множества
1) Много кода, который можно не писать.
2) Не решает задачу «вытащить все категории продукты в которых опубликованы и весят больше 40г».
3) Все методы префиксованы dbTree_, что не есть очень хорошо.
4) protected $model можно заменить на $this->getOwner(), выносить в _initDbTree() не стоит.
5) Нет run-time поддержки модификаций дерева.
6) Совершенно не в стиле yii.
7) Не использует транзакции.
В yiiext есть наработка (в очень ранней, но уже рабочей стадии): http://code.google.com/p/yiiext/source/ ... havior.php
2) Не решает задачу «вытащить все категории продукты в которых опубликованы и весят больше 40г».
3) Все методы префиксованы dbTree_, что не есть очень хорошо.
4) protected $model можно заменить на $this->getOwner(), выносить в _initDbTree() не стоит.
5) Нет run-time поддержки модификаций дерева.
6) Совершенно не в стиле yii.
7) Не использует транзакции.
В yiiext есть наработка (в очень ранней, но уже рабочей стадии): http://code.google.com/p/yiiext/source/ ... havior.php
Нравится Yii? Давайте сделаем его лучше!.
- Stepan Selyuk
- Сообщения: 198
- Зарегистрирован: 2010.02.03, 05:51
- Откуда: Cyprus, Limassol
- Контактная информация:
Re: DbTreeBehavior - вложенные множества
Видимо дело в том что с Yii я работаю неделю принял стратегическое решение и уже на половину разработанный проект на своем фреймворке переписал по Yii.
1. Ну рефакторинг никто не отменял - постепенно. Цель была переписать изначальный CDBTree под Yii Behaviour
2. Это и не планировалось. Поведение может вернуть $criteria для дальшейшей допилки условий. Насчет дальнейшей интеграции в модели можно подумать.
3. На всякий случай, привычка из правильного наименования кода (хотя кто-как привык).
4. Можно конечно. $model внедрил для простоты автодополнения в редакторе.
5. Это что такое?
6. Ну..учится буду ... стиль воспринимать
7. Пока в Yii насколько я знаю нет поддержки (без допилки) вложенных транзакций, и поэтому обновление такого дерева произведет commit предыдущей транзакции. Я думаю можно лишь внедрить либо проверку активной транзакции и исполнение кода sql: SAVEPOINT 'name'
Видимо разные инструменты для разных задач.
1. Ну рефакторинг никто не отменял - постепенно. Цель была переписать изначальный CDBTree под Yii Behaviour
2. Это и не планировалось. Поведение может вернуть $criteria для дальшейшей допилки условий. Насчет дальнейшей интеграции в модели можно подумать.
3. На всякий случай, привычка из правильного наименования кода (хотя кто-как привык).
4. Можно конечно. $model внедрил для простоты автодополнения в редакторе.
5. Это что такое?
6. Ну..учится буду ... стиль воспринимать
7. Пока в Yii насколько я знаю нет поддержки (без допилки) вложенных транзакций, и поэтому обновление такого дерева произведет commit предыдущей транзакции. Я думаю можно лишь внедрить либо проверку активной транзакции и исполнение кода sql: SAVEPOINT 'name'
Видимо разные инструменты для разных задач.
Сначала невидимое, затем видимое. И так у всех программистов :)
-
- Сообщения: 139
- Зарегистрирован: 2009.09.02, 16:21
- Откуда: Черкассы, Украина
Re: DbTreeBehavior - вложенные множества
То есть, Вы предлагаете вытянуть, например, 2000 позиций, чтобы потом их средствами пхп разрулить о_О2. Это и не планировалось. Поведение может вернуть $criteria для дальшейшей допилки условий. Насчет дальнейшей интеграции в модели можно подумать.
- Stepan Selyuk
- Сообщения: 198
- Зарегистрирован: 2010.02.03, 05:51
- Откуда: Cyprus, Limassol
- Контактная информация:
Re: DbTreeBehavior - вложенные множества
Зачем? Ну допустим нужно вернуть детей категории. Поведение сформировало условие и вернуло критерию (если мы об этом попросили).Dreammaker писал(а):То есть, Вы предлагаете вытянуть, например, 2000 позиций, чтобы потом их средствами пхп разрулить о_О2. Это и не планировалось. Поведение может вернуть $criteria для дальшейшей допилки условий. Насчет дальнейшей интеграции в модели можно подумать.
Дальше делаем
Код: Выделить всё
$criteria->addCondition('products.weight >= 40');
Category::model()->with('products')->findAll($criteria);
Сначала невидимое, затем видимое. И так у всех программистов :)
Re: DbTreeBehavior - вложенные множества
Когда можно будет посмотреть примеры работы, или документацию?Sam Dark писал(а): В yiiext есть наработка (в очень ранней, но уже рабочей стадии): http://code.google.com/p/yiiext/source/ ... havior.php
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: DbTreeBehavior - вложенные множества
Это к creocoder-у, его детище.
Нравится Yii? Давайте сделаем его лучше!.
Re: DbTreeBehavior - вложенные множества
посмотрел бегло код (сам сейчас изучаю вопрос, чтобы определиться самому писать все или же использовать готовое расширение) и нашел вот такую штуку:Sam Dark писал(а):1) Много кода, который можно не писать.
2) Не решает задачу «вытащить все категории продукты в которых опубликованы и весят больше 40г».
3) Все методы префиксованы dbTree_, что не есть очень хорошо.
4) protected $model можно заменить на $this->getOwner(), выносить в _initDbTree() не стоит.
5) Нет run-time поддержки модификаций дерева.
6) Совершенно не в стиле yii.
7) Не использует транзакции.
В yiiext есть наработка (в очень ранней, но уже рабочей стадии): http://code.google.com/p/yiiext/source/ ... havior.php
Код: Выделить всё
public function remove()
{
$owner=$this->getOwner();
$transaction=$owner->getDbConnection()->beginTransaction();
try
{
$condition=$this->left.'>='.$owner->getAttribute($this->left).' AND '.
$this->right.'<='.$owner->getAttribute($this->right);
$root=$this->hasManyRoots ? $owner->getAttribute($this->root) : null;
if($root!==null)
$condition.=' AND '.$this->root.'='.$root;
$owner->deleteAll($condition);
$first=$owner->getAttribute($this->right)+1;
$delta=$owner->getAttribute($this->left)-$owner->getAttribute($this->right)-1;
$this->shiftLeftRight($first,$delta,$root);
$transaction->commit();
return true;
}
catch(Exception $e)
{
$transaction->rollBack();
return false;
}
}
Код: Выделить всё
$owner->deleteAll($condition);
Re: DbTreeBehavior - вложенные множества
хотя, конечно, множества еще тот гемморой с обновлением дерева - и так не торопится. Но в любом случае нужно продумать какие-то решения с обработкой привязанных к категории моделям после удаления категории.