Chris@0: pluginId = $plugin_id; Chris@0: $this->pluginDefinition = $plugin_definition; Chris@0: $this->routeProvider = $route_provider; Chris@0: Chris@0: $this->configFactory = $config_factory; Chris@0: $this->typedConfigManager = $typed_config; Chris@0: $this->localeConfigManager = $locale_config_manager; Chris@0: $this->configMapperManager = $config_mapper_manager; Chris@0: Chris@0: $this->stringTranslation = $string_translation; Chris@0: $this->languageManager = $language_manager; Chris@17: $this->eventDispatcher = $event_dispatcher ?: \Drupal::service('event_dispatcher'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { Chris@0: // Note that we ignore the plugin $configuration because mappers have Chris@0: // nothing to configure in themselves. Chris@18: return new static( Chris@0: $plugin_id, Chris@0: $plugin_definition, Chris@0: $container->get('config.factory'), Chris@0: $container->get('config.typed'), Chris@0: $container->get('locale.config_manager'), Chris@0: $container->get('plugin.manager.config_translation.mapper'), Chris@0: $container->get('router.route_provider'), Chris@0: $container->get('string_translation'), Chris@17: $container->get('language_manager'), Chris@17: $container->get('event_dispatcher') Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setRouteCollection(RouteCollection $collection) { Chris@0: $this->routeCollection = $collection; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getTitle() { Chris@0: // A title from a *.config_translation.yml. Should be translated for Chris@0: // display in the current page language. Chris@0: return $this->t($this->pluginDefinition['title']); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getBaseRouteName() { Chris@0: return $this->pluginDefinition['base_route_name']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getBaseRouteParameters() { Chris@0: return []; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getBaseRoute() { Chris@0: if ($this->routeCollection) { Chris@0: return $this->routeCollection->get($this->getBaseRouteName()); Chris@0: } Chris@0: else { Chris@0: return $this->routeProvider->getRouteByName($this->getBaseRouteName()); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Allows to process all config translation routes. Chris@0: * Chris@0: * @param \Symfony\Component\Routing\Route $route Chris@0: * The route object to process. Chris@0: */ Chris@0: protected function processRoute(Route $route) { Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getBasePath() { Chris@0: return Url::fromRoute($this->getBaseRouteName(), $this->getBaseRouteParameters())->getInternalPath(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getOverviewRouteName() { Chris@0: return 'config_translation.item.overview.' . $this->getBaseRouteName(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getOverviewRouteParameters() { Chris@0: return $this->getBaseRouteParameters(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getOverviewRoute() { Chris@0: $route = new Route( Chris@0: $this->getBaseRoute()->getPath() . '/translate', Chris@0: [ Chris@0: '_controller' => '\Drupal\config_translation\Controller\ConfigTranslationController::itemPage', Chris@0: 'plugin_id' => $this->getPluginId(), Chris@0: ], Chris@0: ['_config_translation_overview_access' => 'TRUE'] Chris@0: ); Chris@0: $this->processRoute($route); Chris@0: return $route; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getOverviewPath() { Chris@0: return Url::fromRoute($this->getOverviewRouteName(), $this->getOverviewRouteParameters())->getInternalPath(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getAddRouteName() { Chris@0: return 'config_translation.item.add.' . $this->getBaseRouteName(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getAddRouteParameters() { Chris@0: // If sub-classes provide route parameters in getBaseRouteParameters(), they Chris@0: // probably also want to provide those for the add, edit, and delete forms. Chris@0: $parameters = $this->getBaseRouteParameters(); Chris@0: $parameters['langcode'] = $this->langcode; Chris@0: return $parameters; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getAddRoute() { Chris@0: $route = new Route( Chris@0: $this->getBaseRoute()->getPath() . '/translate/{langcode}/add', Chris@0: [ Chris@0: '_form' => '\Drupal\config_translation\Form\ConfigTranslationAddForm', Chris@0: 'plugin_id' => $this->getPluginId(), Chris@0: ], Chris@0: ['_config_translation_form_access' => 'TRUE'] Chris@0: ); Chris@0: $this->processRoute($route); Chris@0: return $route; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getEditRouteName() { Chris@0: return 'config_translation.item.edit.' . $this->getBaseRouteName(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getEditRouteParameters() { Chris@0: return $this->getAddRouteParameters(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getEditRoute() { Chris@0: $route = new Route( Chris@0: $this->getBaseRoute()->getPath() . '/translate/{langcode}/edit', Chris@0: [ Chris@0: '_form' => '\Drupal\config_translation\Form\ConfigTranslationEditForm', Chris@0: 'plugin_id' => $this->getPluginId(), Chris@0: ], Chris@0: ['_config_translation_form_access' => 'TRUE'] Chris@0: ); Chris@0: $this->processRoute($route); Chris@0: return $route; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getDeleteRouteName() { Chris@0: return 'config_translation.item.delete.' . $this->getBaseRouteName(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getDeleteRouteParameters() { Chris@0: return $this->getAddRouteParameters(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getDeleteRoute() { Chris@0: $route = new Route( Chris@0: $this->getBaseRoute()->getPath() . '/translate/{langcode}/delete', Chris@0: [ Chris@0: '_form' => '\Drupal\config_translation\Form\ConfigTranslationDeleteForm', Chris@0: 'plugin_id' => $this->getPluginId(), Chris@0: ], Chris@0: ['_config_translation_form_access' => 'TRUE'] Chris@0: ); Chris@0: $this->processRoute($route); Chris@0: return $route; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConfigNames() { Chris@0: return $this->pluginDefinition['names']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function addConfigName($name) { Chris@0: $this->pluginDefinition['names'][] = $name; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getWeight() { Chris@0: return $this->pluginDefinition['weight']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function populateFromRouteMatch(RouteMatchInterface $route_match) { Chris@0: $this->langcode = $route_match->getParameter('langcode'); Chris@17: Chris@17: $event = new ConfigMapperPopulateEvent($this, $route_match); Chris@17: $this->eventDispatcher->dispatch(ConfigTranslationEvents::POPULATE_MAPPER, $event); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getTypeLabel() { Chris@0: return $this->getTitle(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getLangcode() { Chris@0: $langcodes = array_map([$this, 'getLangcodeFromConfig'], $this->getConfigNames()); Chris@0: Chris@0: if (count(array_unique($langcodes)) > 1) { Chris@0: throw new ConfigMapperLanguageException('A config mapper can only contain configuration for a single language.'); Chris@0: } Chris@0: Chris@0: return reset($langcodes); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getLangcodeFromConfig($config_name) { Chris@0: // Default to English if no language code was provided in the file. Chris@0: // Although it is a best practice to include a language code, if the Chris@0: // developer did not think about a multilingual use case, we fall back Chris@0: // on assuming the file is English. Chris@0: return $this->configFactory->get($config_name)->get('langcode') ?: 'en'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setLangcode($langcode) { Chris@0: $this->langcode = $langcode; Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConfigData() { Chris@0: $config_data = []; Chris@0: foreach ($this->getConfigNames() as $name) { Chris@0: $config_data[$name] = $this->configFactory->getEditable($name)->get(); Chris@0: } Chris@0: return $config_data; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function hasSchema() { Chris@0: foreach ($this->getConfigNames() as $name) { Chris@0: if (!$this->typedConfigManager->hasConfigSchema($name)) { Chris@0: return FALSE; Chris@0: } Chris@0: } Chris@0: return TRUE; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function hasTranslatable() { Chris@0: foreach ($this->getConfigNames() as $name) { Chris@0: if ($this->configMapperManager->hasTranslatable($name)) { Chris@0: return TRUE; Chris@0: } Chris@0: } Chris@0: return FALSE; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function hasTranslation(LanguageInterface $language) { Chris@0: foreach ($this->getConfigNames() as $name) { Chris@0: if ($this->localeConfigManager->hasTranslation($name, $language->getId())) { Chris@0: return TRUE; Chris@0: } Chris@0: } Chris@0: return FALSE; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getTypeName() { Chris@0: return $this->t('Settings'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getOperations() { Chris@0: return [ Chris@0: 'translate' => [ Chris@0: 'title' => $this->t('Translate'), Chris@0: 'url' => Url::fromRoute($this->getOverviewRouteName(), $this->getOverviewRouteParameters()), Chris@0: ], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getContextualLinkGroup() { Chris@0: return NULL; Chris@0: } Chris@0: Chris@0: }