CQTreeGridView = CGridView + YiiExt Nested set + treeTable

Выкладываем свои наработки
quantum
Сообщения: 9
Зарегистрирован: 2011.04.04, 13:58

CQTreeGridView = CGridView + YiiExt Nested set + treeTable

Сообщение quantum »

Добрый день. Ненагуглив удобного инструмента для админки для работы с деревьями, решил написать свой велосипед. (Уже позже увидел ejnestedtreeactions)

CQTreeGridView - расширение для стандартного CGridView, для работы с моделями, расширенными YiiExt Nested set behaviour. Для визуального отображения используется плагин для jQuery treeTable, для перетаскивания - jQuery ui.

Изображение

Работа по перемещению веток с помощью drag-and-drop. Потомка сделать корнем можно!

В расширении уже есть типовые actions, которые можно подключить. Или взять за основу для своих.

Внутри архива уже есть нужные jQuery ui и jQuery treeTable. jQuery treeTable немного изменен.

Использование:
- Сгенерировать модель, crud. Избавиться от упоминаний id, leftkey, rightkey И level в модели и формах.
- Cкачать YiiExt Nested set behaviour, следуя инструкциям расширить модель. Если Выбрали режим с одним корнем - вставить вручную запись с id=1, level=1, leftKey=1, rightKey=2. В модели сделать публичное свойство parentId.
- Добавить в метод search сортировку по полю root (если есть) и leftkey. Если все делали по инструкции, то этой строчкой:

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

        $criteria->order = $this->tree->hasManyRoots
                           ?$this->tree->rootAttribute . ', ' . $this->tree->leftAttribute
                           :$this->tree->leftAttribute;
 
- Скачать CQTreeGridView, положить в extensions.
- Во вью admin вместо виджета zii.widgets.grid.CGridView использовать ext.QTreeGridView.CQTreeGridView , добавить опцию 'ajaxUpdate' => false.
- добавить в контроллер:

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

    public $CQtreeGreedView  = array (
        'modelClassName' => 'Page2', //название класса
        'adminAction' => 'admin' //action, где выводится QTreeGridView. Сюда будет идти редирект с других действий.
    );
 
- добавить типовые действия в контроллер:

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

    public function actions() {
        return array (
            'create'=>'ext.QTreeGridView.actions.Create',
            'update'=>'ext.QTreeGridView.actions.Update',
            'delete'=>'ext.QTreeGridView.actions.Delete',
            'moveNode'=>'ext.QTreeGridView.actions.MoveNode',
            'makeRoot'=>'ext.QTreeGridView.actions.MakeRoot',
        );
    }
 
UPD В связи http://code.google.com/p/yiiext/issues/detail?id=45 обновил пост и файл
Вложения
QTreeGridView.zip
(33.61 КБ) 1095 скачиваний
Последний раз редактировалось quantum 2011.04.29, 09:41, всего редактировалось 4 раза.
SpartakuS
Сообщения: 72
Зарегистрирован: 2010.10.16, 21:36

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение SpartakuS »

В перемещении веток полная свобода? Можно сделать потомка рутом?
quantum
Сообщения: 9
Зарегистрирован: 2011.04.04, 13:58

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение quantum »

Нет, сейчас этого не сделаешь
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение samdark »

Я как-то участвовал в разработке http://www.yiiframework.com/extension/e ... reeactions Там можно глянуть код для перемещения части дерева в новое дерево и т.д.
SpartakuS
Сообщения: 72
Зарегистрирован: 2010.10.16, 21:36

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение SpartakuS »

Sam Dark писал(а):Я как-то участвовал в разработке http://www.yiiframework.com/extension/e ... reeactions Там можно глянуть код для перемещения части дерева в новое дерево и т.д.
Да. Пользуюсь ей. Но в корень все равно не помещается.
quantum
Сообщения: 9
Зарегистрирован: 2011.04.04, 13:58

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение quantum »

Что мое расширение, что ejnestedtreeactions базируется на ENestedSetBehavior, а оно не умеет помещать в корень. Я обновил расширение - теперь можно потомка сделать рутом в режиме с несколькими корнями - читать первый пост.
SpartakuS
Сообщения: 72
Зарегистрирован: 2010.10.16, 21:36

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение SpartakuS »

Cпасибо. Использую значит.
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение creocoder »

