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
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;
}