/** * {@inheritdoc} * * Implements workflow_transition() -> WorkflowDefaultWidget::submit(). * * Overrides submit(array $form, array &$form_state). * Contains 2 extra parameters for D7 * * @param array $form * @param array $form_state * @param array $items * The value of the field. * @param bool $force * TRUE if all access must be overridden, e.g., for Rules. * * @return int * If update succeeded, the new State Id. Else, the old Id is returned. * * This is called from function _workflowfield_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) */ 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 $entity EntityInterface */ $entity = $form_state->getFormObject()->getEntity(); /* @var $transition \Drupal\workflow\Entity\WorkflowTransitionInterface */ $transition = $item['workflow_transition']; $field_name = $transition->getFieldName(); // N.B. Use a proprietary version of copyFormValuesToEntity, // where $entity/$transition is passed by reference. // $this->copyFormValuesToEntity($entity, $form, $form_state); /* @var $transition \Drupal\workflow\Entity\WorkflowTransitionInterface */ $transition = WorkflowTransitionElement::copyFormItemValuesToEntity($transition, $form, $item); // Try to execute the transition. Return $from_sid when error. if (!$transition) { // This should not be possible (perhaps when testing/developing). drupal_set_message(t('Error: the transition from %from_sid to %to_sid could not be generated.'), 'error'); // The current value is still the previous state. $to_sid = $from_sid; } 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); if ($field_name == $action_info['field_name']) { $transition->to_sid->value = $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. // // Set the transition back, to be used in hook_entity_update(). $item['workflow_transition'] = $transition; // // Set the value at the proper location. $item['value'] = $to_sid; } } return $values; }
/** * {@inheritdoc} */ public function buildEntity(array $form, FormStateInterface $form_state) { $entity = clone $this->entity; // N.B. Use a proprietary version of copyFormValuesToEntity, // where $entity is passed by reference. // $this->copyFormValuesToEntity($entity, $form, $form_state); $item = $form_state->getValues(); $entity = WorkflowTransitionElement::copyFormItemValuesToEntity($entity, $form, $item); // Mark the entity as NOT requiring validation. (Used in validateForm().) $entity->setValidationRequired(FALSE); return $entity; }