Pull to refresh

Comments 9

В Doctrine Extensions Tree невозможно стандартными методами (moveUp, moveDown) менять местами корневые элементы. При попытке это сделать «вылазит» исключение с соответствующим сообщением. Поведение, право сказать, странное и неожиданное, но приходиься мириться.

Изменять порядок следования корневых узлов деревьев (когда у нас не дерево, а «лес») архитектурно невозможно (все они представлены как отдельные деревья с lft = 1). Согласен, что сообщение об ошибке должно быть гораздо более user-friendly, сегодня или завтра поправлю
Такие ситуации происходят в случае сбоя при удалении элементов дерева из-за наличия foreign ключей

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

Эх, надо все-таки реализовать в Nested Sets метод repair. «на всякий случай»

Вернее не repair а recover:
    public function recover()
    {
        if ($this->verify() === true) {
            return;
        }
        // not yet implemented
    }

:(
Привожу пример таска для diem cms (symfony1.4) который достаточно хорошо чинит nested set дерево:

Тоже мучаюсь поисками готового решения для администрирования 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();
  }

}

единственно здесь нужно реализовать свою стратегию getChildren, которая работает самым достоверным способом.
Согласен, что сообщение об ошибке должно быть гораздо более user-friendly, сегодня или завтра поправлю

Ну с моей точки зрения сообщение вполне себе дружелюбное…
А вот по поводу того, что деревья в лесу менять местами нельзя — тут несколько нелогично. Т. е. логично было бы, если бы оно не давало создавать лес. Ну или позволяло деревья менять местами…

Спасибо за баг-репорт, если получится написать вменяемый тест-кейс

Спасибо. Постараюсь написать.
Я думаю что маршруты можно легко объединить в один при помощи дополнительной переменной и добавить ограничение, так будет понятнее.
Может я ошибаюсь, но список и дерево немного разные вещи. Вы пытаетесь вывести дерево через список. Не лучше ли сделать бандл, расширяющий функционал SonataAdminBundle, в котором описать TreeMapper и расширить классы Admin и CRUDController. Ну или попроще — просто в PageAdminController (или как там у вас) сделать экшн treeAction и в нем уже отобразить что хочется и как хочется.
ну искалось самое простое решение…
а делать бандл расширяющий фукнционал SonataAdminBundle — точно не самое простое…
да и вывод деревьев в списках не такая уж и редкая задача.
И реализуют это очень многие решения, которые предназначены для выводи списков/таблиц. Например, тот же jqGrid

Хотя идея сделать отдельный бандл для деревьев и добавить туда «плюсики» мне нравится.
Sign up to leave a comment.

Articles