function execute($process, $event) { eZDebugSetting::writeDebug('kernel-workflow-approve', $process, 'eZApprove2Type::execute'); eZDebugSetting::writeDebug('kernel-workflow-approve', $event, 'eZApprove2Type::execute'); $parameters = $process->attribute('parameter_list'); $versionID = $parameters['version']; $object = eZContentObject::fetch($parameters['object_id']); if (!$object) { eZDebugSetting::writeError('kernel-workflow-approve', $parameters['object_id'], 'eZApprove2Type::execute'); return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; } /* If we run event first time ( when we click publish in admin ) we do not have user_id set in workflow process, so we take current user and store it in workflow process, so next time when we run event from cronjob we fetch user_id from there. */ if ($process->attribute('user_id') == 0) { $user = eZUser::currentUser(); $process->setAttribute('user_id', $user->id()); } else { $user = eZUser::instance($process->attribute('user_id')); } $eventData = eZApprove2Event::fetch($event->attribute('id'), $event->attribute('version')); $userGroups = array_merge((array) $user->attribute('groups'), (array) $user->attribute('contentobject_id')); $workflowSections = explode(',', $eventData->attribute('selected_sections')); $workflowGroups = explode(',', $eventData->attribute('selected_usergroups')); $editors = explode(',', $eventData->attribute('approve_users')); $approveGroups = explode(',', $eventData->attribute('approve_groups')); eZDebugSetting::writeDebug('kernel-workflow-approve', $user, 'eZApprove2Type::execute::user'); eZDebugSetting::writeDebug('kernel-workflow-approve', $userGroups, 'eZApprove2Type::execute::userGroups'); eZDebugSetting::writeDebug('kernel-workflow-approve', $editors, 'eZApprove2Type::execute::editor'); eZDebugSetting::writeDebug('kernel-workflow-approve', $workflowSections, 'eZApprove2Type::execute::workflowSections'); eZDebugSetting::writeDebug('kernel-workflow-approve', $workflowGroups, 'eZApprove2Type::execute::workflowGroups'); eZDebugSetting::writeDebug('kernel-workflow-approve', $object->attribute('section_id'), 'eZApprove2Type::execute::section_id'); $section = $object->attribute('section_id'); $correctSection = false; if (!in_array($section, $workflowSections) && !in_array(-1, $workflowSections)) { $assignedNodes = $object->attribute('assigned_nodes'); if ($assignedNodes) { foreach ($assignedNodes as $assignedNode) { $parent = $assignedNode->attribute('parent'); $parentObject = $parent->object(); $section = $parentObject->attribute('section_id'); if (in_array($section, $workflowSections)) { $correctSection = true; break; } } } } else { $correctSection = true; } switch ($eventData->attribute('approve_type')) { case eZApprove2Event::ApproveTypeUser: $inExcludeGroups = false; $userIsEditor = false; break; default: case eZApprove2Event::ApproveTypePredefined: $inExcludeGroups = count(array_intersect($userGroups, $workflowGroups)) != 0; $userIsEditor = in_array($user->id(), $editors) || count(array_intersect($userGroups, $approveGroups)) != 0; break; } if (!$inExcludeGroups && !$userIsEditor && $correctSection) { switch ($eventData->attribute('approve_type')) { case eZApprove2Event::ApproveTypeUser: $contentObjectVersionID = $parameters['version']; $contentObjectID = $parameters['object_id']; $approveStatus = eZXApproveStatus::fetchByContentObjectID($contentObjectID, $contentObjectVersionID); if (!$approveStatus || $approveStatus->attribute('approve_status') == eZXApproveStatus::StatusSelectApprover) { if (!$approveStatus) { $approveStatus = eZXApproveStatus::create($contentObjectID, $contentObjectVersionID, $process->attribute('id'), $process->attribute('event_position')); $approveStatus->store(); $approveStatus->setCreator($user->attribute('contentobject_id')); } $approveStatus->setAttribute('active_version', $contentObjectVersionID); $approveStatus->sync(); $process->Template = array(); $process->Template['templateName'] = 'design:workflow/eventtype/ezapprove2/select_approver.tpl'; $process->Template['templateVars'] = array('event' => $event, 'approval_status' => $approveStatus, 'object' => $object); // Set object version to draft untill approvers are selected successfully in case user exists in the wrong way. #include_once( 'kernel/classes/ezcontentobjectversion.php' ); $contentObjectVersion = eZContentObjectVersion::fetchVersion($contentObjectVersionID, $contentObjectID); $contentObjectVersion->setAttribute('status', eZContentObjectVersion::STATUS_DRAFT); $contentObjectVersion->sync(); return eZWorkflowType::STATUS_FETCH_TEMPLATE_REPEAT; } else { switch ($approveStatus->attribute('approve_status')) { case eZXApproveStatus::StatusSelectApprover: // Do nothing, continue processing in next cronjob run. return eZWorkflowType::STATUS_DEFERRED_TO_CRON_REPEAT; break; case eZXApproveStatus::StatusInApproval: // Check if enough users have approves the workflow, or any has discarded it. $discardCount = $approveStatus->discardedUserCount(); $collaborationItem = $approveStatus->attribute('collaboration_item'); #include_once( eZExtension::baseDirectory() . '/ezapprove2/collaboration/ezapprove2/ezapprove2collaborationhandler.php' ); if ($discardCount > 0) { $approveStatus->cancel(); $approveINI = eZINI::instance('ezapprove2.ini'); if ($approveINI->variable('ApproveSettings', 'NodeCreationOnDraft') == 'true') { $db = eZDB::instance(); $db->query('UPDATE ezcontentobject_version SET status = ' . eZContentObjectVersion::STATUS_REJECTED . ' WHERE contentobject_id = ' . $approveStatus->attribute('contentobject_id') . ' AND version = ' . $approveStatus->attribute('active_version')); $db->query('DELETE FROM ezcontentobject_tree where contentobject_id = ' . $approveStatus->attribute('contentobject_id') . ' AND contentobject_version = ' . $approveStatus->attribute('active_version')); $db->query('DELETE FROM ezurlalias WHERE destination_url=\'content/versionview/' . $approveStatus->attribute('contentobject_id') . '/' . $approveStatus->attribute('active_version') . '\''); } return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; } $numRequired = $approveStatus->attribute('num_approve_required'); $numApproved = $approveStatus->attribute('num_approved'); if ($numApproved >= $numRequired) { $collaborationItem->setAttribute('data_int3', eZApprove2CollaborationHandler::STATUS_ACCEPTED); $collaborationItem->setAttribute('status', eZCollaborationItem::STATUS_INACTIVE); $timestamp = time(); $collaborationItem->setAttribute('modified', $timestamp); $collaborationItem->setIsActive(false); $collaborationItem->sync(); $approveStatus->setAttribute('approve_status', eZXApproveStatus::StatusApproved); $approveStatus->store(); $approveINI = eZINI::instance('ezapprove2.ini'); if ($approveINI->variable('ApproveSettings', 'ObjectLockOnEdit') == 'true') { // Unlock related objects $object = $approveStatus->attribute('contentobject'); // #HACK# if ($object->attribute('contentclass_id') == 17) { foreach ($object->relatedContentObjectList($approveStatus->attribute('active_version'), false, false) as $relatedObject) { $relatedObject->setAttribute('flags', $relatedObject->attribute('flags') ^ EZ_CONTENT_OBJECT_FLAG_LOCK_EDIT ^ EZ_CONTENT_OBJECT_FLAG_LOCK_REMOVE); $relatedObject->sync(); } } } return eZWorkflowType::STATUS_ACCEPTED; } else { // Still need more approvers. return eZWorkflowType::STATUS_DEFERRED_TO_CRON_REPEAT; } break; case eZXApproveStatus::StatusDiscarded: $approveINI = eZINI::instance('ezapprove2.ini'); if ($approveINI->variable('ApproveSettings', 'NodeCreationOnDraft') == 'true') { $db = eZDB::instance(); $db->arrayQuery('DELETE FROM ezcontentobject_tree where contentobject_id = ' . $approveStatus->attribute('contentobject_id') . ' AND contentobject_version = ' . $approveStatus->attribute('active_version')); } return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; break; case eZXApproveStatus::StatusApproved: case eZXApproveStatus::StatusFinnished: // Nothing special to do. break; } } break; case eZApprove2Event::ApproveTypePredefined: $approveStatus = eZXApproveStatus::fetchByWorkflowProcessID($process->attribute('id'), $process->attribute('event_position')); if (!$approveStatus) { $contentObjectVersionID = $parameters['version']; $contentObjectID = $parameters['object_id']; $db = eZDB::instance(); $db->begin(); // CREATE APPROVE STATUS $approveStatus = eZXApproveStatus::create($contentObjectID, $contentObjectVersionID, $process->attribute('id'), $process->attribute('event_position')); $approveStatus->store(); $approveStatus->setCreator($user->attribute('contentobject_id')); // ADD APPROVERS foreach ($approveGroups as $userGroupID) { $userGroupObject = eZContentObject::fetch($userGroupID); if ($userGroupObject) { $userGroupNode = $userGroupObject->attribute('main_node'); if ($userGroupNode) { foreach ($userGroupNode->subTree(array('Depth' => 1, 'DepthOperator' => 'eq', 'Limitation' => array())) as $userNode) { $approveStatus->addApproveUser($userNode->attribute('contentobject_id')); } } } } foreach ($editors as $userID) { $approveStatus->addApproveUser($userID); } $approveStatus->setAttribute('approve_status', eZXApproveStatus::StatusInApproval); $approveStatus->store(); $approveStatus->createCollaboration(false, $user->attribute('contentobject_id')); $approveStatus->store(); $db->commit(); } $discardCount = $approveStatus->discardedUserCount(); $collaborationItem = $approveStatus->attribute('collaboration_item'); #include_once( eZExtension::baseDirectory() . '/ezapprove2/collaboration/ezapprove2/ezapprove2collaborationhandler.php' ); if ($discardCount > 0) { $approveStatus->cancel(); return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; } $numApproved = $approveStatus->attribute('num_approved'); if ($numApproved >= 1) { $collaborationItem->setAttribute('data_int3', eZApprove2CollaborationHandler::STATUS_ACCEPTED); $collaborationItem->setAttribute('status', eZCollaborationItem::STATUS_INACTIVE); $timestamp = time(); $collaborationItem->setAttribute('modified', $timestamp); $collaborationItem->setIsActive(false); $collaborationItem->sync(); $approveStatus->setAttribute('approve_status', eZXApproveStatus::StatusApproved); $approveStatus->store(); return eZWorkflowType::STATUS_ACCEPTED; } else { // Still need more approvers. return eZWorkflowType::STATUS_DEFERRED_TO_CRON_REPEAT; } break; } } else { eZDebugSetting::writeDebug('kernel-workflow-approve', $workflowSections, "we are not going to create approval " . $object->attribute('section_id')); eZDebugSetting::writeDebug('kernel-workflow-approve', $userGroups, "we are not going to create approval"); eZDebugSetting::writeDebug('kernel-workflow-approve', $workflowGroups, "we are not going to create approval"); eZDebugSetting::writeDebug('kernel-workflow-approve', $user->id(), "we are not going to create approval "); return eZWorkflowType::STATUS_ACCEPTED; } }