static function move($nodeID, $newParentNodeID) { $result = false; if (!is_numeric($nodeID) || !is_numeric($newParentNodeID)) { return false; } $node = eZContentObjectTreeNode::fetch($nodeID); if (!$node) { return false; } $object = $node->object(); if (!$object) { return false; } $objectID = $object->attribute('id'); $oldParentNode = $node->fetchParent(); $oldParentObject = $oldParentNode->object(); // clear user policy cache if this is a user object if (in_array($object->attribute('contentclass_id'), eZUser::contentClassIDs())) { eZUser::purgeUserCacheByUserId($object->attribute('id')); } // clear cache for old placement. // If child count exceeds threshold, do nothing here, and instead clear all view cache at the end. $childCountInThresholdRange = eZContentCache::inCleanupThresholdRange($node->childrenCount(false)); if ($childCountInThresholdRange) { eZContentCacheManager::clearContentCacheIfNeeded($objectID); } $db = eZDB::instance(); $db->begin(); $node->move($newParentNodeID); $newNode = eZContentObjectTreeNode::fetchNode($objectID, $newParentNodeID); if ($newNode) { $newNode->updateSubTreePath(true, true); if ($newNode->attribute('main_node_id') == $newNode->attribute('node_id')) { // If the main node is moved we need to check if the section ID must change $newParentNode = $newNode->fetchParent(); $newParentObject = $newParentNode->object(); if ($object->attribute('section_id') != $newParentObject->attribute('section_id')) { eZContentObjectTreeNode::assignSectionToSubTree($newNode->attribute('main_node_id'), $newParentObject->attribute('section_id'), $oldParentObject->attribute('section_id')); } } // modify assignment $curVersion = $object->attribute('current_version'); $nodeAssignment = eZNodeAssignment::fetch($objectID, $curVersion, $oldParentNode->attribute('node_id')); if ($nodeAssignment) { $nodeAssignment->setAttribute('parent_node', $newParentNodeID); $nodeAssignment->setAttribute('op_code', eZNodeAssignment::OP_CODE_MOVE); $nodeAssignment->store(); // update search index specifying we are doing a move operation $nodeIDList = array($nodeID); eZSearch::removeNodeAssignment($node->attribute('main_node_id'), $newNode->attribute('main_node_id'), $object->attribute('id'), $nodeIDList); eZSearch::addNodeAssignment($newNode->attribute('main_node_id'), $object->attribute('id'), $nodeIDList, true); } $result = true; } else { eZDebug::writeError("Node {$nodeID} was moved to {$newParentNodeID} but fetching the new node failed"); } $db->commit(); // clear cache for new placement. // If child count exceeds threshold, clear all view cache instead. if ($childCountInThresholdRange) { eZContentCacheManager::clearContentCacheIfNeeded($objectID); } else { eZContentCacheManager::clearAllContentCache(); } return $result; }
/** * Adds a new nodeAssignment * * @param int $nodeID * @param int $objectId * @param array $selectedNodeIDArray * * @return array An array with operation status, always true */ public static function addAssignment($nodeID, $objectID, $selectedNodeIDArray) { $userClassIDArray = eZUser::contentClassIDs(); $object = eZContentObject::fetch($objectID); $class = $object->contentClass(); $nodeAssignmentList = eZNodeAssignment::fetchForObject($objectID, $object->attribute('current_version'), 0, false); $assignedNodes = $object->assignedNodes(); $parentNodeIDArray = array(); foreach ($assignedNodes as $assignedNode) { $append = false; foreach ($nodeAssignmentList as $nodeAssignment) { if ($nodeAssignment['parent_node'] == $assignedNode->attribute('parent_node_id')) { $append = true; break; } } if ($append) { $parentNodeIDArray[] = $assignedNode->attribute('parent_node_id'); } } $db = eZDB::instance(); $db->begin(); $locationAdded = false; $node = eZContentObjectTreeNode::fetch($nodeID); foreach ($selectedNodeIDArray as $selectedNodeID) { if (!in_array($selectedNodeID, $parentNodeIDArray)) { $parentNode = eZContentObjectTreeNode::fetch($selectedNodeID); $parentNodeObject = $parentNode->attribute('object'); $canCreate = $parentNode->checkAccess('create', $class->attribute('id'), $parentNodeObject->attribute('contentclass_id')) == 1 || $parentNode->canAddLocation() && $node->canRead(); if ($canCreate) { $insertedNode = $object->addLocation($selectedNodeID, true); // Now set is as published and fix main_node_id $insertedNode->setAttribute('contentobject_is_published', 1); $insertedNode->setAttribute('main_node_id', $node->attribute('main_node_id')); $insertedNode->setAttribute('contentobject_version', $node->attribute('contentobject_version')); // Make sure the url alias is set updated. $insertedNode->updateSubTreePath(); $insertedNode->sync(); $locationAdded = true; } } } if ($locationAdded) { //call appropriate method from search engine eZSearch::addNodeAssignment($nodeID, $objectID, $selectedNodeIDArray); // clear user policy cache if this was a user object if (in_array($object->attribute('contentclass_id'), $userClassIDArray)) { eZUser::purgeUserCacheByUserId($object->attribute('id')); } } $db->commit(); eZContentCacheManager::clearContentCacheIfNeeded($objectID); return array('status' => true); }
static function move( $nodeID, $newParentNodeID ) { $result = false; if ( !is_numeric( $nodeID ) || !is_numeric( $newParentNodeID ) ) return false; $node = eZContentObjectTreeNode::fetch( $nodeID ); if ( !$node ) return false; $object = $node->object(); if ( !$object ) return false; $objectID = $object->attribute( 'id' ); $oldParentNode = $node->fetchParent(); $oldParentObject = $oldParentNode->object(); // clear user policy cache if this is a user object if ( in_array( $object->attribute( 'contentclass_id' ), eZUser::contentClassIDs() ) ) { eZUser::purgeUserCacheByUserId( $object->attribute( 'id' ) ); } // clear cache for old placement. eZContentCacheManager::clearContentCacheIfNeeded( $objectID ); $db = eZDB::instance(); $db->begin(); $node->move( $newParentNodeID ); $newNode = eZContentObjectTreeNode::fetchNode( $objectID, $newParentNodeID ); if ( $newNode ) { $newNode->updateSubTreePath( true, true ); if ( $newNode->attribute( 'main_node_id' ) == $newNode->attribute( 'node_id' ) ) { // If the main node is moved we need to check if the section ID must change $newParentNode = $newNode->fetchParent(); $newParentObject = $newParentNode->object(); if ( $object->attribute( 'section_id' ) != $newParentObject->attribute( 'section_id' ) ) { eZContentObjectTreeNode::assignSectionToSubTree( $newNode->attribute( 'main_node_id' ), $newParentObject->attribute( 'section_id' ), $oldParentObject->attribute( 'section_id' ) ); } } // modify assignment $curVersion = $object->attribute( 'current_version' ); $nodeAssignment = eZNodeAssignment::fetch( $objectID, $curVersion, $oldParentNode->attribute( 'node_id' ) ); if ( $nodeAssignment ) { $nodeAssignment->setAttribute( 'parent_node', $newParentNodeID ); $nodeAssignment->setAttribute( 'op_code', eZNodeAssignment::OP_CODE_MOVE ); $nodeAssignment->store(); // update search index $nodeIDList = array( $nodeID ); eZSearch::removeNodeAssignment( $node->attribute( 'main_node_id' ), $newNode->attribute( 'main_node_id' ), $object->attribute( 'id' ), $nodeIDList ); eZSearch::addNodeAssignment( $newNode->attribute( 'main_node_id' ), $object->attribute( 'id' ), $nodeIDList ); } $result = true; } else { eZDebug::writeError( "Node $nodeID was moved to $newParentNodeID but fetching the new node failed" ); } $db->commit(); // clear cache for new placement. eZContentCacheManager::clearContentCacheIfNeeded( $objectID ); return $result; }