В ревизии http://code.google.com/p/yiiext/source/detail?r=395 теперь можно сделать потомка рутом. Обновите первый пост.
Последний раз редактировалось creocoder 2011.04.19, 15:04, всего редактировалось 1 раз.
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение porcelanosa »

А под обычное дерево id | parent_id переделать сложно?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение creocoder »

porcelanosa писал(а):А под обычное дерево id | parent_id переделать сложно?
Нет "обычного" типа деревьев. Есть четкая классификация деревьев. Дерево такого типа - это Adjacency Lists. Для деревьев такого типа нужно отдельное расширение (которое уже в разработке).
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение porcelanosa »

creocoder писал(а):
porcelanosa писал(а):А под обычное дерево id | parent_id переделать сложно?
Нет "обычного" типа деревьев. Есть четкая классификация деревьев. Дерево такого типа - это Adjacency Lists. Для деревьев такого типа нужно отдельное расширение (которое уже в разработке).
Как долго ждать? Больше 2-х недель?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение creocoder »

porcelanosa писал(а):Как долго ждать? Больше 2-х недель?
Вероятнее всего да, больше 2-ух недель.
quantum
Сообщения: 9
Зарегистрирован: 2011.04.04, 13:58

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение quantum »

Обновил
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение SpiLLeR »

Не большая поправка, при подключении ENestedSetBehavior, нужно указать: tree в качестве названия:

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

    public function behaviors() {
        return array(
            'tree'=>array(
                'class'=>'ext.yiiext.behaviors.model.trees.ENestedSetBehavior',
                'hasManyRoots'=>true,
            )
        );
    }
Предупрежден - значит вооружен.
devKP.ru
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение SpiLLeR »

а с hasManyRoots=>true, стабильно работает? А то у меня дерево ломалось уже... перемешение тоже как-то странно работает. Мб криво настроил конечно =/
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение samdark »

SpiLLeR, не обязательно именно tree. Тестами вроде оба режима покрыты и стабильны. Дерево случайно в обход поведения не редактировалось? Если выйдет воспроизвести поломку, будет очень круто.
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение aser »

creocoder писал(а):
porcelanosa писал(а):Как долго ждать? Больше 2-х недель?
Вероятнее всего да, больше 2-ух недель.
А что то в направлении Adjacency Lists получилось реализовать?
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение aser »

Еще один момент в коде есть JS определяющий какое действие должно выполниться после перетаскивания и в нем есть следующий код:
window.location.href = "moveNode/action/before/to/"+$(this).attr("id").replace("after-", "")+"/id/"+$(ui.draggable).attr("id");
Если мы находились на http://sample.com/menuitems/admin то все отработает нормально и выполниться действие по урлу http://sample.com/[b]menuitems/moveNode ... before/to/....[/b], ну а если у нас урл http://sample.com/menuitems/admin/MenuId/1 (в моем случаи он определяет дереве какого меню мы редактируем) в последствии я получаю вызов http://sample.com/menuitems/admin/MenuId/moveNode/action/before/to/.... что естественно не отрабатывает.

Есть или какие то предложения что бы избежать этого?
SirGrey
Сообщения: 1
Зарегистрирован: 2011.06.22, 14:56

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение SirGrey »

Доброго времени суток.

Есть небольшой вопрос по QTreeGridView. Точнее даже не по нему о по treetable. Насколько я понял реализована возможность сортировать "детей" в
дереве, что в самом плагине (treetable) не реализовано. Подскажите пожалуйста как это сделать? Буду очень признателен если кто-нибудь выложит html и javascript код который формирует QTreeGridView.
spavlov
Сообщения: 66
Зарегистрирован: 2011.07.29, 10:42

Re: CQTreeGridView = CGridView + YiiExt Nested set + treeTab

Сообщение spavlov »

подскажите новичку пож-та.

при перемещении браузер отправляет меня со страницы "index.php?r=category/admin" на страницы типа "moveNode/action/before/to/", что вызывает ошибки сервера типа

Not Found
The requested URL /moveNode/action/before/to/2/id/1 was not found on this server.

прописал

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

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 
и вроде как что-то работает, но при попытке удалить любую строку таким вот образом "http://domain/index.php/category/delete?id=2" пишет "You should not use CActiveRecord::delete() method when NestedSetBehavior attached." бу?! куда копать?

P.S. подскажите пример структуры вложенного дерева с одним рутом например (лефт, райт, левелс).
Ответить