View source
<?php
define('WORKFLOW_FEATURES_AUTHOR_NAME', 'workflow_features_author_name');
module_load_include('inc', 'workflow', 'workflow.deprecated');
function workflow_features_export($data, &$export, $module_name = '') {
$export['dependencies']['features'] = 'features';
$export['dependencies']['workflow'] = 'workflow';
foreach (Workflow::getWorkflows() as $workflow) {
$name = $workflow
->getName();
if (in_array($name, $data)) {
$export['features']['workflow'][$name] = $name;
}
}
return $export;
}
function workflow_features_export_render($module, $data) {
$translatables = $code = array();
$code[] = ' $workflows = array();';
$code[] = '';
$workflows = Workflow::getWorkflows();
foreach ($data as $name) {
if ($workflow = workflow_get_workflows_full_object($name)) {
unset($workflow->wid);
$workflow_export = features_var_export($workflow, ' ');
$workflow_identifier = features_var_export($workflow->name);
$code[] = " // Exported workflow: {$name}";
$code[] = " \$workflows[{$workflow_identifier}] = {$workflow_export};";
$code[] = "";
}
}
$code[] = ' return $workflows;';
$code = implode("\n", $code);
return array(
'workflow_default_workflows' => $code,
);
}
function workflow_features_export_options() {
$workflows = array();
foreach (Workflow::getWorkflows() as $workflow) {
$name = $workflow
->getName();
$workflows[$name] = $name;
}
return $workflows;
}
function workflow_features_revert($module) {
module_load_include('inc', 'features', 'features.export');
foreach (features_get_default('workflow', $module) as $key => $workflow) {
workflow_update_workflows_full_object($workflow);
}
}
function workflow_features_export_rebuild($module) {
workflow_features_revert($module);
}
function workflow_update_workflows_full_object($workflow) {
$workflow = (object) $workflow;
$states = isset($workflow->states) ? $workflow->states : array();
$transitions = isset($workflow->transitions) ? $workflow->transitions : array();
$node_types = isset($workflow->node_types) ? $workflow->node_types : array();
unset($workflow->states, $workflow->transitions, $workflow->node_types);
if ($orig_workflow = Workflow::getWorkflowByName($workflow->name)) {
$workflow->wid = $orig_workflow->wid;
}
workflow_update_workflows($workflow, FALSE);
if (!isset($workflow->wid) || empty($workflow->wid)) {
return FALSE;
}
$active_states = array();
foreach ($states as $state) {
$state = (object) $state;
$state->wid = $workflow->wid;
if ($orig_state = reset(workflow_get_workflow_states_by_wid_state($state->wid, $state->state))) {
$state->sid = $orig_state->sid;
}
workflow_update_workflow_states($state);
$active_states[$state->state] = $state->sid;
}
foreach (workflow_get_workflow_states_by_wid($workflow->wid) as $state) {
if (!in_array($state->sid, $active_states)) {
workflow_delete_workflow_states_by_sid($state->sid);
}
}
$active_transitions = array();
foreach ($transitions as $transition) {
$transition = (object) $transition;
$transition->sid = $active_states[$transition->state];
$transition->target_sid = $active_states[$transition->target_state];
$transition->roles = !empty($transition->roles) ? _workflow_roles_to_rids($transition->roles) : '';
workflow_update_workflow_transitions($transition);
$active_transitions[] = $transition->tid;
}
foreach (workflow_get_workflow_transitions_by_wid($workflow->wid) as $transition) {
if (!in_array($transition->tid, $active_transitions)) {
workflow_delete_workflow_transitions_by_tid($transition->tid);
}
}
foreach ($node_types as $node_type) {
$node_type = (object) array(
'type' => $node_type,
'wid' => $workflow->wid,
);
workflow_insert_workflow_type_map($node_type);
}
return TRUE;
}
function workflow_get_workflows_full_object($name) {
if ($workflow = Workflow::getWorkflowByName($name)) {
$options = array(
'status' => 1,
);
$active_states = array();
foreach (workflow_get_workflow_states_by_wid($workflow->wid, $options) as $index => $state) {
$active_states[$state->sid] = $state->state;
unset($state->sid);
unset($state->wid);
$workflow->states[] = $state;
}
foreach ($active_states as $sid => $state) {
foreach (workflow_get_workflow_transitions_by_sid($sid, $options) as $transition) {
$target_state = workflow_get_workflow_states_by_sid($transition->target_sid);
$transition->state = $state;
$transition->target_state = $target_state->state;
unset($transition->sid, $transition->target_sid);
$transition->roles = !empty($transition->roles) ? _workflow_rids_to_roles($transition->roles) : '';
unset($transition->tid);
$workflow->transitions[] = $transition;
}
}
foreach (workflow_get_workflow_type_map_by_wid($workflow->wid) as $index => $type_map) {
$workflow->node_types[] = $type_map->type;
}
}
return $workflow;
}
function _workflow_user_roles($reset = FALSE) {
$roles =& drupal_static(__FUNCTION__);
if ($reset || !isset($roles)) {
$roles = user_roles();
}
return $roles;
}
function _workflow_roles_to_rids($role_string) {
$roles = _workflow_user_roles();
$rid_array = array();
foreach (explode(',', $role_string) as $role_name) {
if ($role_name === WORKFLOW_FEATURES_AUTHOR_NAME) {
$rid_array[] = 'author';
}
elseif ($role_name && in_array($role_name, $roles)) {
$rid_array[] = array_search($role_name, $roles);
}
}
return implode(',', $rid_array);
}
function _workflow_rids_to_roles($rid_string) {
$roles = _workflow_user_roles();
$rid_array = explode(',', $rid_string);
$return = in_array('author', $rid_array) ? WORKFLOW_FEATURES_AUTHOR_NAME . ',' : '';
$return .= implode(',', array_intersect_key($roles, array_flip($rid_array)));
return trim($return, ',');
}