Snippet: PHP Snippet Add Location to Object / Add Usergroup to User
Table of contents:
This is compatible with eZ Publish 4.
Compatibility
This example works with eZ Publish 4.x
About
This function allows adding a location to an extisting object even adds a usergroup to an existing user. The Code was taken and modified from kernel/content/action.php where it says " if ( $module->isCurrentAction( 'AddAssignment' ) )"
Example
/**
* Adds User to the chosen Usergroup
* objectID=UserobjectID
* newNodeID=usergroupNodeID
* @param integer $objectID
* @param unknown_type $newNodeID
*/
function addLocation($objectID,$newNodeID)
{
//$selectedNodeIDArray = eZContentBrowse::result( 'AddNodeAssignment' );
eZDebug::writeDebug("LocationAdd: objectID".$objectID."\nnewNodeID: ".$newNodeID);
$object = eZContentObject::fetch( $objectID );
$nodeID = $object->attribute("main_node_id");
//$version = $object->currentVersion();
$ini = eZINI::instance();
$userClassID = $ini->variable( "UserSettings", "UserClassID" );
// $node = eZContentObjectTreeNode::fetch( $nodeID );
$selectedNodeIDArray = array($newNodeID);
$node = eZContentObjectTreeNode::fetch( $selectedNodeIDArray[0] );
if ( !is_array( $selectedNodeIDArray ) )
$selectedNodeIDArray = array();
$nodeAssignmentList = eZNodeAssignment::fetchForObject( $objectID, $object->attribute( 'current_version' ), 0, false );
$assignedNodes = $object->assignedNodes();
$parentNodeIDArray = array();
$setMainNode = false;
$hasMainNode = false;
foreach ( $assignedNodes as $assignedNode )
{
if ( $assignedNode->attribute( 'is_main' ) )
$hasMainNode = true;
$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' );
}
}
if ( !$hasMainNode )
$setMainNode = true;
$existingNode = eZContentObjectTreeNode::fetch( $nodeID );
$mainNodeID = $existingNode->attribute( 'main_node_id' );
$objectName = $object->attribute( 'name' );
$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() ) );*/
$canCreate=true;
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 )
{
if ( $object->attribute( 'contentclass_id' ) == $userClassID )
{
eZUser::cleanupCache();
}
}
$db->commit();
//include_once( 'kernel/classes/ezcontentcachemanager.php' );
eZContentCacheManager::clearContentCacheIfNeeded( $objectID );
} 