public static function publishNode($parentNodeID, $objectID, $versionNum, $mainNodeID) { $object = eZContentObject::fetch($objectID); $nodeAssignment = eZNodeAssignment::fetch($objectID, $versionNum, $parentNodeID); $version = $object->version($versionNum); $fromNodeID = $nodeAssignment->attribute('from_node_id'); $originalObjectID = $nodeAssignment->attribute('contentobject_id'); $nodeID = $nodeAssignment->attribute('parent_node'); $opCode = $nodeAssignment->attribute('op_code'); $parentNode = eZContentObjectTreeNode::fetch($nodeID); // if parent doesn't exist, return. See issue #18320 if (!$parentNode instanceof eZContentObjectTreeNode) { eZDebug::writeError("Parent node doesn't exist. object id: {$objectID}, node_assignment id: " . $nodeAssignment->attribute('id'), __METHOD__); return; } $parentNodeID = $parentNode->attribute('node_id'); $existingNode = null; $db = eZDB::instance(); $db->begin(); if (strlen($nodeAssignment->attribute('parent_remote_id')) > 0) { $existingNode = eZContentObjectTreeNode::fetchByRemoteID($nodeAssignment->attribute('parent_remote_id')); } if (!$existingNode) { } $existingNode = eZContentObjectTreeNode::findNode($nodeID, $object->attribute('id'), true); $updateSectionID = false; // now we check the op_code to see what to do if (($opCode & 1) == eZNodeAssignment::OP_CODE_NOP) { // There is nothing to do so just return $db->commit(); if ($mainNodeID == false) { return $object->attribute('main_node_id'); } return; } $updateFields = false; if ($opCode == eZNodeAssignment::OP_CODE_MOVE || $opCode == eZNodeAssignment::OP_CODE_CREATE) { // if ( $fromNodeID == 0 || $fromNodeID == -1) if ($opCode == eZNodeAssignment::OP_CODE_CREATE || $opCode == eZNodeAssignment::OP_CODE_SET) { // If the node already exists it means we have a conflict (for 'CREATE'). // We resolve this by leaving node-assignment data be. if ($existingNode == null) { $parentNode = eZContentObjectTreeNode::fetch($nodeID); $user = eZUser::currentUser(); if (!eZSys::isShellExecution() and !$user->isAnonymous()) { eZContentBrowseRecent::createNew($user->id(), $parentNode->attribute('node_id'), $parentNode->attribute('name')); } $updateFields = true; $existingNode = $parentNode->addChild($object->attribute('id'), true); if ($fromNodeID == -1) { $updateSectionID = true; } } elseif ($opCode == eZNodeAssignment::OP_CODE_SET) { $updateFields = true; } } elseif ($opCode == eZNodeAssignment::OP_CODE_MOVE) { if ($fromNodeID == 0 || $fromNodeID == -1) { eZDebug::writeError("NodeAssignment '" . $nodeAssignment->attribute('id') . "' is marked with op_code='{$opCode}' but has no data in from_node_id. Cannot use it for moving node.", __METHOD__); } else { // clear cache for old placement. $additionalNodeIDList = array($fromNodeID); eZContentCacheManager::clearContentCacheIfNeeded($objectID, $versionNum, $additionalNodeIDList); $originalNode = eZContentObjectTreeNode::fetchNode($originalObjectID, $fromNodeID); if ($originalNode->attribute('main_node_id') == $originalNode->attribute('node_id')) { $updateSectionID = true; } $originalNode->move($parentNodeID); $existingNode = eZContentObjectTreeNode::fetchNode($originalObjectID, $parentNodeID); $updateFields = true; } } } elseif ($opCode == eZNodeAssignment::OP_CODE_REMOVE) { $db->commit(); return; } if ($updateFields) { if (strlen($nodeAssignment->attribute('parent_remote_id')) > 0) { $existingNode->setAttribute('remote_id', $nodeAssignment->attribute('parent_remote_id')); } $existingNode->setAttribute('sort_field', $nodeAssignment->attribute('sort_field')); $existingNode->setAttribute('sort_order', $nodeAssignment->attribute('sort_order')); } $existingNode->setAttribute('contentobject_is_published', 1); eZDebug::createAccumulatorGroup('nice_urls_total', 'Nice urls'); if ($mainNodeID > 0) { $existingNodeID = $existingNode->attribute('node_id'); if ($existingNodeID != $mainNodeID) { eZContentBrowseRecent::updateNodeID($existingNodeID, $mainNodeID); } $existingNode->setAttribute('main_node_id', $mainNodeID); } else { $existingNode->setAttribute('main_node_id', $existingNode->attribute('node_id')); } $existingNode->store(); if ($updateSectionID) { eZContentOperationCollection::updateSectionID($objectID, $versionNum); } $db->commit(); if ($mainNodeID == false) { return $existingNode->attribute('node_id'); } }