You are here

protected function Workflow::rebuildInternals in Workflow 7.2

Rebuild internals that get saved separately.

1 call to Workflow::rebuildInternals()
Workflow::save in includes/Entity/Workflow.php
Given information, update or insert a new workflow.

File

includes/Entity/Workflow.php, line 104
Contains workflow\includes\Entity\Workflow. Contains workflow\includes\Entity\WorkflowController.

Class

Workflow

Code

protected function rebuildInternals() {

  // Avoid recursive rebuilding.
  if ($this->rebuilding) {
    return;
  }
  $this->rebuilding = TRUE;

  // Insert the type_map when building from Features.
  if (isset($this->typeMap)) {
    foreach ($this->typeMap as $node_type) {
      workflow_insert_workflow_type_map($node_type, $this->wid);
    }
  }

  // Index the existing states and transitions by name.
  $db_name_map = WorkflowState::getStates($this->wid, TRUE);

  // sid -> state.
  $db_states = array();

  // name -> state.
  foreach ($db_name_map as $state) {
    $db_states[$state
      ->getName()] = $state;
  }
  $db_transitions = array();
  foreach (entity_load('WorkflowConfigTransition') as $transition) {
    if ($transition->wid == $this->wid) {
      $start_name = $db_name_map[$transition->sid]
        ->getName();
      $end_name = $db_name_map[$transition->target_sid]
        ->getName();
      $name = WorkflowConfigTransition::machineName($start_name, $end_name);
      $db_transitions[$name] = $transition;
    }
  }

  // Update/create states.
  $states = isset($this->states) ? $this->states : array();
  $saved_states = array();

  // Saved states: key -> sid.
  $saved_state_names = array();
  foreach ($states as $key => $data) {
    $data = (array) $data;
    $name = $data['name'];
    if (isset($db_states[$name])) {
      $state = $db_states[$name];
    }
    else {
      $state = $this
        ->createState($name, FALSE);
    }
    $state->wid = $this->wid;
    $state->state = $data['state'];
    $state->weight = $data['weight'];
    $state->sysid = $data['sysid'];
    if (!$data['status']) {
      $this
        ->rebuildStateInactive($state);
    }
    $state->status = $data['status'];
    $state
      ->save();
    unset($db_states[$name]);
    $saved_states[$key] = $state;
    $saved_state_names[$state->sid] = $key;
  }

  // Update/create transitions.
  $transitions = isset($this->transitions) ? $this->transitions : array();
  foreach ($transitions as $name => $data) {
    $data = (array) $data;
    if (is_numeric($name)) {
      if (isset($saved_states[$data['sid']]) && isset($saved_states[$data['target_sid']])) {
        $start_state = $saved_states[$data['sid']];

        // #2876303
        $end_state = $saved_states[$data['target_sid']];

        // #2876303
      }
      else {
        $start_state = $this
          ->getState($data['sid']);
        $end_state = $this
          ->getState($data['target_sid']);
      }
    }
    else {
      $start_state = $saved_states[$data['start_state']];
      $end_state = $saved_states[$data['end_state']];
    }
    $name = WorkflowConfigTransition::machineName($start_state
      ->getName(), $end_state
      ->getName());
    if (isset($db_transitions[$name])) {
      $transition = $db_transitions[$name];
    }
    else {
      $transition = $this
        ->createTransition($start_state->sid, $end_state->sid);
    }
    $transition->wid = $this->wid;
    $transition->sid = $start_state->sid;
    $transition->target_sid = $end_state->sid;
    $transition->label = $data['label'];
    $transition->roles = $this
      ->rebuildRoles($data['roles']);
    $transition
      ->save();
    unset($db_transitions[$name]);
  }

  // Any states/transitions left in $db_states/transitions need deletion.
  foreach ($db_states as $state) {
    $this
      ->rebuildStateInactive($state);
    $state
      ->delete();
  }
  foreach ($db_transitions as $transition) {
    $transition
      ->delete();
  }

  // Clear the caches, and set $this->states and $this->transitions.
  $this->states = $this->transitions = NULL;
  $this
    ->getStates(TRUE, TRUE);
  $this
    ->getTransitions(FALSE, array(), TRUE);
  $this->rebuilding = FALSE;
}