You are here

class LanguageSwitcherLinksAlterer in Facets 8

Helper service that alters the language switcher links.

Facet URL aliases can be translated so we need to make sure that if we are on a page that has facet filters in the URL, we replace the language switcher links filters with the translated facet URL aliases for the target language.

Hierarchy

Expanded class hierarchy of LanguageSwitcherLinksAlterer

1 string reference to 'LanguageSwitcherLinksAlterer'
facets.services.yml in ./facets.services.yml
facets.services.yml
1 service uses LanguageSwitcherLinksAlterer
facets.language_switcher_links_alterer in ./facets.services.yml
Drupal\facets\LanguageSwitcherLinksAlterer

File

src/LanguageSwitcherLinksAlterer.php, line 20

Namespace

Drupal\facets
View source
class LanguageSwitcherLinksAlterer {

  /**
   * The language manager.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  protected $languageManager;

  /**
   * The cache backend.
   *
   * @var \Drupal\Core\Cache\CacheBackendInterface
   */
  protected $cacheBackend;

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The URL processor plugin manager.
   *
   * @var \Drupal\facets\UrlProcessor\UrlProcessorPluginManager
   */
  protected $urlProcessorManager;

  /**
   * The data needed to alter the language switcher links.
   *
   * @var array
   */
  protected $data = [];

  /**
   * LanguageSwitcherLinksAlterer constructor.
   *
   * @param \Drupal\Core\Language\LanguageManagerInterface $languageManager
   *   The language manager.
   * @param \Drupal\Core\Cache\CacheBackendInterface $cacheBackend
   *   The cache backend.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
   *   The entity type manager.
   * @param \Drupal\facets\UrlProcessor\UrlProcessorPluginManager $urlProcessorManager
   *   The URL processor plugin manager.
   */
  public function __construct(LanguageManagerInterface $languageManager, CacheBackendInterface $cacheBackend, EntityTypeManagerInterface $entityTypeManager, UrlProcessorPluginManager $urlProcessorManager) {
    $this->languageManager = $languageManager;
    $this->cacheBackend = $cacheBackend;
    $this->entityTypeManager = $entityTypeManager;
    $this->urlProcessorManager = $urlProcessorManager;
  }

  /**
   * Alters the language switcher links.
   *
   * @param array $links
   *   The links.
   * @param $type
   *   The language type.
   * @param \Drupal\Core\Url $url
   *   The URL the switch links will be relative to.
   *
   * @see facets_language_switch_links_alter()
   */
  public function alter(array &$links, $type, Url $url) {
    if (!$this->data) {
      $this
        ->initializeData();
    }
    $current_language = $this->languageManager
      ->getCurrentLanguage();
    foreach ($links as &$link) {
      if (empty($link['language']) || !$link['language'] instanceof LanguageInterface || $link['language']
        ->getId() === $current_language
        ->getId()) {
        continue;
      }
      foreach ($this->data as $facet_id => $facet_info) {
        $filter_key = $facet_info['filter_key'];
        $separator = $facet_info['separator'];
        $url_aliases = $facet_info['url_aliases'];
        $original_language = $url_aliases['original'];
        if (!isset($link['query'][$filter_key]) || !is_array($link['query'][$filter_key])) {
          continue;
        }
        $untranslated_alias = $url_aliases[$this->languageManager
          ->getCurrentLanguage()
          ->getId()];
        $translated_alias = $url_aliases[$link['language']
          ->getId()];

        // If we don't have a translated alias, that means we're trying to create
        // a link to the original language.
        if ($translated_alias === NULL) {
          $translated_alias = $url_aliases[$original_language];
        }

        // If we don't have an untranslated alias, we're trying to create a link
        // from the original language.
        if ($untranslated_alias === NULL) {
          $untranslated_alias = $url_aliases[$original_language];
        }
        foreach ($link['query'][$filter_key] as &$filters) {
          $filters = preg_replace('/(' . $untranslated_alias . "){$separator}/", $translated_alias . $separator, $filters);
        }
      }
    }
  }

  /**
   * Initializes the data needed for altering the language switcher links.
   *
   * It runs through all the facets on the site and all the languages and
   * creates a cache of the URL aliases for all the languages.
   */
  protected function initializeData() {
    $cache = $this->cacheBackend
      ->get('facets_language_switcher_links');
    if ($cache) {
      $this->data = $cache->data;
      return;
    }
    $data = [];

    /** @var \Drupal\facets\FacetInterface[] $facets */
    $facets = $this->entityTypeManager
      ->getStorage('facets_facet')
      ->loadMultipleOverrideFree();
    $cache_tags = [];
    foreach ($facets as $facet) {
      $cache_tags = Cache::mergeTags($cache_tags, $facet
        ->getCacheTags());

      /** @var \Drupal\facets\UrlProcessor\UrlProcessorInterface $urlProcessor */
      $id = $facet
        ->getFacetSourceConfig()
        ->getUrlProcessorName();
      $url_processor = $this->urlProcessorManager
        ->createInstance($id, [
        'facet' => $facet,
      ]);
      if (!isset($data[$facet
        ->id()])) {
        $data[$facet
          ->id()] = [
          'separator' => $url_processor
            ->getSeparator(),
          'filter_key' => $facet
            ->getFacetSourceConfig()
            ->getFilterKey(),
          'url_aliases' => [
            'original' => $facet
              ->language()
              ->getId(),
            $facet
              ->language()
              ->getId() => $facet
              ->getUrlAlias(),
          ],
        ];
      }
      foreach ($this->languageManager
        ->getLanguages() as $language) {
        if ($language
          ->getId() === $facet
          ->language()
          ->getId()) {

          // Skip the original facet language as it's covered above.
          continue;
        }
        $config_name = 'facets.facet.' . $facet
          ->id();
        $translated_alias = $this->languageManager
          ->getLanguageConfigOverride($language
          ->getId(), $config_name)
          ->get('url_alias');
        $data[$facet
          ->id()]['url_aliases'][$language
          ->getId()] = $translated_alias;
      }
    }
    $this->data = $data;
    $this->cacheBackend
      ->set('facets_language_switcher_links', $data, Cache::PERMANENT, $cache_tags);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
LanguageSwitcherLinksAlterer::$cacheBackend protected property The cache backend.
LanguageSwitcherLinksAlterer::$data protected property The data needed to alter the language switcher links.
LanguageSwitcherLinksAlterer::$entityTypeManager protected property The entity type manager.
LanguageSwitcherLinksAlterer::$languageManager protected property The language manager.
LanguageSwitcherLinksAlterer::$urlProcessorManager protected property The URL processor plugin manager.
LanguageSwitcherLinksAlterer::alter public function Alters the language switcher links.
LanguageSwitcherLinksAlterer::initializeData protected function Initializes the data needed for altering the language switcher links.
LanguageSwitcherLinksAlterer::__construct public function LanguageSwitcherLinksAlterer constructor.