YiiFramework DynaTreePhp

Redjik

Джедай-мастер
https://github.com/Redjik/DynoTreePhp/tree/master/class

Собственно писал под Yii, поэтому вынес компонент и хелперы.
И не делал автозагрузчик.

В индексном файле пример, того как оно работает.
Реализован самый основной функционал, который у меня вызывал постоянную попоболь... так как приходилось писать кучу зависимостей или довольно много js кода.

Реализация сырая и необкатанная, допиливать буду уже на проектах, так что вообще может репо перезалью.

Вообще не хватает фабрик, чтобы на лету генерить все, что нужно, но тут универсальной фабрики не получиться, могу только интерфейсы добавить.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
у меня вопрос: а что именно ты написал?
название "динамическое дерево на php" понимания практического смысла мне не дает,
а читать код непонятно чего как-то лень
 

Redjik

Джедай-мастер
Как бы я не старался уйти от деревьев, все равно в той или иной степени приходиться привинчивать какое-нибудь js дерево.
Я перебрал небольшой ворох js деревьев.
И нашел, пожалуй, самый лучший вариант, который активно поддерживается - http://code.google.com/p/dynatree/, http://wwwendt.de/tech/dynatree/doc/samples.html

PHP:
$tree = new DynaTree('tree1'); //создаем новое дерево
$tree->defaultDropCallback ='function(node, sourceNode, hitMode, ui, draggable){console.log(node)}';

$menu = new DynaMenu('1stMenu'); // Создаем контекстное меню (правый клик по ноду)
$action = new DynaMenuAction('Alert'); // Создаем действие  для контекстного меню
$action->icon = 'edit'; // иконка контекстного меню
$action->callback = 'function(){alert("hello world")}'; // действие - вообще сюда пихаем AJAX
$menu->addAction($action); // Добавляем действие к меню

for ($i = 0;$i<10;$i++) // добавляем несколько узлов
{
    $node = new DynaNode('Узел - '.$i); // узел 
    $node->draggable = true; // можно ли узел перетаскивать
    $node->dropable = true; // можно ли кидать внутрь узла, чтобы сделать его папкой
    $node->nodeDropCallback = 'function(node, sourceNode, hitMode, ui, draggable){console.log("zzz")}'; // действие при drop узла - вставляем Ajax
    $node->addMenu($menu); // добавлем меню к ноду (пкм по ноду)
    $tree->addNode($node); // добавляем нод к дереву 
}
$tree->renderTree();
Повторюсь, сейчас все сделано через стратегию, в той или иной степени...
Чтобы быстро формировать меню и ноды/узлы нужны фабрики, но мне проще в виджете по-быстрому собрать вот таким макаром дерево...
 

cDLEON

Онанист РНРСlub
о_О нахера в серверную логику совать логику клиента ? О_о
 

WMix

герр M:)ller
Партнер клуба
cDLEON

при нажатии на кнопку данные сохранить в базе
или
при нажатии на кнопку запусти экшин чтоб сохранить данные,
или
сгенери кнопку при нажатии на которую данный экшин получит данные для последовательной записи в базу

по мне это просто дополнитнльная логика, то где ты лично будешь использовать тот или иной метод, лежит полностью в твоих руках, тут просто экзампель, того как можно подойти к данной проблеме...

// конечно можно написать чтоб скрипт от пхп лежат отдельно, в таком случае это не пиши
PHP:
$node->draggable = true; // можно ли узел перетаскивать
    $node->dropable = true; // можно ли кидать внутрь узла, чтобы сделать его папкой
    $node->nodeDropCallback = 'function(node, sourceNode, hitMode, ui, draggable){console.log("zzz")}';
но бывает удобнее описывать вызов экшин записи непосредственно в скрипте где запись и происходит.... тогда есть предложение по автогенерации
 

cDLEON

Онанист РНРСlub
WMix
Спасибо, я бы, наверное, сам не догадался.
Только вот откуда сервер узнает url? А если я реврайт сделаю (стандартный урл работать не будет) ? Или захочу использовать код этого модуля в другом модуле?
Эта чача слишком много хочет знать. Фактически клиентская логика перенесена в серверную. За такое нужно пальцы в дверной проём засовывать.
 

Ragazzo

TDD interested
cDLEON
в Yii много где используется такой подход навешивания коллбеков, в основном связан с теми ситуациями когда определенное значение нужное в колбеке известно на сервере, и чтобы не городить кучу передач, делают такой вот хук.
 

WMix

герр M:)ller
Партнер клуба
cDLEON
я с тобой соглашусь, что если сделать реврайт, придеться менять серверный скрипт. но боюсь что еслиб логика лежала в отдельном клиентском скрипте, пришлось бы переписывать там...
какая разница где? зато удобно писать, все что нужно это определить хелпер или как он в Yii называется, остальное само нагенериться....

заставь пхп знать как описан реврайт, те пусть он генерит также .htaccess и задача решается сама... явой скриптом это сделать не возможно

За такое нужно пальцы в дверной проём засовывать.
откуда такая злоба...
 

Redjik

Джедай-мастер
cDLEON
я наверное плохо объяснил, чем вообще занимается этот класс =)

там сейчас только представление...
возьмем пример, у нас есть каталог товаров, не важно nested или adjacency

контроллер берет данные в модели и отдает в вид
Вид подключает класс и основываясь на данных уже формирует дерево и именно в виде мы обозначаем нужен нам Drag and drop и контекстное меню
И именно в виде мы указываем действие... то есть показываем к какому контроллеру обратиться, чтобы передать данные об изменении в дереве

эта чача по сути вообще ничего не знает ни о модели ни о контроллерах
 

Redjik

Джедай-мастер
WMix
ага, я писал под Yii, но тут абстракция, будет работать хоть где
 
Сверху