/** * {@inheritdoc} */ public function buildConfigurationForm(array $form, FormStateInterface $form_state) { $form = []; // If we are on admin/config/system/actions and use CREATE AN ADVANCED ACTION // Then $context only contains: // - $context['actions_label'] = "Change workflow state of post to new state" // - $context['actions_type'] = "entity" // // If we are on a VBO action form, then $context only contains: // - $context['entity_type'] = "node" // - $context['view'] = "(Object) view" // - $context['settings'] = "array()" // @todo: test with multiple workflows per entity. $wids = workflow_get_workflow_names(); $wid = array_keys($wids)[0]; // Get the common Workflow, or create a dummy Workflow. $workflow = $wid ? Workflow::load($wid) : Workflow::create(['id' => 'dummy_action', 'label' => 'dummy_action']); $current_state = $workflow->getCreationState(); /* // @TODO D8-port // Show the current state and the Workflow form to allow state changing. // N.B. This part is replicated in hook_node_view, workflow_tab_page, workflow_vbo. if ($workflow) { $field = _workflow_info_field($field_name, $workflow); $field_name = $field['field_name']; $field_id = $field['id']; $instance = field_info_instance($entity_type, $field_name, $entity_bundle); // Hide the submit button. VBO has its own 'next' button. $instance['widget']['settings']['submit_function'] = ''; if (!$field_id) { // This is a Workflow Node workflow. Set widget options as in v7.x-1.2 $field['settings']['widget']['comment'] = isset($workflow->options['comment_log_tab']) ? $workflow->options['comment_log_tab'] : 1; // vs. ['comment_log_node']; $field['settings']['widget']['current_status'] = TRUE; // As stated above, the options list is probably very long, so let's use select list. $field['settings']['widget']['options'] = 'select'; // Do not show the default [Update workflow] button on the form. $instance['widget']['settings']['submit_function'] = ''; } } // Add the form/widget to the formatter, and include the nid and field_id in the form id, // to allow multiple forms per page (in listings, with hook_forms() ). // Ultimately, this is a wrapper for WorkflowDefaultWidget. // $form['workflow_current_state'] = workflow_state_formatter($entity_type, $entity, $field, $instance); $form_id = implode('_', array( 'workflow_transition_form', $entity_type, $entity_id, $field_id )); */ $transition = $this->getTransitionForConfiguration($current_state); // Add the WorkflowTransitionForm to the page. // Here, not the $element is added, but the entity form. $element = []; // Just to be explicit. $element['#default_value'] = $transition; $form += WorkflowTransitionElement::transitionElement($element, $form_state, $form); // Remove the transition: generates an error upon saving the action definition. unset($form['workflow_transition']); // Todo D8: add the entity form. //$form = \Drupal::getContainer()->get('entity.form_builder')->getForm($transition, 'add'); // Remove the action button. The Entity itself has one. //unset($element['actions']); // Make adaptations for VBO-form: $entity = $transition->getTargetEntity(); $field_name = $transition->getFieldName(); $force = $this->configuration['force']; // Override the options widget. $form['to_sid']['#description'] = t('Please select the state that should be assigned when this action runs.'); // Add Field_name. @todo?? Add 'field_name' to WorkflowTransitionElement? $form['field_name'] = array('#type' => 'select', '#title' => t('Field name'), '#description' => t('Choose the field name.'), '#options' => _workflow_info_field_names($entity), '#default_value' => $field_name, '#required' => TRUE, '#weight' => -20); // Add Force. @todo?? Add 'force' to WorkflowTransitionElement? $form['force'] = array('#type' => 'checkbox', '#title' => t('Force transition'), '#description' => t('If this box is checked, the new state will be assigned even if workflow permissions disallow it.'), '#default_value' => $force, '#weight' => -19); // Change comment field. $form['comment'] = array('#title' => t('Message'), '#description' => t('This message will be written into the workflow history log when the action runs. You may include the following variables: %state, %title, %user.')) + $form['comment']; return $form; }
/** * {@inheritdoc} * * Be careful: Widget may be shown in very different places. Test carefully!! * - On a entity add/edit page * - On a entity preview page * - On a entity view page * - On a entity 'workflow history' tab * - On a comment display, in the comment history * - On a comment form, below the comment history * * @todo D8: change "array $items" to "FieldInterface $items" */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $wid = $this->getFieldSetting('workflow_type'); if (!($workflow = Workflow::load($wid))) { // @todo: add error message. return $element; } /* @var $item \Drupal\workflowfield\Plugin\Field\FieldType\WorkflowItem */ $item = $items[$delta]; /* @var $field_config \Drupal\field\Entity\FieldConfig */ $field_config = $item->getFieldDefinition(); /* @var $field_storage \Drupal\field\Entity\FieldStorageConfig */ $field_storage = $field_config->getFieldStorageDefinition(); $field_name = $field_storage->get('field_name'); $entity = $item->getEntity(); $from_sid = workflow_node_current_state($entity, $field_name); // Create a transition, to pass to the form. No need to use setValues(). /* @var $transition WorkflowTransition */ $transition = WorkflowTransition::create([$from_sid, 'field_name' => $field_name]); $transition->setTargetEntity($entity); if (!$this->isDefaultValueWidget($form_state)) { // Here, not the $element is added, but the entity form. // Option 1: use the Element. $element['#default_value'] = $transition; $element += WorkflowTransitionElement::transitionElement($element, $form_state, $form); // Option 2: use the Form, in order to get extra fields. //$entity_form_builder = \Drupal::getContainer()->get('entity.form_builder'); //$element += $entity_form_builder->getForm($transition, 'add'); //// Remove the action button. The Entity itself has one. //unset($element['actions']); // Option 3: use the true Element. // $form = $this->element($form, $form_state, $transition); //$element['workflow_transition'] = array( // '#type' => 'workflow_transition', // '#title' => t('Workflow transition'), // '#default_value' => $transition, // ); } else { // @todo D8: add a default value, so people can set a default comment. // On the Field settings page, User may not set a default value // (this is done by the Workflow module). // @see WorkflowState::getOptions(); // @see WorkflowDefaultWidget::formElement(); $element = array(); return $element; workflow_debug(__FILE__, __FUNCTION__, __LINE__, '', ''); // @todo D8-port: still test this snippet. // @see workflowfield_form_field_config_edit_form_alter for other settings // The Workflow field must have a value, so set to required. // Unfortunately, we need hook_form_alter for this. //$form['required']['#default_value'] = 1; //$form['required']['#disabled'] = TRUE; // Explicitly set default value to 'creation' and show element, // so people can set a default comment. $transition->to_sid = $workflow->getCreationSid(); $transition->setExecuted(TRUE); // @TODO D8-port: use a proper WorkflowTransitionElement call. $element['#default_value'] = $transition; $element += WorkflowTransitionElement::transitionElement($element, $form_state, $form); // No action buttons on default field settings page. // This is evaluated in hook_form_alter. _workflow_use_action_buttons(FALSE); // Make sure the options box is not hidden (when action buttons active). //$element['to_sid']['#type'] = 'select'; $element['to_sid']['#title'] = 'Initial state'; $element['to_sid']['#access'] = TRUE; unset($element['workflow_current_state']); return $element; } return $element; }
/** * This function is called by buildForm(). * Caveat: !! It is not declared in the EntityFormInterface !! * * {@inheritdoc} */ public function form(array $form, FormStateInterface $form_state) { // Call parent to get (extra) fields. // This might cause baseFieldDefinitions to appear twice. $form = parent::form($form, $form_state); /* @var $transition WorkflowTransitionInterface */ $transition = $this->entity; // Do not pass the element, but the form. // $element['#default_value'] = $transition; // $form += WorkflowTransitionElement::transitionElement($element, $form_state, $form); // // Pass the form via parameter $form['#default_value'] = $transition; $form = WorkflowTransitionElement::transitionElement($form, $form_state, $form); return $form; }