Comments 9
В Doctrine Extensions Tree невозможно стандартными методами (moveUp, moveDown) менять местами корневые элементы. При попытке это сделать «вылазит» исключение с соответствующим сообщением. Поведение, право сказать, странное и неожиданное, но приходиься мириться.
Изменять порядок следования корневых узлов деревьев (когда у нас не дерево, а «лес») архитектурно невозможно (все они представлены как отдельные деревья с lft = 1). Согласен, что сообщение об ошибке должно быть гораздо более user-friendly, сегодня или завтра поправлю
Такие ситуации происходят в случае сбоя при удалении элементов дерева из-за наличия foreign ключей
Спасибо за баг-репорт, если получится написать вменяемый тест-кейс — за сутки поправлю
Стоит одному значению этих полей в любом элементе дерева стать неправильным — это приведет к поломке всего дерева. Поломку, которую исправить практически невозможно, учитывая сложность рассчета вышеуказанных полей, помноженную на количество элементов дерева.
Эх, надо все-таки реализовать в Nested Sets метод repair. «на всякий случай»
+2
Вернее не repair а recover:
:(
public function recover()
{
if ($this->verify() === true) {
return;
}
// not yet implemented
}
:(
+2
Привожу пример таска для diem cms (symfony1.4) который достаточно хорошо чинит nested set дерево:
Тоже мучаюсь поисками готового решения для администрирования Nested Set и ничего не могу найти, в sf1.4 меня выручил в свое время sfDoctrineTreePlugin
Тоже мучаюсь поисками готового решения для администрирования Nested Set и ничего не могу найти, в sf1.4 меня выручил в свое время sfDoctrineTreePlugin
<?php
class fixMediaFolderTreeTask extends dmContextTask
{
protected function configure()
{
parent::configure();
$this->namespace = 'fix';
$this->name = 'media-folder-tree';
}
public function execute( $arguments = array(), $options = array() )
{
$this->withDatabase();
$conn = Doctrine_Manager::getInstance()->getConnection( 'doctrine' );
$res = myDoctrineQuery::create()
->select( 'COUNT(f.id) AS num' )
->from( 'DmMediaFolder f' )
->fetchOne();
$lft = 1;
$rgt = $res['num'] * 2;
$root = DmMediaFolder::getById(1);
$root->lft = $lft;
$root->rgt = $rgt;
$root->save();
self::fixChildren( $root, $lft, $rgt );
}
private static function fixChildren( DmMediaFolder $f, $lft )
{
$children = self::getChildren( $f );
foreach ( $children as $child )
{
$child->lft = ++$lft;
$lft += 2 * self::fixChildren( $child, $child->lft );
$child->rgt = ++$lft;
echo( "rel_path: {$child->rel_path}\t lft: {$child->lft}\t rgt: {$child->rgt}\n" );
$child->save();
}
return sizeof( $children );
}
private static function getChildren( DmMediaFolder $f )
{
return myDoctrineQuery::create()
->from( 'DmMediaFolder f' )
->where( 'f.level = ? AND f.rel_path LIKE ?', array( ( $f->level +1 ), $f->rel_path . '%' ) )
->execute();
}
}
0
Согласен, что сообщение об ошибке должно быть гораздо более user-friendly, сегодня или завтра поправлю
Ну с моей точки зрения сообщение вполне себе дружелюбное…
А вот по поводу того, что деревья в лесу менять местами нельзя — тут несколько нелогично. Т. е. логично было бы, если бы оно не давало создавать лес. Ну или позволяло деревья менять местами…
Спасибо за баг-репорт, если получится написать вменяемый тест-кейс
Спасибо. Постараюсь написать.
0
Я думаю что маршруты можно легко объединить в один при помощи дополнительной переменной и добавить ограничение, так будет понятнее.
0
Может я ошибаюсь, но список и дерево немного разные вещи. Вы пытаетесь вывести дерево через список. Не лучше ли сделать бандл, расширяющий функционал SonataAdminBundle, в котором описать TreeMapper и расширить классы Admin и CRUDController. Ну или попроще — просто в PageAdminController (или как там у вас) сделать экшн treeAction и в нем уже отобразить что хочется и как хочется.
0
ну искалось самое простое решение…
а делать бандл расширяющий фукнционал SonataAdminBundle — точно не самое простое…
да и вывод деревьев в списках не такая уж и редкая задача.
И реализуют это очень многие решения, которые предназначены для выводи списков/таблиц. Например, тот же jqGrid
Хотя идея сделать отдельный бандл для деревьев и добавить туда «плюсики» мне нравится.
а делать бандл расширяющий фукнционал SonataAdminBundle — точно не самое простое…
да и вывод деревьев в списках не такая уж и редкая задача.
И реализуют это очень многие решения, которые предназначены для выводи списков/таблиц. Например, тот же jqGrid
Хотя идея сделать отдельный бандл для деревьев и добавить туда «плюсики» мне нравится.
0
Извините. Уровнем ошибся.
0
Only those users with full accounts are able to leave comments. Log in, please.
Редактирование древовидных структур с SonataAdminBundle в Symfony2