2010-02-13 6 views
0

Pour vous tous qui travaillez avec Doctrine, j'ai une question liée à moveAsLastChildOf(). J'utilise Doctrine 1.1.6 et Symfony 1.2Utilisation de moveAsLastChildOf pour déplacer des noeuds

J'ai un arbre imbriqué, avec beaucoup d'éléments. Je veux supprimer un élément de l'arbre, donc d'abord je dois déplacer tous ses enfants (et descendants) à son parent; puis supprimez-le. Je fais ce qui suit:

// Get the parent 
$parent = $object->getParent(); 

if ($object->getNode()->isValidNode()) 
{ 
    $children = $object->getNode()->getChildren(); 
    // Move each child to the parent of this object (grandparent of the children) 
    foreach($children as $child){ 
    $child->getNode()->moveAsLastChildOf($parent); 
    } 
    // and then delete the element 
    $object->getNode()->delete(); 
} 
else 
{ 
    $object->delete(); 
} 

Mais cela ne fonctionne pas, même les enfants sont supprimés. Et l'élément que je voulais enlever est toujours sur la base de données avec le non-sens & rgt. Le journal de cet exemple:

parent id=2412 lft(2044) rgt(2523) level(5) 
to lft(2044) rgt(2523) level(5) 

object to delete id=2487 lft(2375) rgt(2384) level(6) 
to lft(2375) rgt(2509) level(6) *non deleted and with non-sense lft & rgt* 

id=2491 lft(2376) rgt(2377) level(7) 
to lft(2521) rgt(2522) level(6) 

id=2490 lft(2378) rgt(2379) level(7) 
to lft(2376) rgt(2377) level(6) *deleted* 

id=2489 lft(2380) rgt(2381) level(7) 
to lft(2519) rgt(2520) level(6) 

id=2488 lft(2382) rgt(2383) level(7) 
to lft(2378) rgt(2379) level(6) *deleted* 

Je l'ai fait un coup d'œil sur le code Doctrine et je n'ai pas trouvé quelque chose de mal. Je dois mieux vérifier. Je vais aussi demander à l'équipe de doctrine de m'assurer que c'est mon problème ou non.

Répondre

1

Vous pouvez l'utiliser comme solution de contournement (la clé est de rafraîchir chaque nœud à chaque fois que vous changez l'arbre, donc je viens d'obtenir 1 enfant à son tour et à la fin actualisez le nœud d'origine):

$node = $tag->getNode(); 
    if ($node->hasParent()) { 
     $parent = $node->getParent(); 

     while ($child = $node->getFirstChild()) { 
      $child->getNode()->moveAsLastChildOf($parent); 
     } 
    } else { 
     while ($child = $node->getFirstChild()) { 
      $child->getNode()->makeRoot($child->id); 
     } 
    } 
    $tag->refresh()->getNode()->delete(); 

I J'utilise Doctrine 1.2, mais je pense qu'il n'y a pas de différence.

+0

merci beaucoup :-) – fesja

Questions connexes