/** * Create a copy of an object. * * The basis for this method is taken from kernel/content/copy.php * * @todo Merge this method into kernel wrapper's object class. * * @param eZContentObject $object * @param int $newParentNodeID * @return eZContentObject */ public static function copyObject($object, $newParentNodeID) { $newParentNode = eZContentObjectTreeNode::fetch($newParentNodeID); $db = eZDB::instance(); $db->begin(); $newObject = $object->copy(true); // We should reset section that will be updated in updateSectionID(). // If sectionID is 0 than the object has been newly created $newObject->setAttribute('section_id', 0); $newObject->store(); $curVersion = $newObject->attribute('current_version'); $curVersionObject = $newObject->attribute('current'); $newObjAssignments = $curVersionObject->attribute('node_assignments'); unset($curVersionObject); // remove old node assignments foreach ($newObjAssignments as $assignment) { $assignment->purge(); } // and create a new one $nodeAssignment = eZNodeAssignment::create(array('contentobject_id' => $newObject->attribute('id'), 'contentobject_version' => $curVersion, 'parent_node' => $newParentNodeID, 'is_main' => 1)); $nodeAssignment->store(); // publish the newly created object eZOperationHandler::execute('content', 'publish', array('object_id' => $newObject->attribute('id'), 'version' => $curVersion)); // Update "is_invisible" attribute for the newly created node. $newNode = $newObject->attribute('main_node'); eZContentObjectTreeNode::updateNodeVisibility($newNode, $newParentNode); $db->commit(); return $newObject; }
/** * @param eZContentObject $object * @param bool $allVersions * @param int $newParentNodeID * @throws Exception * @return eZContentObject */ public static function copyObject(eZContentObject $object, $allVersions = false, $newParentNodeID = null) { if (!$object instanceof eZContentObject) { throw new InvalidArgumentException('Object not found'); } if (!$newParentNodeID) { $newParentNodeID = $object->attribute('main_parent_node_id'); } // check if we can create node under the specified parent node if (($newParentNode = eZContentObjectTreeNode::fetch($newParentNodeID)) === null) { throw new InvalidArgumentException('Parent node not found'); } $classID = $object->attribute('contentclass_id'); if (!$newParentNode->checkAccess('create', $classID)) { $objectID = $object->attribute('id'); eZDebug::writeError("Cannot copy object {$objectID} to node {$newParentNodeID}, " . "the current user does not have create permission for class ID {$classID}", 'content/copy'); throw new Exception('Object not found'); } $db = eZDB::instance(); $db->begin(); $newObject = $object->copy($allVersions); // We should reset section that will be updated in updateSectionID(). // If sectionID is 0 then the object has been newly created $newObject->setAttribute('section_id', 0); $newObject->store(); $curVersion = $newObject->attribute('current_version'); $curVersionObject = $newObject->attribute('current'); $newObjAssignments = $curVersionObject->attribute('node_assignments'); unset($curVersionObject); // remove old node assignments foreach ($newObjAssignments as $assignment) { /** @var eZNodeAssignment $assignment */ $assignment->purge(); } // and create a new one $nodeAssignment = eZNodeAssignment::create(array('contentobject_id' => $newObject->attribute('id'), 'contentobject_version' => $curVersion, 'parent_node' => $newParentNodeID, 'is_main' => 1)); $nodeAssignment->store(); $db->commit(); return $newObject; }
/** * Creates a copy of $sourceObject * @param eZContentObject $sourceObject * @return eZContentObject */ protected function createCopy(eZContentObject $sourceObject) { $db = eZDB::instance(); $db->begin(); $newObject = $sourceObject->copy(); $newObject->setAttribute('section_id', 0); $newObject->store(); $curVersion = $newObject->attribute('current_version'); $curVersionObject = $newObject->attribute('current'); $newObjAssignments = $curVersionObject->attribute('node_assignments'); // remove old node assignments foreach ($newObjAssignments as $assignment) { $assignment->purge(); } // and create a new one $nodeAssignment = eZNodeAssignment::create(array('contentobject_id' => $newObject->attribute('id'), 'contentobject_version' => $curVersion, 'parent_node' => 2, 'is_main' => 1)); $nodeAssignment->store(); // publish the newly created object eZOperationHandler::execute('content', 'publish', array('object_id' => $newObject->attribute('id'), 'version' => $curVersion)); $db->commit(); return $this->forceFetchContentObject($newObject->attribute('id')); }