entityTypeManager = $entity_type_manager; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static($container->get('entity_type.manager')); } /** * {@inheritdoc} * * Blank out the base form ID so that form alters that use the base form ID to * target both add and edit forms don't pick up this form. */ public function getBaseFormId() { return NULL; } /** * {@inheritdoc} */ public function form(array $form, FormStateInterface $form_state) { /* @var \Drupal\Core\Config\Entity\ConfigEntityInterface $bundle */ $bundle = $this->getEntity(); $bundle_of_entity_type = $this->entityTypeManager->getDefinition($bundle->getEntityType()->getBundleOf()); /* @var \Drupal\workflows\WorkflowInterface[] $workflows */ $workflows = $this->entityTypeManager->getStorage('workflow')->loadMultiple(); $options = array_map(function (WorkflowInterface $workflow) { return $workflow->label(); }, array_filter($workflows, function (WorkflowInterface $workflow) { return $workflow->status() && $workflow->getTypePlugin() instanceof ContentModeration; })); $selected_workflow = array_reduce($workflows, function ($carry, WorkflowInterface $workflow) use ($bundle_of_entity_type, $bundle) { $plugin = $workflow->getTypePlugin(); if ($plugin instanceof ContentModeration && $plugin->appliesToEntityTypeAndBundle($bundle_of_entity_type->id(), $bundle->id())) { return $workflow->id(); } return $carry; }); $form['workflow'] = [ '#type' => 'select', '#title' => $this->t('Select the workflow to apply'), '#default_value' => $selected_workflow, '#options' => $options, '#required' => FALSE, '#empty_value' => '', ]; $form['original_workflow'] = [ '#type' => 'value', '#value' => $selected_workflow, ]; $form['bundle'] = [ '#type' => 'value', '#value' => $bundle->id(), ]; $form['entity_type'] = [ '#type' => 'value', '#value' => $bundle_of_entity_type->id(), ]; // Add a special message when moderation is being disabled. if ($selected_workflow) { $form['enable_workflow_note'] = [ '#type' => 'item', '#description' => $this->t('After disabling moderation, any existing forward drafts will be accessible via the "Revisions" tab.'), '#access' => !empty($selected_workflow) ]; } return parent::form($form, $form_state); } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { // If moderation is enabled, revisions MUST be enabled as well. Otherwise we // can't have forward revisions. drupal_set_message($this->t('Your settings have been saved.')); } /** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { $entity_type_id = $form_state->getValue('entity_type'); $bundle_id = $form_state->getValue('bundle'); $new_workflow_id = $form_state->getValue('workflow'); $original_workflow_id = $form_state->getValue('original_workflow'); if ($new_workflow_id === $original_workflow_id) { // Nothing to do. return; } if ($original_workflow_id) { /* @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = $this->entityTypeManager->getStorage('workflow')->load($original_workflow_id); $workflow->getTypePlugin()->removeEntityTypeAndBundle($entity_type_id, $bundle_id); $workflow->save(); } if ($new_workflow_id) { /* @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = $this->entityTypeManager->getStorage('workflow')->load($new_workflow_id); $workflow->getTypePlugin()->addEntityTypeAndBundle($entity_type_id, $bundle_id); $workflow->save(); } } /** * {@inheritdoc} */ protected function actions(array $form, FormStateInterface $form_state) { $actions['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), '#submit' => ['::submitForm', '::save'], ]; return $actions; } }