*/ $Module = $Params['Module']; $WorkflowID = ( isset( $Params["WorkflowID"] ) ) ? $Params["WorkflowID"] : false; switch ( $Params["FunctionName"] ) { case "up": case "down": { if ( $WorkflowID !== false ) { if ( isset( $Params["EventID"] ) ) { $event = eZWorkflowEvent::fetch( $Params["EventID"], true, 1, array( "workflow_id", "version", "placement" ) ); $event->move( $Params["FunctionName"] == "up" ? false : true ); $Module->redirectTo( $Module->functionURI( 'edit' ) . '/' . $WorkflowID ); return; } else { eZDebug::writeError( "Missing parameter EventID for function: " . $params["Function"] ); $Module->setExitStatus( eZModule::STATUS_FAILED ); return; } } else { eZDebug::writeError( "Missing parameter WorkfowID for function: " . $params["Function"] ); $Module->setExitStatus( eZModule::STATUS_FAILED );
$db = eZDB::instance(); $workflowProcessList = eZWorkflowProcess::fetchForStatus( eZWorkflow::STATUS_DEFERRED_TO_CRON ); $cli->output( "Checking for workflow processes" ); $removedProcessCount = 0; $processCount = 0; $statusMap = array(); foreach( $workflowProcessList as $process ) { $db->begin(); $workflow = eZWorkflow::fetch( $process->attribute( "workflow_id" ) ); if ( $process->attribute( "event_id" ) != 0 ) $workflowEvent = eZWorkflowEvent::fetch( $process->attribute( "event_id" ) ); $process->run( $workflow, $workflowEvent, $eventLog ); // Store changes to process ++$processCount; $status = $process->attribute( 'status' ); if ( !isset( $statusMap[$status] ) ) $statusMap[$status] = 0; ++$statusMap[$status]; if ( $process->attribute( 'status' ) != eZWorkflow::STATUS_DONE ) { if ( $process->attribute( 'status' ) == eZWorkflow::STATUS_RESET || $process->attribute( 'status' ) == eZWorkflow::STATUS_FAILED || $process->attribute( 'status' ) == eZWorkflow::STATUS_NONE || $process->attribute( 'status' ) == eZWorkflow::STATUS_CANCELLED ||
function runWorkflow() { $workflowProcessList = eZWorkflowProcess::fetchForStatus(eZWorkflow::STATUS_DEFERRED_TO_CRON); foreach ($workflowProcessList as $process) { $workflow = eZWorkflow::fetch($process->attribute("workflow_id")); if ($process->attribute("event_id") != 0) { $workflowEvent = eZWorkflowEvent::fetch($process->attribute("event_id")); } $process->run($workflow, $workflowEvent, $eventLog); // Store changes to process if ($process->attribute('status') != eZWorkflow::STATUS_DONE) { if ($process->attribute('status') == eZWorkflow::STATUS_RESET || $process->attribute('status') == eZWorkflow::STATUS_FAILED || $process->attribute('status') == eZWorkflow::STATUS_NONE || $process->attribute('status') == eZWorkflow::STATUS_CANCELLED || $process->attribute('status') == eZWorkflow::STATUS_BUSY) { $bodyMemento = eZOperationMemento::fetchMain($process->attribute('memento_key')); $mementoList = eZOperationMemento::fetchList($process->attribute('memento_key')); $bodyMemento->remove(); foreach ($mementoList as $memento) { $memento->remove(); } } if ($process->attribute('status') == eZWorkflow::STATUS_CANCELLED) { $process->removeThis(); } else { $process->store(); } } else { //restore memento and run it $bodyMemento = eZOperationMemento::fetchChild($process->attribute('memento_key')); if (is_null($bodyMemento)) { eZDebug::writeError($bodyMemento, "Empty body memento in workflow.php"); continue; } $bodyMementoData = $bodyMemento->data(); $mainMemento = $bodyMemento->attribute('main_memento'); if (!$mainMemento) { continue; } $mementoData = $bodyMemento->data(); $mainMementoData = $mainMemento->data(); $mementoData['main_memento'] = $mainMemento; $mementoData['skip_trigger'] = true; $mementoData['memento_key'] = $process->attribute('memento_key'); $bodyMemento->remove(); $operationParameters = array(); if (isset($mementoData['parameters'])) { $operationParameters = $mementoData['parameters']; } $operationResult = eZOperationHandler::execute($mementoData['module_name'], $mementoData['operation_name'], $operationParameters, $mementoData); $process->removeThis(); } } }
$workflowEvent = eZWorkflowEvent::fetch($process->attribute("event_id")); } $lastEventStatus = $process->attribute("last_event_status"); if ($http->hasPostVariable("RunProcess")) { // $Module->redirectTo( $Module->functionURI( "process" ) . "/" . $WorkflowProcessID ); // return; if ($workflowEvent instanceof eZWorkflowEvent) { $eventType = $workflowEvent->eventType(); $lastEventStatus = $eventType->execute($process, $workflowEvent); } $event_pos = $process->attribute("event_position"); $next_event_pos = $event_pos + 1; $next_event_id = $workflow->fetchEventIndexed($next_event_pos); if ($next_event_id !== null) { $process->advance($next_event_id, $next_event_pos, $lastEventStatus); $workflowEvent = eZWorkflowEvent::fetch($next_event_id); } else { unset($workflowEvent); $workflowEvent = false; $process->advance(); } $process->setAttribute("modified", time()); $process->store(); } $tpl->setVariable("event_status", eZWorkflowType::statusName($lastEventStatus)); $tpl->setVariable("current_workflow", $workflow); $tpl->setVariable("current_event", $workflowEvent); $Module->setTitle("Workflow process"); $tpl->setVariable("process", $process); $tpl->setVariable("module", $Module); $tpl->setVariable("http", $http);
function execute($process, $event) { $processParameters = $process->attribute('parameter_list'); $storeProcessParameters = false; $classID = false; $object = false; $sectionID = false; $languageID = 0; if (isset($processParameters['object_id'])) { $object = eZContentObject::fetch($processParameters['object_id']); } else { if (isset($processParameters['node_id'])) { $object = eZContentObject::fetchByNodeID($processParameters['node_id']); } } if ($object instanceof eZContentObject) { // Examine if the published version contains one of the languages we // match for. if (isset($processParameters['version'])) { $versionID = $processParameters['version']; $version = $object->version($versionID); if (is_object($version)) { $version_option = $event->attribute('version_option'); if ($version_option == eZMultiplexerType::VERSION_OPTION_FIRST_ONLY and $processParameters['version'] > 1 or $version_option == eZMultiplexerType::VERSION_OPTION_EXCEPT_FIRST and $processParameters['version'] == 1) { return eZWorkflowType::STATUS_ACCEPTED; } // If the language ID is part of the mask the result is non-zero. $languageID = (int) $version->attribute('initial_language_id'); } } $sectionID = $object->attribute('section_id'); $class = $object->attribute('content_class'); if ($class) { $classID = $class->attribute('id'); } } $userArray = explode(',', $event->attribute('data_text2')); $classArray = explode(',', $event->attribute('data_text5')); $languageMask = $event->attribute('data_int2'); if (!isset($processParameters['user_id'])) { $user = eZUser::currentUser(); $userID = $user->id(); $processParameters['user_id'] = $userID; $storeProcessParameters = true; } else { $userID = $processParameters['user_id']; $user = eZUser::fetch($userID); if (!$user instanceof eZUser) { $user = eZUser::currentUser(); $userID = $user->id(); $processParameters['user_id'] = $userID; $storeProcessParameters = true; } } $userGroups = $user->attribute('groups'); $inExcludeGroups = count(array_intersect($userGroups, $userArray)) != 0; if ($storeProcessParameters) { $process->setParameters($processParameters); $process->store(); } // All languages match by default $hasLanguageMatch = true; if ($languageMask != 0) { // Match ID with mask. $hasLanguageMatch = (bool) ($languageMask & $languageID); } if ($hasLanguageMatch && !$inExcludeGroups && (in_array(-1, $classArray) || in_array($classID, $classArray))) { $sectionArray = explode(',', $event->attribute('data_text1')); if (in_array($sectionID, $sectionArray) || in_array(-1, $sectionArray)) { $workflowToRun = $event->attribute('data_int1'); $childParameters = array_merge($processParameters, array('workflow_id' => $workflowToRun, 'user_id' => $userID, 'parent_process_id' => $process->attribute('id'))); $childProcessKey = eZWorkflowProcess::createKey($childParameters); $childProcessArray = eZWorkflowProcess::fetchListByKey($childProcessKey); $childProcess =& $childProcessArray[0]; if ($childProcess == null) { $childProcess = eZWorkflowProcess::create($childProcessKey, $childParameters); $childProcess->store(); } $workflow = eZWorkflow::fetch($childProcess->attribute("workflow_id")); $workflowEvent = null; if ($childProcess->attribute("event_id") != 0) { $workflowEvent = eZWorkflowEvent::fetch($childProcess->attribute("event_id")); } $childStatus = $childProcess->run($workflow, $workflowEvent, $eventLog); $childProcess->store(); if ($childStatus == eZWorkflow::STATUS_DEFERRED_TO_CRON) { $this->setActivationDate($childProcess->attribute('activation_date')); $childProcess->setAttribute("status", eZWorkflow::STATUS_WAITING_PARENT); $childProcess->store(); return eZWorkflowType::STATUS_DEFERRED_TO_CRON_REPEAT; } else { if ($childStatus == eZWorkflow::STATUS_FETCH_TEMPLATE or $childStatus == eZWorkflow::STATUS_FETCH_TEMPLATE_REPEAT) { $process->Template =& $childProcess->Template; return eZWorkflowType::STATUS_FETCH_TEMPLATE_REPEAT; } else { if ($childStatus == eZWorkflow::STATUS_REDIRECT) { $process->RedirectUrl =& $childProcess->RedirectUrl; return eZWorkflowType::STATUS_REDIRECT_REPEAT; } else { if ($childStatus == eZWorkflow::STATUS_DONE) { $childProcess->removeThis(); return eZWorkflowType::STATUS_ACCEPTED; } else { if ($childStatus == eZWorkflow::STATUS_CANCELLED) { $childProcess->removeThis(); return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; } else { if ($childStatus == eZWorkflow::STATUS_FAILED) { $childProcess->removeThis(); return eZWorkflowType::STATUS_REJECTED; } } } } } } return $childProcess->attribute('event_status'); } } return eZWorkflowType::STATUS_ACCEPTED; }
function execute($process, $event) { $parameters = $process->attribute('parameter_list'); $objectId = $parameters['object_id']; $object = eZContentObject::fetch($objectId); $subtreeNodeID = $event->attribute('target_subtree'); $subtreeNode = eZContentObjectTreeNode::fetch($subtreeNodeID); eZDebug::writeDebug("Event begins execution for object {$objectId}, subtree {$subtreeNodeID}", __METHOD__); if ($object != null && $subtreeNode != null) { $is_child = false; $locations = $object->assignedNodes(); if ($locations == null) { // pre-creation event: obj has no node on its own, but a putative parent //eZDebug::writeDebug( 'Obj node is new!', __METHOD__ ); $locations = eZNodeAssignment::fetchForObject($objectId, $object->attribute("current_version")); foreach ($locations as $key => $location) { $locations[$key] = $location->getParentNode(); } } foreach ($locations as $node) { $subtreeNodePath = $node->pathArray(); //eZDebug::writeDebug( 'Testing if obj node '.$node->NodeID.' is child of : ' . $subtreeNodeID, __METHOD__ ); if (in_array($subtreeNodeID, $subtreeNodePath)) { eZDebug::writeDebug('Found that obj node ' . $node->NodeID . ' is child of node ' . $subtreeNodeID, __METHOD__); $is_child = true; break; } } if ($is_child) { $workflowToRun = $event->attribute('target_workflow'); $user = eZUser::currentUser(); $userID = $user->id(); $processParameters = $process->attribute('parameter_list'); // code copy+pasted from ez multoplexer worflow... $childParameters = array_merge($processParameters, array('workflow_id' => $workflowToRun, 'user_id' => $userID, 'parent_process_id' => $process->attribute('id'))); $childProcessKey = eZWorkflowProcess::createKey($childParameters); $childProcessArray = eZWorkflowProcess::fetchListByKey($childProcessKey); $childProcess =& $childProcessArray[0]; if ($childProcess == null) { $childProcess = eZWorkflowProcess::create($childProcessKey, $childParameters); $childProcess->store(); } $workflow = eZWorkflow::fetch($childProcess->attribute("workflow_id")); $workflowEvent = null; if ($childProcess->attribute("event_id") != 0) { $workflowEvent = eZWorkflowEvent::fetch($childProcess->attribute("event_id")); } $childStatus = $childProcess->run($workflow, $workflowEvent, $eventLog); $childProcess->store(); if ($childStatus == eZWorkflow::STATUS_DEFERRED_TO_CRON) { $this->setActivationDate($childProcess->attribute('activation_date')); $childProcess->setAttribute("status", eZWorkflow::STATUS_WAITING_PARENT); $childProcess->store(); return eZWorkflowType::STATUS_DEFERRED_TO_CRON_REPEAT; } else { if ($childStatus == eZWorkflow::STATUS_FETCH_TEMPLATE) { $process->Template =& $childProcess->Template; return eZWorkflowType::STATUS_FETCH_TEMPLATE_REPEAT; } else { if ($childStatus == eZWorkflow::STATUS_REDIRECT) { $process->RedirectUrl =& $childProcess->RedirectUrl; return eZWorkflowType::STATUS_REDIRECT_REPEAT; } else { if ($childStatus == eZWorkflow::STATUS_DONE) { $childProcess->removeThis(); return eZWorkflowType::STATUS_ACCEPTED; } else { if ($childStatus == eZWorkflow::STATUS_CANCELLED || $childStatus == eZWorkflow::STATUS_FAILED) { $childProcess->removeThis(); return eZWorkflowType::STATUS_REJECTED; } } } } } return $childProcess->attribute('event_status'); } return eZWorkflowType::STATUS_ACCEPTED; } else { eZDebug::writeError("Event triggered for inexisting object ({$objectId}) or subtree ({$subtreeNodeID})", __METHOD__); return eZWorkflowType::STATUS_WORKFLOW_CANCELLED; } }
function removeThis() { $workflowParameters = $this->attribute('parameter_list'); $cleanupList = array(); $db = eZDB::instance(); $db->begin(); if (isset($workflowParameters['cleanup_list']) && is_array($workflowParameters['cleanup_list'])) { $cleanupList = $workflowParameters['cleanup_list']; foreach ($cleanupList as $workflowEventID) { $workflowEvent = eZWorkflowEvent::fetch($workflowEventID); $workflowType = $workflowEvent->eventType(); $workflowType->cleanup($this, eZWorkflowEvent::fetch($workflowEventID)); } } eZPersistentObject::removeObject(eZWorkflowProcess::definition(), array('id' => $this->attribute('id'))); $db->commit(); }