Ejemplo n.º 1
0
 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;
     }
 }