You are here

public function WorkflowDefaultWidget::massageFormValues in Workflow 8

Implements workflow_transition() -> WorkflowDefaultWidget::submit().

This is called from function _workflow_form_submit($form, &$form_state) It is a replacement of function workflow_transition($entity, $to_sid, $force, $field) It performs the following actions;

  • save a scheduled action
  • update history
  • restore the normal $items for the field.

@todo Remove update of {node_form} table. (separate task, because it has features, too.)

Overrides WidgetBase::massageFormValues

File

src/Plugin/Field/FieldWidget/WorkflowDefaultWidget.php, line 115

Class

WorkflowDefaultWidget
Plugin implementation of the 'workflow_default' widget.

Namespace

Drupal\workflow\Plugin\Field\FieldWidget

Code

public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
  $user = workflow_current_user();

  // @todo #2287057: verify if submit() really is only used for UI. If not, $user must be passed.
  // Set the new value.
  // Beware: We presume cardinality = 1 !!
  // The widget form element type has transformed the value to a
  // WorkflowTransition object at this point. We need to convert it
  // back to the regular 'value' string format.
  foreach ($values as &$item) {
    if (!empty($item)) {

      // } && $item['value'] instanceof DrupalDateTime) {
      // The following can NOT be retrieved from the WorkflowTransition.

      /** @var \Drupal\Core\Entity\EntityInterface $entity */
      $entity = $form_state
        ->getFormObject()
        ->getEntity();

      /** @var \Drupal\workflow\Entity\WorkflowTransitionInterface $transition */
      $transition = $item['workflow_transition'];

      // N.B. Use a proprietary version of copyFormValuesToEntity,
      // where $entity/$transition is passed by reference.
      $transition = WorkflowTransitionElement::copyFormValuesToTransition($transition, $form, $form_state, $item);

      // Try to execute the transition. Return $from_sid when error.
      if (!$transition) {

        // This should not be possible (perhaps when testing/developing).
        $this
          ->messenger()
          ->addError($this
          ->t('Error: the transition from %from_sid to %to_sid could not be generated.'));

        // The current value is still the previous state.
        $to_sid = $from_sid = 0;
      }
      else {

        // The transition may be scheduled or not. Save the result, and
        // rely upon hook workflow_entity_insert/update($entity) in
        // file workflow.module to save/execute the transition.
        // - validate option; add hook to let other modules change comment.
        // - add to history; add to watchdog
        // Return the new State ID. (Execution may fail and return the old Sid.)
        // Get the new value from an action button if set in the workflow settings.
        $action_info = _workflow_transition_form_get_triggering_button($form_state);
        $field_name = $transition
          ->getFieldName();
        if ($field_name == $action_info['field_name']) {
          $transition
            ->set('to_sid', $action_info['to_sid']);
        }
        $force = FALSE;

        // @todo D8-port: add to form for usage in VBO.
        // Now, save/execute the transition.
        $from_sid = $transition
          ->getFromSid();
        $force = $force || $transition
          ->isForced();
        if (!$transition
          ->isAllowed($user, $force)) {

          // Transition is not allowed.
          $to_sid = $from_sid;
        }
        elseif (!$entity || !$entity
          ->id()) {

          // Entity is inserted. The Id is not yet known.
          // So we can't yet save the transition right now, but must rely on
          // function/hook workflow_entity_insert($entity) in file workflow.module.
          // $to_sid = $transition->execute($force);
          $to_sid = $transition
            ->getToSid();
        }
        else {

          // Entity is updated. To stay in sync with insert, we rely on
          // function/hook workflow_entity_update($entity) in file workflow.module.
          // $to_sid = $transition->execute($force);
          $to_sid = $transition
            ->getToSid();
        }
      }

      // Now the data is captured in the Transition, and before calling the
      // Execution, restore the default values for Workflow Field.
      // For instance, workflow_rules evaluates this.
      //
      // N.B. Align the following functions:
      // - WorkflowDefaultWidget::massageFormValues();
      // - WorkflowManager::executeTransition().
      // Set the transition back, to be used in hook_entity_update().
      $item['workflow_transition'] = $transition;

      // Set the value at the proper location.
      if ($transition && $transition
        ->isScheduled()) {
        $item['value'] = $from_sid;
      }
      else {
        $item['value'] = $to_sid;
      }
    }
  }
  return $values;
}