eZContentOperationCollection::publishNode PHP Method

publishNode() public static method

public static publishNode ( $parentNodeID, $objectID, $versionNum, $mainNodeID )
    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'));
            }
            if ($nodeAssignment->attribute('is_hidden')) {
                $existingNode->setAttribute('is_hidden', 1);
                $existingNode->setAttribute('is_invisible', 1);
            }
            $existingNode->setAttribute('priority', $nodeAssignment->attribute('priority'));
            $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');
        }
    }

Usage Example

$cli->output($cli->stylize('bold', 'Updating object attributes'));
if (is_array($IDs) and count($IDs) > 0) {
    foreach ($IDs as $id) {
        $cli->output('Updating object attribute: id - ' . $id['id'] . ' & version - ' . $id['version']);
        $objectAttribute = eZContentObjectAttribute::fetch($id['id'], $id['version']);
        $textString = $objectAttribute->attribute('data_text');
        $textArray = explode('***', $textString);
        $objectAttribute->setAttribute('data_type_string', 'sckenhancedselection');
        $objectAttribute->DataTypeString = 'sckenhancedselection';
        $objectAttribute->setAttribute('data_text', serialize($textArray));
        $objectAttribute->store();
        $objectAttribute->updateSortKey();
        $object = $objectAttribute->attribute('object');
        $class = $object->attribute('content_class');
        // Reset the name
        $object->setName($class->contentObjectName($object));
        // Update the nodes
        $nodes = $object->attribute('assigned_nodes');
        foreach ($nodes as $node) {
            eZContentOperationCollection::publishNode($node->attribute('parent_node_id'), $object->attribute('id'), $object->attribute('current_version'), $object->attribute('main_node_id'));
        }
        eZSearch::removeObjectById($object->attribute('id'));
        eZSearch::addObject($object);
        unset($objectAttribute, $object, $class, $node);
    }
} else {
    $cli->output('No object attributes to update!');
}
$cli->output();
$cli->output('Done.');
$script->shutdown();