/**
  * Swap a node with another one
  *
  * @param int $nodeID
  * @param int $selectedNodeID
  * @param array $nodeIdList
  *
  * @return array An array with operation status, always true
  */
 public static function swapNode($nodeID, $selectedNodeID, $nodeIdList = array())
 {
     $userClassIDArray = eZUser::contentClassIDs();
     $node = eZContentObjectTreeNode::fetch($nodeID);
     $selectedNode = eZContentObjectTreeNode::fetch($selectedNodeID);
     $object = $node->object();
     $nodeParentNodeID = $node->attribute('parent_node_id');
     $nodeParent = $node->attribute('parent');
     $objectID = $object->attribute('id');
     $objectVersion = $object->attribute('current_version');
     $selectedObject = $selectedNode->object();
     $selectedObjectID = $selectedObject->attribute('id');
     $selectedObjectVersion = $selectedObject->attribute('current_version');
     $selectedNodeParentNodeID = $selectedNode->attribute('parent_node_id');
     $selectedNodeParent = $selectedNode->attribute('parent');
     $db = eZDB::instance();
     $db->begin();
     $node->setAttribute('contentobject_id', $selectedObjectID);
     $node->setAttribute('contentobject_version', $selectedObjectVersion);
     $selectedNode->setAttribute('contentobject_id', $objectID);
     $selectedNode->setAttribute('contentobject_version', $objectVersion);
     // fix main node id
     if ($node->isMain() && !$selectedNode->isMain()) {
         $node->setAttribute('main_node_id', $selectedNode->attribute('main_node_id'));
         $selectedNode->setAttribute('main_node_id', $selectedNode->attribute('node_id'));
     } else {
         if ($selectedNode->isMain() && !$node->isMain()) {
             $selectedNode->setAttribute('main_node_id', $node->attribute('main_node_id'));
             $node->setAttribute('main_node_id', $node->attribute('node_id'));
         }
     }
     $node->store();
     $selectedNode->store();
     // clear user policy cache if this was a user object
     if (in_array($object->attribute('contentclass_id'), $userClassIDArray)) {
         eZUser::purgeUserCacheByUserId($object->attribute('id'));
     }
     if (in_array($selectedObject->attribute('contentclass_id'), $userClassIDArray)) {
         eZUser::purgeUserCacheByUserId($selectedObject->attribute('id'));
     }
     // modify path string
     $changedOriginalNode = eZContentObjectTreeNode::fetch($nodeID);
     $changedOriginalNode->updateSubTreePath();
     $changedTargetNode = eZContentObjectTreeNode::fetch($selectedNodeID);
     $changedTargetNode->updateSubTreePath();
     // modify section
     if ($changedOriginalNode->isMain()) {
         $changedOriginalObject = $changedOriginalNode->object();
         $parentObject = $nodeParent->object();
         if ($changedOriginalObject->attribute('section_id') != $parentObject->attribute('section_id')) {
             eZContentObjectTreeNode::assignSectionToSubTree($changedOriginalNode->attribute('main_node_id'), $parentObject->attribute('section_id'), $changedOriginalObject->attribute('section_id'));
         }
     }
     if ($changedTargetNode->isMain()) {
         $changedTargetObject = $changedTargetNode->object();
         $selectedParentObject = $selectedNodeParent->object();
         if ($changedTargetObject->attribute('section_id') != $selectedParentObject->attribute('section_id')) {
             eZContentObjectTreeNode::assignSectionToSubTree($changedTargetNode->attribute('main_node_id'), $selectedParentObject->attribute('section_id'), $changedTargetObject->attribute('section_id'));
         }
     }
     eZContentObject::fixReverseRelations($objectID, 'swap');
     eZContentObject::fixReverseRelations($selectedObjectID, 'swap');
     $db->commit();
     // clear cache for new placement.
     eZContentCacheManager::clearContentCacheIfNeeded($objectID);
     eZSearch::swapNode($nodeID, $selectedNodeID, $nodeIdList = array());
     return array('status' => true);
 }