diff --git a/config_translation.local_tasks.yml b/config_translation.local_tasks.yml new file mode 100644 index 0000000..e94a94d --- /dev/null +++ b/config_translation.local_tasks.yml @@ -0,0 +1,5 @@ +config_translation.translate: + derivative: \Drupal\config_translation\Plugin\TranslateLocalTask + +config_translation.edit: + derivative: \Drupal\config_translation\Plugin\EditLocalTask diff --git a/config_translation.module b/config_translation.module index f28f16e..6c0ae74 100644 --- a/config_translation.module +++ b/config_translation.module @@ -32,21 +32,12 @@ function config_translation_menu() { $mappers = drupal_container()->get('plugin.manager.config_translation')->getMappers(); foreach ($mappers as $mapper) { $path = $mapper->getBasePathPattern(); - if ($mapper->needsEditTab()) { - // For pages that do not have a default tab, we need a default local task - // on this level, so that the translate tab will show up. - $items[$path . '/edit'] = array( - 'title' => 'Edit', - 'type' => MENU_DEFAULT_LOCAL_TASK, - 'weight' => -100, - ); - } $items[$path . '/translate'] = array( 'title callback' => 'config_translation_item_title', 'title arguments' => array(drupal_strtolower($mapper->getTypeName())), 'route_name' => $mapper->getRouteName(), 'type' => $mapper->getMenuItemType(), - 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE, + 'context' => MENU_CONTEXT_INLINE, 'weight' => 100, ); } @@ -207,3 +198,34 @@ function config_translation_entity_operation_alter(array &$operations, \Drupal\C ); } } + +/** + * Implements hook_local_tasks_alter(). + */ +function config_translation_local_tasks_alter(&$plugins) { + foreach ($plugins as &$definition) { + if (empty($definition['config_translate_plugin_id'])) { + continue; + } + + $config_translation_plugin_id = $definition['config_translate_plugin_id']; + $config_translation_plugin = \Drupal::service('plugin.manager.config_translation')->getDefinition($config_translation_plugin_id); + // The edit tab is probably the default task, of which the ID is known. + if ($config_translation_plugin['add_edit_tab']) { + $definition['tab_root_id'] = 'config_translation_edit:' . $config_translation_plugin_id; + } + else { + // Iterate over all plugins and search one with the proper route name. + $routes = \Drupal::service('router.route_provider')->getRoutesByPattern('/' . $config_translation_plugin['base_path']); + $route_names = array_keys($routes->all()); + $route_name = array_shift($route_names); + foreach ($plugins as $id => $sub_definition) { + if ($sub_definition['route_name'] == $route_name) { + $definition['tab_root_id'] = $id; + break; + } + } + // @todo If no existing edit tab was found we maybe should do something? + } + } +} diff --git a/lib/Drupal/config_translation/Plugin/EditLocalTask.php b/lib/Drupal/config_translation/Plugin/EditLocalTask.php new file mode 100644 index 0000000..ad67894 --- /dev/null +++ b/lib/Drupal/config_translation/Plugin/EditLocalTask.php @@ -0,0 +1,92 @@ +configMapperManager = $config_mapper_manager; + $this->routeProvider = $route_provider; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, $base_plugin_id) { + return new static($container->get('plugin.manager.config_translation'), $container->get('router.route_provider')); + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) { + if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) { + return $this->derivatives[$derivative_id]; + } + $this->getDerivativeDefinitions($base_plugin_definition); + return $this->derivatives[$derivative_id]; + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinitions(array $base_plugin_definition) { + $this->derivatives = array(); + + $mappers = $this->configMapperManager->getMappers(); + foreach ($mappers as $group) { + /** @var $group \Drupal\config_translation\ConfigNamesMapper */ + $routes = $this->routeProvider->getRoutesByPattern('/' . $group->getBasePathPattern()); + $route_names = array_keys($routes->all()); + $route_name = array_shift($route_names); + if ($group->needsEditTab()) { + $id = $group->getId(); + $this->derivatives[$id] = array( + 'title' => 'Edit', + 'route_name' => $route_name, + 'config_translate_plugin_id' => $id, + 'weight' => -100, + 'tab_root_id' => 'config_translation.edit:' . $id, + ); + + } + } + return $this->derivatives; + } +} diff --git a/lib/Drupal/config_translation/Plugin/TranslateLocalTask.php b/lib/Drupal/config_translation/Plugin/TranslateLocalTask.php new file mode 100644 index 0000000..03b0b78 --- /dev/null +++ b/lib/Drupal/config_translation/Plugin/TranslateLocalTask.php @@ -0,0 +1,82 @@ +configMapperManager = $config_mapper_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, $base_plugin_id) { + return new static($container->get('plugin.manager.config_translation')); + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) { + if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) { + return $this->derivatives[$derivative_id]; + } + $this->getDerivativeDefinitions($base_plugin_definition); + return $this->derivatives[$derivative_id]; + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinitions(array $base_plugin_definition) { + $this->derivatives = array(); + + $mappers = $this->configMapperManager->getMappers(); + foreach ($mappers as $group) { + /** @var $group \Drupal\config_translation\ConfigNamesMapper */ + if ($group->getMenuItemType() == MENU_LOCAL_TASK) { + $id = $group->getId(); + $this->derivatives[$id] = array( + 'title' => 'Translate', + 'route_name' => $group->getRouteName(), + 'config_translate_plugin_id' => $id, + 'weight' => 100, + ); + + } + } + return $this->derivatives; + } + + +}