You are here

protected function ContentTranslationRouteSubscriber::alterRoutes in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php \Drupal\content_translation\Routing\ContentTranslationRouteSubscriber::alterRoutes()

Alters existing routes for a specific collection.

Parameters

\Symfony\Component\Routing\RouteCollection $collection: The route collection for adding routes.

Overrides RouteSubscriberBase::alterRoutes

File

core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php, line 37

Class

ContentTranslationRouteSubscriber
Subscriber for entity translation routes.

Namespace

Drupal\content_translation\Routing

Code

protected function alterRoutes(RouteCollection $collection) {
  foreach ($this->contentTranslationManager
    ->getSupportedEntityTypes() as $entity_type_id => $entity_type) {

    // Inherit admin route status from edit route, if exists.
    $is_admin = FALSE;
    $route_name = "entity.{$entity_type_id}.edit_form";
    if ($edit_route = $collection
      ->get($route_name)) {
      $is_admin = (bool) $edit_route
        ->getOption('_admin_route');
    }
    $load_latest_revision = ContentTranslationManager::isPendingRevisionSupportEnabled($entity_type_id);
    if ($entity_type
      ->hasLinkTemplate('drupal:content-translation-overview')) {
      $route = new Route($entity_type
        ->getLinkTemplate('drupal:content-translation-overview'), [
        '_controller' => '\\Drupal\\content_translation\\Controller\\ContentTranslationController::overview',
        'entity_type_id' => $entity_type_id,
      ], [
        '_entity_access' => $entity_type_id . '.view',
        '_access_content_translation_overview' => $entity_type_id,
      ], [
        'parameters' => [
          $entity_type_id => [
            'type' => 'entity:' . $entity_type_id,
            'load_latest_revision' => $load_latest_revision,
          ],
        ],
        '_admin_route' => $is_admin,
      ]);
      $route_name = "entity.{$entity_type_id}.content_translation_overview";
      $collection
        ->add($route_name, $route);
    }
    if ($entity_type
      ->hasLinkTemplate('drupal:content-translation-add')) {
      $route = new Route($entity_type
        ->getLinkTemplate('drupal:content-translation-add'), [
        '_controller' => '\\Drupal\\content_translation\\Controller\\ContentTranslationController::add',
        'source' => NULL,
        'target' => NULL,
        '_title' => 'Add',
        'entity_type_id' => $entity_type_id,
      ], [
        '_entity_access' => $entity_type_id . '.view',
        '_access_content_translation_manage' => 'create',
      ], [
        'parameters' => [
          'source' => [
            'type' => 'language',
          ],
          'target' => [
            'type' => 'language',
          ],
          $entity_type_id => [
            'type' => 'entity:' . $entity_type_id,
            'load_latest_revision' => $load_latest_revision,
          ],
        ],
        '_admin_route' => $is_admin,
      ]);
      $collection
        ->add("entity.{$entity_type_id}.content_translation_add", $route);
    }
    if ($entity_type
      ->hasLinkTemplate('drupal:content-translation-edit')) {
      $route = new Route($entity_type
        ->getLinkTemplate('drupal:content-translation-edit'), [
        '_controller' => '\\Drupal\\content_translation\\Controller\\ContentTranslationController::edit',
        'language' => NULL,
        '_title' => 'Edit',
        'entity_type_id' => $entity_type_id,
      ], [
        '_access_content_translation_manage' => 'update',
      ], [
        'parameters' => [
          'language' => [
            'type' => 'language',
          ],
          $entity_type_id => [
            'type' => 'entity:' . $entity_type_id,
            'load_latest_revision' => $load_latest_revision,
          ],
        ],
        '_admin_route' => $is_admin,
      ]);
      $collection
        ->add("entity.{$entity_type_id}.content_translation_edit", $route);
    }
    if ($entity_type
      ->hasLinkTemplate('drupal:content-translation-delete')) {
      $route = new Route($entity_type
        ->getLinkTemplate('drupal:content-translation-delete'), [
        '_entity_form' => $entity_type_id . '.content_translation_deletion',
        'language' => NULL,
        '_title' => 'Delete',
        'entity_type_id' => $entity_type_id,
      ], [
        '_access_content_translation_manage' => 'delete',
      ], [
        'parameters' => [
          'language' => [
            'type' => 'language',
          ],
          $entity_type_id => [
            'type' => 'entity:' . $entity_type_id,
            'load_latest_revision' => $load_latest_revision,
          ],
        ],
        '_admin_route' => $is_admin,
      ]);
      $collection
        ->add("entity.{$entity_type_id}.content_translation_delete", $route);
    }

    // Add our custom translation deletion access checker.
    if ($load_latest_revision) {
      $entity_delete_route = $collection
        ->get("entity.{$entity_type_id}.delete_form");
      if ($entity_delete_route) {
        $entity_delete_route
          ->addRequirements([
          '_access_content_translation_delete' => "{$entity_type_id}.delete",
        ]);
      }
    }
  }
}