diff --git a/src/Plugin/Derivative/FormModeManagerLocalAction.php b/src/Plugin/Derivative/FormModeManagerLocalAction.php index b4e356d..e726eff 100644 --- a/src/Plugin/Derivative/FormModeManagerLocalAction.php +++ b/src/Plugin/Derivative/FormModeManagerLocalAction.php @@ -50,37 +50,19 @@ class FormModeManagerLocalAction extends DeriverBase implements ContainerDeriver foreach ($form_modes_definitions as $entity_type_id => $form_modes) { foreach ($form_modes as $form_mode_name => $form_mode) { if ($this->formModeManager->hasActiveFormMode($entity_type_id, $form_mode_name)) { - $this->derivatives["form_mode_manager.{$form_mode['id']}"] = [ - 'route_name' => "form_mode_manager.$entity_type_id.add_page.$form_mode_name", - 'title' => $this->t('Add @entity_label as @form_mode', [ - '@form_mode' => $form_mode['label'], - '@entity_label' => $entity_type_id, - ]), - 'route_parameters' => ['form_mode_name' => $form_mode_name], - 'appears_on' => ["entity.{$entity_type_id}.collection"], - 'cache_tags' => $this->formModeManager->getListCacheTags(), - ]; - - if ('user' === $entity_type_id) { + + $this->setDefaultLocalTask($form_mode, $entity_type_id, $form_mode_name); + + if ($this->isUserEntityType($entity_type_id)) { $this->derivatives["form_mode_manager.{$form_mode['id']}"]['route_name'] = "user.admin_create.$form_mode_name"; unset($this->derivatives["form_mode_manager.{$form_mode['id']}"]['route_parameters']); } - if ('node' === $entity_type_id) { - $this->derivatives["form_mode_manager.{$form_mode['id']}"]['appears_on'] = ['system.admin_content']; - } + $this->setNodeEntityType($form_mode, $entity_type_id); - if ('media' === $entity_type_id) { - $this->derivatives["form_mode_manager.{$form_mode['id']}"]['appears_on'] = ['view.media.media_page_list']; - } + $this->setMediaEntityType($form_mode, $entity_type_id); - if ('taxonomy_term' === $entity_type_id) { - $this->derivatives["form_mode_manager.{$form_mode['id']}"]['appears_on'] = ['entity.taxonomy_vocabulary.overview_form']; - $this->derivatives["form_mode_manager.{$form_mode['id']}"]['title'] = $this->t('Add @entity_label as @form_mode', [ - '@form_mode' => $form_mode['label'], - '@entity_label' => 'term', - ]); - } + $this->setTaxonomyTermEntityType($form_mode, $entity_type_id); } } } @@ -88,4 +70,86 @@ class FormModeManagerLocalAction extends DeriverBase implements ContainerDeriver return $this->derivatives; } + /** + * Set default local task. + * + * @param array $form_mode + * A form mode. + * @param string $entity_type_id + * An entity type id. + * @param string $form_mode_name + * A form mode name. + */ + public function setDefaultLocalTask(array $form_mode, $entity_type_id, $form_mode_name) { + $this->derivatives["form_mode_manager.{$form_mode['id']}"] = [ + 'route_name' => "form_mode_manager.$entity_type_id.add_page.$form_mode_name", + 'title' => $this->t('Add @entity_label as @form_mode', [ + '@form_mode' => $form_mode['label'], + '@entity_label' => $entity_type_id, + ]), + 'route_parameters' => ['form_mode_name' => $form_mode_name], + 'appears_on' => ["entity.{$entity_type_id}.collection"], + 'cache_tags' => $this->formModeManager->getListCacheTags(), + ]; + } + + /** + * Determine if the current entity type is 'user'. + * + * @param string $entity_type_id + * An entity type id. + * + * @return bool + * True if this $entity_type_id is user. + */ + public function isUserEntityType($entity_type_id) { + return ('user' === $entity_type_id); + } + + /** + * Set derivative the current entity type is 'node'. + * + * @param array $form_mode + * A form mode. + * @param string $entity_type_id + * An entity type id. + */ + public function setNodeEntityType(array $form_mode, $entity_type_id) { + if ('node' === $entity_type_id) { + $this->derivatives["form_mode_manager.{$form_mode['id']}"]['appears_on'] = ['system.admin_content']; + } + } + + /** + * Set derivative the current entity type is 'media'. + * + * @param array $form_mode + * A form mode. + * @param string $entity_type_id + * An entity type id. + */ + public function setMediaEntityType(array $form_mode, $entity_type_id) { + if ('media' === $entity_type_id) { + $this->derivatives["form_mode_manager.{$form_mode['id']}"]['appears_on'] = ['view.media.media_page_list']; + } + } + + /** + * Set derivative the current entity type is 'taxonomy_term'. + * + * @param array $form_mode + * A form mode. + * @param string $entity_type_id + * An entity type id. + */ + public function setTaxonomyTermEntityType(array $form_mode, $entity_type_id) { + if ('taxonomy_term' === $entity_type_id) { + $this->derivatives["form_mode_manager.{$form_mode['id']}"]['appears_on'] = ['entity.taxonomy_vocabulary.overview_form']; + $this->derivatives["form_mode_manager.{$form_mode['id']}"]['title'] = $this->t('Add @entity_label as @form_mode', [ + '@form_mode' => $form_mode['label'], + '@entity_label' => 'term', + ]); + } + } + } diff --git a/src/Plugin/Derivative/FormModeManagerLocalTasks.php b/src/Plugin/Derivative/FormModeManagerLocalTasks.php index 62011ef..db3d204 100644 --- a/src/Plugin/Derivative/FormModeManagerLocalTasks.php +++ b/src/Plugin/Derivative/FormModeManagerLocalTasks.php @@ -16,6 +16,11 @@ class FormModeManagerLocalTasks extends DeriverBase implements ContainerDeriverI use StringTranslationTrait; /** + * The specific route name of block_content canonical. + */ + const BLOCK_CONTENT_CANONICAL = 'entity.block_content.canonical'; + + /** * The Form Mode Manager service. * * @var \Drupal\form_mode_manager\FormModeManagerInterface @@ -23,6 +28,20 @@ class FormModeManagerLocalTasks extends DeriverBase implements ContainerDeriverI protected $formModeManager; /** + * The Form Mode Manager service. + * + * @var string[] + */ + protected $cacheTags; + + /** + * The Form Mode Manager service. + * + * @var array + */ + protected $formModesDefinitionsList; + + /** * Constructs a new Form Mode ManagerLocalTasks. * * @param \Drupal\form_mode_manager\FormModeManagerInterface $form_mode_manager @@ -30,6 +49,8 @@ class FormModeManagerLocalTasks extends DeriverBase implements ContainerDeriverI */ public function __construct(FormModeManagerInterface $form_mode_manager) { $this->formModeManager = $form_mode_manager; + $this->cacheTags = $form_mode_manager->getListCacheTags(); + $this->formModesDefinitionsList = $form_mode_manager->getAllFormModesDefinitions(); } /** @@ -46,55 +67,15 @@ class FormModeManagerLocalTasks extends DeriverBase implements ContainerDeriverI */ public function getDerivativeDefinitions($base_plugin_definition) { $this->derivatives = []; - $form_modes_definitions = $this->formModeManager->getAllFormModesDefinitions(); - $form_mode_manager_tags = $this->formModeManager->getListCacheTags(); - // Add Taks on each entity_types compatible. - foreach ($form_modes_definitions as $entity_type_id => $form_modes) { - $is_primary_tasks = $this->formModeManager->tasksIsPrimary($entity_type_id); - - $this->derivatives["form_mode_manager.$entity_type_id.default.task_tab"] = [ - 'route_name' => "entity.$entity_type_id.edit_form", - 'title' => $this->t('Edit as Default'), - 'parent_id' => "entity.$entity_type_id.edit_form", - 'cache_tags' => $form_mode_manager_tags, - ]; - - // Special case for block_content entities. - if ('block_content' === $entity_type_id) { - $this->derivatives["form_mode_manager.$entity_type_id.default.task_tab"]['route_name'] = 'entity.block_content.canonical'; - $this->derivatives["form_mode_manager.$entity_type_id.default.task_tab"]['parent_id'] = 'entity.block_content.canonical'; - } - - // Add one sub-task by form-mode active. + foreach ($this->formModesDefinitionsList as $entity_type_id => $form_modes) { + $this->setDefaultTasks($entity_type_id); foreach ($form_modes as $form_mode_name => $form_mode) { if ($this->formModeManager->hasActiveFormMode($entity_type_id, $form_mode_name)) { - $this->derivatives["form_mode_manager.{$form_mode['id']}.task_tab"] = [ - 'route_name' => "entity.$entity_type_id.edit_form.$form_mode_name", - 'title' => $this->t('Edit as @form_mode', [ - '@form_mode' => $form_mode['label'], - ]), - 'parent_id' => "entity.$entity_type_id.edit_form", - 'cache_tags' => $form_mode_manager_tags, - ]; - - if ('user' === $entity_type_id) { - $this->setUserRegisterTask($form_mode); - } - - if ('block_content' === $entity_type_id) { - $this->derivatives["form_mode_manager.{$form_mode['id']}.task_tab"]['parent_id'] = 'entity.block_content.canonical'; - } - - // Evaluate if tasks does be displayed at the primary level. - if ($is_primary_tasks) { - $this->derivatives["form_mode_manager.{$form_mode['id']}.task_tab"]['base_route'] = "entity.$entity_type_id.canonical"; - unset($this->derivatives["form_mode_manager.{$form_mode['id']}.task_tab"]['parent_id']); - } + $this->setFormModesTasks($form_mode, $entity_type_id, $this->formModeManager->tasksIsPrimary($entity_type_id)); } } } - // Ensure Base Plugin Definition are added onto all derivatives. foreach ($this->derivatives as &$entry) { $entry += $base_plugin_definition; } @@ -103,16 +84,101 @@ class FormModeManagerLocalTasks extends DeriverBase implements ContainerDeriverI } /** + * Set a Specific local tasks parameters for block_content entity. + * + * @param string $element_name + * Name of element to enhance. + * @param string $entity_type_id + * The definition of block_content tasks. + * @param bool $is_default_task + * Determine context of tasks (defaults or form mode manager) derivative. + */ + private function blockContentEnhancer($element_name, $entity_type_id, $is_default_task = TRUE) { + if ('block_content' === $entity_type_id) { + if ($is_default_task) { + $this->derivatives[$element_name]['route_name'] = self::BLOCK_CONTENT_CANONICAL; + } + + $this->derivatives[$element_name]['parent_id'] = self::BLOCK_CONTENT_CANONICAL; + } + } + + /** + * Set the default tasks on each entities. + * + * @param string $entity_type_id + * The entity type ID. + */ + private function setDefaultTasks($entity_type_id) { + $this->derivatives["form_mode_manager.$entity_type_id.default.task_tab"] = [ + 'route_name' => "entity.$entity_type_id.edit_form", + 'title' => $this->t('Edit as Default'), + 'parent_id' => "entity.$entity_type_id.edit_form", + 'cache_tags' => $this->cacheTags, + ]; + + $element_name = "form_mode_manager.$entity_type_id.default.task_tab"; + $this->blockContentEnhancer($element_name, $entity_type_id); + } + + /** + * Set the default tasks on each entities. + * + * @param array $form_mode + * An associative array represent a DisplayForm entity. + * @param string $entity_type_id + * The entity type ID. + * @param bool $is_primary_tasks + * True if we need to place tasks on primary level. + */ + private function setFormModesTasks(array $form_mode, $entity_type_id, $is_primary_tasks) { + $this->setFormModesTasksBase($form_mode, $entity_type_id); + $this->setUserRegisterTasks($form_mode, $entity_type_id); + + $element_name = "form_mode_manager.{$form_mode['id']}.task_tab"; + $this->blockContentEnhancer($element_name, $entity_type_id, FALSE); + + // Evaluate if tasks does be displayed at the primary level. + if ($is_primary_tasks) { + $this->derivatives[$element_name]['base_route'] = "entity.$entity_type_id.canonical"; + unset($this->derivatives[$element_name]['parent_id']); + } + } + + /** + * Set a Specific local tasks to `user.page` pages (register). + * + * @param array $form_mode + * An associative array represent a DisplayForm entity. + * @param string $entity_type_id + * The entity type ID. + */ + private function setUserRegisterTasks(array $form_mode, $entity_type_id) { + if ('user' === $entity_type_id) { + $this->derivatives["form_mode_manager.{$form_mode['id']}.register_task_tab"] = [ + 'route_name' => "user.register.{$this->formModeManager->getFormModeMachineName($form_mode['id'])}", + 'title' => $this->t('Create new account as @form_mode', ['@form_mode' => $form_mode['label']]), + 'base_route' => "user.page", + ]; + } + } + + /** * Set a Specific local tasks to `user.page` pages (register). * * @param array $form_mode - * The definition array of the base plugin. + * An associative array represent a DisplayForm entity. + * @param string $entity_type_id + * The entity type ID. */ - private function setUserRegisterTask(array $form_mode) { - $this->derivatives["form_mode_manager.{$form_mode['id']}.register_task_tab"] = [ - 'route_name' => "user.register.{$this->formModeManager->getFormModeMachineName($form_mode['id'])}", - 'title' => $this->t('Create new account as @form_mode', ['@form_mode' => $form_mode['label']]), - 'base_route' => "user.page", + private function setFormModesTasksBase(array $form_mode, $entity_type_id) { + $this->derivatives["form_mode_manager.{$form_mode['id']}.task_tab"] = [ + 'route_name' => "entity.$entity_type_id.edit_form.{$this->formModeManager->getFormModeMachineName($form_mode['id'])}", + 'title' => $this->t('Edit as @form_mode', [ + '@form_mode' => $form_mode['label'], + ]), + 'parent_id' => "entity.$entity_type_id.edit_form", + 'cache_tags' => $this->cacheTags, ]; } diff --git a/src/Routing/RouteSubscriber.php b/src/Routing/RouteSubscriber.php index 1e267c4..011c91d 100644 --- a/src/Routing/RouteSubscriber.php +++ b/src/Routing/RouteSubscriber.php @@ -174,7 +174,7 @@ class RouteSubscriber extends RouteSubscriberBase { * The entity type definition. Useful when a single class is, * used for multiple, possibly dynamic entity types. * @param array $form_mode - * The operation array of form variation (form_mode). + * An associative array represent a DisplayForm entity. * * @return \Symfony\Component\Routing\Route|null * The generated route, if available.