Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В Doctrine Extensions Tree невозможно стандартными методами (moveUp, moveDown) менять местами корневые элементы. При попытке это сделать «вылазит» исключение с соответствующим сообщением. Поведение, право сказать, странное и неожиданное, но приходиься мириться.Такие ситуации происходят в случае сбоя при удалении элементов дерева из-за наличия foreign ключей
Стоит одному значению этих полей в любом элементе дерева стать неправильным — это приведет к поломке всего дерева. Поломку, которую исправить практически невозможно, учитывая сложность рассчета вышеуказанных полей, помноженную на количество элементов дерева.
public function recover()
{
if ($this->verify() === true) {
return;
}
// not yet implemented
}
<?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();
}
}
Согласен, что сообщение об ошибке должно быть гораздо более user-friendly, сегодня или завтра поправлю
Спасибо за баг-репорт, если получится написать вменяемый тест-кейс
Редактирование древовидных структур с SonataAdminBundle в Symfony2