Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0.00%  | 
      0 / 1  | 
              | 
      0.00%  | 
      0 / 4  | 
      CRAP |         | 
      0.00%  | 
      0 / 71  | 
     
| LanguageNegotiationSession |         | 
      0.00%  | 
      0 / 1  | 
              | 
      0.00%  | 
      0 / 4  | 
      600 |         | 
      0.00%  | 
      0 / 71  | 
     
| getLangcode |         | 
      0.00%  | 
      0 / 1  | 
      30 |         | 
      0.00%  | 
      0 / 8  | 
     |||
| persist |         | 
      0.00%  | 
      0 / 1  | 
      30 |         | 
      0.00%  | 
      0 / 9  | 
     |||
| processOutbound |         | 
      0.00%  | 
      0 / 1  | 
      110 |         | 
      0.00%  | 
      0 / 31  | 
     |||
| getLanguageSwitchLinks |         | 
      0.00%  | 
      0 / 1  | 
      20 |         | 
      0.00%  | 
      0 / 23  | 
     |||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationSession. | |
| */ | |
| namespace Drupal\language\Plugin\LanguageNegotiation; | |
| use Drupal\Core\Language\LanguageInterface; | |
| use Drupal\Core\PathProcessor\OutboundPathProcessorInterface; | |
| use Drupal\Core\Render\BubbleableMetadata; | |
| use Drupal\Core\Url; | |
| use Drupal\language\LanguageNegotiationMethodBase; | |
| use Drupal\language\LanguageSwitcherInterface; | |
| use Symfony\Component\HttpFoundation\Request; | |
| /** | |
| * Identify language from a request/session parameter. | |
| * | |
| * @LanguageNegotiation( | |
| * id = Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationSession::METHOD_ID, | |
| * weight = -6, | |
| * name = @Translation("Session"), | |
| * description = @Translation("Language from a request/session parameter."), | |
| * config_route_name = "language.negotiation_session" | |
| * ) | |
| */ | |
| class LanguageNegotiationSession extends LanguageNegotiationMethodBase implements OutboundPathProcessorInterface, LanguageSwitcherInterface { | |
| /** | |
| * Flag used to determine whether query rewriting is active. | |
| * | |
| * @var bool | |
| */ | |
| protected $queryRewrite; | |
| /** | |
| * The query parameter name to rewrite. | |
| * | |
| * @var string | |
| */ | |
| protected $queryParam; | |
| /** | |
| * The query parameter value to be set. | |
| * | |
| * @var string | |
| */ | |
| protected $queryValue; | |
| /** | |
| * The language negotiation method id. | |
| */ | |
| const METHOD_ID = 'language-session'; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getLangcode(Request $request = NULL) { | |
| $config = $this->config->get('language.negotiation')->get('session'); | |
| $param = $config['parameter']; | |
| $langcode = $request && $request->query->get($param) ? $request->query->get($param) : NULL; | |
| if (!$langcode && isset($_SESSION[$param])) { | |
| $langcode = $_SESSION[$param]; | |
| } | |
| return $langcode; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function persist(LanguageInterface $language) { | |
| // We need to update the session parameter with the request value only if we | |
| // have an authenticated user. | |
| $langcode = $language->getId(); | |
| if ($langcode && $this->languageManager) { | |
| $languages = $this->languageManager->getLanguages(); | |
| if ($this->currentUser->isAuthenticated() && isset($languages[$langcode])) { | |
| $config = $this->config->get('language.negotiation')->get('session'); | |
| $_SESSION[$config['parameter']] = $langcode; | |
| } | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function processOutbound($path, &$options = array(), Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { | |
| if ($request) { | |
| // The following values are not supposed to change during a single page | |
| // request processing. | |
| if (!isset($this->queryRewrite)) { | |
| if ($this->currentUser->isAnonymous()) { | |
| $languages = $this->languageManager->getLanguages(); | |
| $config = $this->config->get('language.negotiation')->get('session'); | |
| $this->queryParam = $config['parameter']; | |
| $this->queryValue = $request->query->has($this->queryParam) ? $request->query->get($this->queryParam) : NULL; | |
| $this->queryRewrite = isset($languages[$this->queryValue]); | |
| } | |
| else { | |
| $this->queryRewrite = FALSE; | |
| } | |
| } | |
| // If the user is anonymous, the user language negotiation method is | |
| // enabled, and the corresponding option has been set, we must preserve | |
| // any explicit user language preference even with cookies disabled. | |
| if ($this->queryRewrite) { | |
| if (isset($options['query']) && is_string($options['query'])) { | |
| $query = array(); | |
| parse_str($options['query'], $query); | |
| $options['query'] = $query; | |
| } | |
| if (!isset($options['query'][$this->queryParam])) { | |
| $options['query'][$this->queryParam] = $this->queryValue; | |
| } | |
| if ($bubbleable_metadata) { | |
| // Cached URLs that have been processed by this outbound path | |
| // processor must be: | |
| $bubbleable_metadata | |
| // - invalidated when the language negotiation config changes, since | |
| // another query parameter may be used to determine the language. | |
| ->addCacheTags($this->config->get('language.negotiation')->getCacheTags()) | |
| // - varied by the configured query parameter. | |
| ->addCacheContexts(['url.query_args:' . $this->queryParam]); | |
| } | |
| } | |
| } | |
| return $path; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getLanguageSwitchLinks(Request $request, $type, Url $url) { | |
| $links = array(); | |
| $config = $this->config->get('language.negotiation')->get('session'); | |
| $param = $config['parameter']; | |
| $language_query = isset($_SESSION[$param]) ? $_SESSION[$param] : $this->languageManager->getCurrentLanguage($type)->getId(); | |
| $query = array(); | |
| parse_str($request->getQueryString(), $query); | |
| foreach ($this->languageManager->getNativeLanguages() as $language) { | |
| $langcode = $language->getId(); | |
| $links[$langcode] = array( | |
| // We need to clone the $url object to avoid using the same one for all | |
| // links. When the links are rendered, options are set on the $url | |
| // object, so if we use the same one, they would be set for all links. | |
| 'url' => clone $url, | |
| 'title' => $language->getName(), | |
| 'attributes' => array('class' => array('language-link')), | |
| 'query' => $query, | |
| ); | |
| if ($language_query != $langcode) { | |
| $links[$langcode]['query'][$param] = $langcode; | |
| } | |
| else { | |
| $links[$langcode]['attributes']['class'][] = 'session-active'; | |
| } | |
| } | |
| return $links; | |
| } | |
| } |