Mercurial > hg > isophonics-drupal-site
comparison core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationSession.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\language\Plugin\LanguageNegotiation; | |
4 | |
5 use Drupal\Core\Language\LanguageInterface; | |
6 use Drupal\Core\PathProcessor\OutboundPathProcessorInterface; | |
7 use Drupal\Core\Render\BubbleableMetadata; | |
8 use Drupal\Core\Url; | |
9 use Drupal\language\LanguageNegotiationMethodBase; | |
10 use Drupal\language\LanguageSwitcherInterface; | |
11 use Symfony\Component\HttpFoundation\Request; | |
12 | |
13 /** | |
14 * Identify language from a request/session parameter. | |
15 * | |
16 * @LanguageNegotiation( | |
17 * id = Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationSession::METHOD_ID, | |
18 * weight = -6, | |
19 * name = @Translation("Session"), | |
20 * description = @Translation("Language from a request/session parameter."), | |
21 * config_route_name = "language.negotiation_session" | |
22 * ) | |
23 */ | |
24 class LanguageNegotiationSession extends LanguageNegotiationMethodBase implements OutboundPathProcessorInterface, LanguageSwitcherInterface { | |
25 | |
26 /** | |
27 * Flag used to determine whether query rewriting is active. | |
28 * | |
29 * @var bool | |
30 */ | |
31 protected $queryRewrite; | |
32 | |
33 /** | |
34 * The query parameter name to rewrite. | |
35 * | |
36 * @var string | |
37 */ | |
38 protected $queryParam; | |
39 | |
40 /** | |
41 * The query parameter value to be set. | |
42 * | |
43 * @var string | |
44 */ | |
45 protected $queryValue; | |
46 | |
47 /** | |
48 * The language negotiation method id. | |
49 */ | |
50 const METHOD_ID = 'language-session'; | |
51 | |
52 /** | |
53 * {@inheritdoc} | |
54 */ | |
55 public function getLangcode(Request $request = NULL) { | |
56 $config = $this->config->get('language.negotiation')->get('session'); | |
57 $param = $config['parameter']; | |
58 $langcode = $request && $request->query->get($param) ? $request->query->get($param) : NULL; | |
59 if (!$langcode && isset($_SESSION[$param])) { | |
60 $langcode = $_SESSION[$param]; | |
61 } | |
62 return $langcode; | |
63 } | |
64 | |
65 /** | |
66 * {@inheritdoc} | |
67 */ | |
68 public function persist(LanguageInterface $language) { | |
69 // We need to update the session parameter with the request value only if we | |
70 // have an authenticated user. | |
71 $langcode = $language->getId(); | |
72 if ($langcode && $this->languageManager) { | |
73 $languages = $this->languageManager->getLanguages(); | |
74 if ($this->currentUser->isAuthenticated() && isset($languages[$langcode])) { | |
75 $config = $this->config->get('language.negotiation')->get('session'); | |
76 $_SESSION[$config['parameter']] = $langcode; | |
77 } | |
78 } | |
79 } | |
80 | |
81 /** | |
82 * {@inheritdoc} | |
83 */ | |
84 public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { | |
85 if ($request) { | |
86 // The following values are not supposed to change during a single page | |
87 // request processing. | |
88 if (!isset($this->queryRewrite)) { | |
89 if ($this->currentUser->isAnonymous()) { | |
90 $languages = $this->languageManager->getLanguages(); | |
91 $config = $this->config->get('language.negotiation')->get('session'); | |
92 $this->queryParam = $config['parameter']; | |
93 $this->queryValue = $request->query->has($this->queryParam) ? $request->query->get($this->queryParam) : NULL; | |
94 $this->queryRewrite = isset($languages[$this->queryValue]); | |
95 } | |
96 else { | |
97 $this->queryRewrite = FALSE; | |
98 } | |
99 } | |
100 | |
101 // If the user is anonymous, the user language negotiation method is | |
102 // enabled, and the corresponding option has been set, we must preserve | |
103 // any explicit user language preference even with cookies disabled. | |
104 if ($this->queryRewrite) { | |
105 if (!isset($options['query'][$this->queryParam])) { | |
106 $options['query'][$this->queryParam] = $this->queryValue; | |
107 } | |
108 if ($bubbleable_metadata) { | |
109 // Cached URLs that have been processed by this outbound path | |
110 // processor must be: | |
111 $bubbleable_metadata | |
112 // - invalidated when the language negotiation config changes, since | |
113 // another query parameter may be used to determine the language. | |
114 ->addCacheTags($this->config->get('language.negotiation')->getCacheTags()) | |
115 // - varied by the configured query parameter. | |
116 ->addCacheContexts(['url.query_args:' . $this->queryParam]); | |
117 } | |
118 } | |
119 } | |
120 return $path; | |
121 } | |
122 | |
123 /** | |
124 * {@inheritdoc} | |
125 */ | |
126 public function getLanguageSwitchLinks(Request $request, $type, Url $url) { | |
127 $links = []; | |
128 $config = $this->config->get('language.negotiation')->get('session'); | |
129 $param = $config['parameter']; | |
130 $language_query = isset($_SESSION[$param]) ? $_SESSION[$param] : $this->languageManager->getCurrentLanguage($type)->getId(); | |
131 $query = []; | |
132 parse_str($request->getQueryString(), $query); | |
133 | |
134 foreach ($this->languageManager->getNativeLanguages() as $language) { | |
135 $langcode = $language->getId(); | |
136 $links[$langcode] = [ | |
137 // We need to clone the $url object to avoid using the same one for all | |
138 // links. When the links are rendered, options are set on the $url | |
139 // object, so if we use the same one, they would be set for all links. | |
140 'url' => clone $url, | |
141 'title' => $language->getName(), | |
142 'attributes' => ['class' => ['language-link']], | |
143 'query' => $query, | |
144 ]; | |
145 if ($language_query != $langcode) { | |
146 $links[$langcode]['query'][$param] = $langcode; | |
147 } | |
148 else { | |
149 $links[$langcode]['attributes']['class'][] = 'session-active'; | |
150 } | |
151 } | |
152 | |
153 return $links; | |
154 } | |
155 | |
156 } |