1
|
|
|
<?php |
2
|
|
|
namespace ApacheSolrForTypo3\Solr; |
3
|
|
|
|
4
|
|
|
/*************************************************************** |
5
|
|
|
* Copyright notice |
6
|
|
|
* |
7
|
|
|
* (c) 2010-2015 Ingo Renner <[email protected]> |
8
|
|
|
* All rights reserved |
9
|
|
|
* |
10
|
|
|
* This script is part of the TYPO3 project. The TYPO3 project is |
11
|
|
|
* free software; you can redistribute it and/or modify |
12
|
|
|
* it under the terms of the GNU General Public License as published by |
13
|
|
|
* the Free Software Foundation; either version 3 of the License, or |
14
|
|
|
* (at your option) any later version. |
15
|
|
|
* |
16
|
|
|
* The GNU General Public License can be found at |
17
|
|
|
* http://www.gnu.org/copyleft/gpl.html. |
18
|
|
|
* |
19
|
|
|
* This script is distributed in the hope that it will be useful, |
20
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
21
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
22
|
|
|
* GNU General Public License for more details. |
23
|
|
|
* |
24
|
|
|
* This copyright notice MUST APPEAR in all copies of the script! |
25
|
|
|
***************************************************************/ |
26
|
|
|
|
27
|
|
|
use ApacheSolrForTypo3\Solr\Domain\Site\Site; |
28
|
|
|
use ApacheSolrForTypo3\Solr\Domain\Site\SiteRepository; |
29
|
|
|
use ApacheSolrForTypo3\Solr\System\Records\Pages\PagesRepository as PagesRepositoryAtExtSolr; |
30
|
|
|
use ApacheSolrForTypo3\Solr\System\Records\SystemLanguage\SystemLanguageRepository; |
31
|
|
|
use ApacheSolrForTypo3\Solr\System\Solr\Node; |
32
|
|
|
use ApacheSolrForTypo3\Solr\System\Solr\SolrConnection; |
33
|
|
|
use InvalidArgumentException; |
34
|
|
|
use RuntimeException; |
35
|
|
|
use stdClass; |
36
|
|
|
use TYPO3\CMS\Core\Registry; |
37
|
|
|
use TYPO3\CMS\Core\SingletonInterface; |
38
|
|
|
use TYPO3\CMS\Core\TypoScript\ExtendedTemplateService; |
39
|
|
|
use TYPO3\CMS\Core\Utility\GeneralUtility; |
40
|
|
|
use TYPO3\CMS\Core\Utility\RootlineUtility; |
41
|
|
|
use TYPO3\CMS\Frontend\Page\PageRepository; |
42
|
|
|
use function json_encode; |
43
|
|
|
|
44
|
|
|
/** |
45
|
|
|
* ConnectionManager is responsible to create SolrConnection objects. |
46
|
|
|
* |
47
|
|
|
* @author Ingo Renner <[email protected]> |
48
|
|
|
*/ |
49
|
|
|
class ConnectionManager implements SingletonInterface |
50
|
|
|
{ |
51
|
|
|
|
52
|
|
|
/** |
53
|
|
|
* @var array |
54
|
|
|
*/ |
55
|
|
|
protected static $connections = []; |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* @var SystemLanguageRepository |
59
|
|
|
*/ |
60
|
|
|
protected $systemLanguageRepository; |
61
|
|
|
|
62
|
|
|
/** |
63
|
|
|
* @var PagesRepositoryAtExtSolr |
64
|
|
|
*/ |
65
|
|
|
protected $pagesRepositoryAtExtSolr; |
66
|
|
|
|
67
|
|
|
/** |
68
|
|
|
* @var SiteRepository |
69
|
|
|
*/ |
70
|
|
|
protected $siteRepository; |
71
|
|
|
|
72
|
|
|
/** |
73
|
|
|
* @param SystemLanguageRepository $systemLanguageRepository |
74
|
|
|
* @param PagesRepositoryAtExtSolr|null $pagesRepositoryAtExtSolr |
75
|
|
|
* @param SiteRepository $siteRepository |
76
|
|
|
*/ |
77
|
113 |
|
public function __construct(SystemLanguageRepository $systemLanguageRepository = null, PagesRepositoryAtExtSolr $pagesRepositoryAtExtSolr = null, SiteRepository $siteRepository = null) |
78
|
|
|
{ |
79
|
113 |
|
$this->systemLanguageRepository = $systemLanguageRepository ?? GeneralUtility::makeInstance(SystemLanguageRepository::class); |
80
|
113 |
|
$this->siteRepository = $siteRepository ?? GeneralUtility::makeInstance(SiteRepository::class); |
81
|
113 |
|
$this->pagesRepositoryAtExtSolr = $pagesRepositoryAtExtSolr ?? GeneralUtility::makeInstance(PagesRepositoryAtExtSolr::class); |
82
|
113 |
|
} |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* Creates a solr connection for read and write endpoints |
86
|
|
|
* |
87
|
|
|
* @param array $readNodeConfiguration |
88
|
|
|
* @param array $writeNodeConfiguration |
89
|
|
|
* @return SolrConnection|object |
90
|
|
|
*/ |
91
|
100 |
|
public function getSolrConnectionForNodes(array $readNodeConfiguration, array $writeNodeConfiguration) |
92
|
|
|
{ |
93
|
100 |
|
$connectionHash = md5(json_encode($readNodeConfiguration) . json_encode($writeNodeConfiguration)); |
94
|
100 |
|
if (!isset(self::$connections[$connectionHash])) { |
95
|
100 |
|
$readNode = Node::fromArray($readNodeConfiguration); |
96
|
100 |
|
$writeNode = Node::fromArray($writeNodeConfiguration); |
97
|
100 |
|
self::$connections[$connectionHash] = GeneralUtility::makeInstance(SolrConnection::class, $readNode, $writeNode); |
98
|
|
|
} |
99
|
100 |
|
return self::$connections[$connectionHash]; |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
/** |
103
|
|
|
* Creates a solr configuration from the configuration array and returns it. |
104
|
|
|
* |
105
|
|
|
* @param array $config The solr configuration array |
106
|
|
|
* @return SolrConnection |
107
|
|
|
*/ |
108
|
100 |
|
public function getConnectionFromConfiguration(array $config) |
109
|
|
|
{ |
110
|
100 |
|
if(empty($config['read']) && !empty($config['solrHost'])) { |
111
|
|
|
throw new InvalidArgumentException('Invalid registry data please re-initialize your solr connections'); |
112
|
|
|
} |
113
|
|
|
|
114
|
100 |
|
return $this->getSolrConnectionForNodes($config['read'], $config['write']); |
115
|
|
|
} |
116
|
|
|
|
117
|
|
|
/** |
118
|
|
|
* Gets a Solr configuration for a page ID. |
119
|
|
|
* |
120
|
|
|
* @param int $pageId A page ID. |
121
|
|
|
* @param int $language The language ID to get the connection for as the path may differ. Optional, defaults to 0. |
122
|
|
|
* @param string $mount Comma list of MountPoint parameters |
123
|
|
|
* @deprecated will be removed in v11, use Site object/SiteRepository directly |
124
|
|
|
* @return array A solr configuration. |
125
|
|
|
* @throws NoSolrConnectionFoundException |
126
|
|
|
*/ |
127
|
|
|
public function getConfigurationByPageId(int $pageId, int $language = 0, string $mount = '') |
128
|
|
|
{ |
129
|
|
|
trigger_error('solr:deprecation: Method getConfigurationByPageId is deprecated since EXT:solr 10 and will be removed in v11, use Site object/SiteRepository directly.', E_USER_DEPRECATED); |
130
|
|
|
|
131
|
|
|
try { |
132
|
|
|
$site = $this->siteRepository->getSiteByPageId($pageId, $mount); |
133
|
|
|
$this->throwExceptionOnInvalidSite($site, 'No site for pageId ' . $pageId); |
134
|
|
|
return $site->getSolrConnectionConfiguration($language); |
135
|
|
|
} catch(InvalidArgumentException $e) { |
136
|
|
|
/* @var NoSolrConnectionFoundException $noSolrConnectionException */ |
137
|
|
|
$noSolrConnectionException = $this->buildNoConnectionExceptionForPageAndLanguage($pageId, $language); |
138
|
|
|
throw $noSolrConnectionException; |
139
|
|
|
} |
140
|
|
|
} |
141
|
|
|
|
142
|
|
|
/** |
143
|
|
|
* Gets a Solr connection for a page ID. |
144
|
|
|
* |
145
|
|
|
* @param int $pageId A page ID. |
146
|
|
|
* @param int $language The language ID to get the connection for as the path may differ. Optional, defaults to 0. |
147
|
|
|
* @param string $mount Comma list of MountPoint parameters |
148
|
|
|
* @return SolrConnection A solr connection. |
149
|
|
|
* @throws NoSolrConnectionFoundException |
150
|
|
|
*/ |
151
|
|
|
public function getConnectionByPageId($pageId, $language = 0, $mount = '') |
152
|
|
|
{ |
153
|
|
|
try { |
154
|
|
|
$site = $this->siteRepository->getSiteByPageId($pageId, $mount); |
155
|
93 |
|
$this->throwExceptionOnInvalidSite($site, 'No site for pageId ' . $pageId); |
156
|
|
|
$config = $site->getSolrConnectionConfiguration($language); |
157
|
|
|
$solrConnection = $this->getConnectionFromConfiguration($config); |
158
|
93 |
|
return $solrConnection; |
159
|
92 |
|
} catch(InvalidArgumentException $e) { |
160
|
92 |
|
$noSolrConnectionException = $this->buildNoConnectionExceptionForPageAndLanguage($pageId, $language); |
161
|
|
|
throw $noSolrConnectionException; |
162
|
92 |
|
} |
163
|
2 |
|
} |
164
|
|
|
|
165
|
1 |
|
/** |
166
|
1 |
|
* Gets a Solr configuration for a root page ID. |
167
|
1 |
|
* |
168
|
1 |
|
* @param int $pageId A root page ID. |
169
|
|
|
* @param int $language The language ID to get the configuration for as the path may differ. Optional, defaults to 0. |
170
|
1 |
|
* @return array A solr configuration. |
171
|
1 |
|
* @throws NoSolrConnectionFoundException |
172
|
|
|
* @deprecated will be removed in v11, use Site object/SiteRepository directly |
173
|
|
|
*/ |
174
|
|
|
public function getConfigurationByRootPageId($pageId, $language = 0) |
175
|
|
|
{ |
176
|
|
|
trigger_error('solr:deprecation: Method getConfigurationByRootPageId is deprecated since EXT:solr 10 and will be removed in v11, use Site object/SiteRepository directly.', E_USER_DEPRECATED); |
177
|
|
|
|
178
|
|
|
try { |
179
|
|
|
$site = $this->siteRepository->getSiteByRootPageId($pageId); |
180
|
|
|
$this->throwExceptionOnInvalidSite($site, 'No site for pageId ' . $pageId); |
181
|
|
|
|
182
|
|
|
return $site->getSolrConnectionConfiguration($language); |
183
|
|
|
} catch(InvalidArgumentException $e) { |
184
|
|
|
/* @var NoSolrConnectionFoundException $noSolrConnectionException */ |
185
|
|
|
$noSolrConnectionException = $this->buildNoConnectionExceptionForPageAndLanguage($pageId, $language); |
186
|
|
|
throw $noSolrConnectionException; |
187
|
|
|
} |
188
|
|
|
} |
189
|
|
|
|
190
|
|
|
/** |
191
|
|
|
* Gets a Solr connection for a root page ID. |
192
|
|
|
* |
193
|
|
|
* @param int $pageId A root page ID. |
194
|
|
|
* @param int $language The language ID to get the connection for as the path may differ. Optional, defaults to 0. |
195
|
|
|
* @return SolrConnection A solr connection. |
196
|
|
|
* @throws NoSolrConnectionFoundException |
197
|
|
|
*/ |
198
|
|
|
public function getConnectionByRootPageId($pageId, $language = 0) |
199
|
|
|
{ |
200
|
|
|
try { |
201
|
|
|
$site = $this->siteRepository->getSiteByRootPageId($pageId); |
202
|
|
|
$this->throwExceptionOnInvalidSite($site, 'No site for pageId ' . $pageId); |
203
|
|
|
$config = $site->getSolrConnectionConfiguration($language); |
204
|
|
|
$solrConnection = $this->getConnectionFromConfiguration($config); |
205
|
|
|
return $solrConnection; |
206
|
|
|
} catch (InvalidArgumentException $e) { |
207
|
|
|
/* @var NoSolrConnectionFoundException $noSolrConnectionException */ |
208
|
|
|
$noSolrConnectionException = $this->buildNoConnectionExceptionForPageAndLanguage($pageId, $language); |
209
|
|
|
throw $noSolrConnectionException; |
210
|
|
|
} |
211
|
12 |
|
} |
212
|
|
|
|
213
|
|
|
/** |
214
|
12 |
|
* Gets all connection configurations found. |
215
|
11 |
|
* |
216
|
11 |
|
* @return array An array of connection configurations. |
217
|
11 |
|
* @throws NoSolrConnectionFoundException |
218
|
1 |
|
* @deprecated will be removed in v11, use SiteRepository |
219
|
|
|
*/ |
220
|
1 |
|
public function getAllConfigurations() |
221
|
1 |
|
{ |
222
|
1 |
|
trigger_error('solr:deprecation: Method getAllConfigurations is deprecated since EXT:solr 10 and will be removed in v11, use Site object/SiteRepository directly.', E_USER_DEPRECATED); |
223
|
1 |
|
|
224
|
|
|
$solrConfigurations = []; |
225
|
1 |
|
foreach ($this->siteRepository->getAvailableSites() as $site) { |
226
|
1 |
|
foreach ($site->getAllSolrConnectionConfigurations() as $solrConfiguration) { |
227
|
|
|
$solrConfigurations[] = $solrConfiguration; |
228
|
|
|
} |
229
|
|
|
} |
230
|
|
|
|
231
|
|
|
return $solrConfigurations; |
232
|
|
|
} |
233
|
|
|
|
234
|
|
|
/** |
235
|
|
|
* Stores the connections in the registry. |
236
|
|
|
* |
237
|
|
|
* @param array $solrConfigurations |
238
|
|
|
* @deprecated will be removed in v11, use SiteRepository |
239
|
|
|
*/ |
240
|
|
|
protected function setAllConfigurations(array $solrConfigurations) |
241
|
|
|
{ |
242
|
|
|
trigger_error('solr:deprecation: Method setAllConfigurations is deprecated since EXT:solr 10 and will be removed in v11, use Site object/SiteRepository directly.', E_USER_DEPRECATED); |
243
|
|
|
|
244
|
|
|
/** @var $registry Registry */ |
245
|
|
|
$registry = GeneralUtility::makeInstance(Registry::class); |
246
|
|
|
$registry->set('tx_solr', 'servers', $solrConfigurations); |
247
|
|
|
} |
248
|
|
|
|
249
|
|
|
/** |
250
|
|
|
* Gets all connections found. |
251
|
|
|
* |
252
|
|
|
* @return SolrConnection[] An array of initialized ApacheSolrForTypo3\Solr\System\Solr\SolrConnection connections |
253
|
|
|
* @throws NoSolrConnectionFoundException |
254
|
|
|
*/ |
255
|
|
|
public function getAllConnections() |
256
|
|
|
{ |
257
|
|
|
$solrConnections = []; |
258
|
|
|
foreach ($this->siteRepository->getAvailableSites() as $site) { |
259
|
|
|
foreach ($site->getAllSolrConnectionConfigurations() as $solrConfiguration) { |
260
|
|
|
$solrConnections[] = $this->getConnectionFromConfiguration($solrConfiguration); |
261
|
|
|
} |
262
|
|
|
} |
263
|
|
|
|
264
|
|
|
return $solrConnections; |
265
|
|
|
} |
266
|
|
|
|
267
|
|
|
/** |
268
|
|
|
* Gets all connection configurations for a given site. |
269
|
|
|
* |
270
|
|
|
* @param Site $site A TYPO3 site |
271
|
|
|
* @return array An array of Solr connection configurations for a site |
272
|
4 |
|
* @throws NoSolrConnectionFoundException |
273
|
|
|
* @deprecated will be removed in v11, use $site->getAllSolrConnectionConfigurations() |
274
|
4 |
|
*/ |
275
|
4 |
|
public function getConfigurationsBySite(Site $site) |
276
|
|
|
{ |
277
|
|
|
trigger_error('solr:deprecation: Method getConfigurationsBySite is deprecated since EXT:solr 10 and will be removed in v11, use $site->getAllSolrConnectionConfigurations()', E_USER_DEPRECATED); |
278
|
|
|
|
279
|
|
|
return $site->getAllSolrConnectionConfigurations(); |
280
|
|
|
} |
281
|
4 |
|
|
282
|
|
|
/** |
283
|
|
|
* Gets all connections configured for a given site. |
284
|
|
|
* |
285
|
|
|
* @param Site $site A TYPO3 site |
286
|
|
|
* @return SolrConnection[] An array of Solr connection objects (ApacheSolrForTypo3\Solr\System\Solr\SolrConnection) |
287
|
|
|
* @throws NoSolrConnectionFoundException |
288
|
|
|
*/ |
289
|
|
|
public function getConnectionsBySite(Site $site) |
290
|
|
|
{ |
291
|
|
|
$connections = []; |
292
|
|
|
|
293
|
|
|
foreach ($site->getAllSolrConnectionConfigurations() as $solrConnectionConfiguration) { |
294
|
|
|
$connections[] = $this->getConnectionFromConfiguration($solrConnectionConfiguration); |
295
|
|
|
} |
296
|
|
|
|
297
|
|
|
return $connections; |
298
|
|
|
} |
299
|
|
|
|
300
|
|
|
// updates |
301
|
|
|
|
302
|
|
|
/** |
303
|
|
|
* Updates the connections in the registry. |
304
|
|
|
* |
305
|
|
|
* @deprecated will be removed in v11, use SiteRepository |
306
|
13 |
|
*/ |
307
|
|
|
public function updateConnections() |
308
|
13 |
|
{ |
309
|
|
|
trigger_error('solr:deprecation: Method updateConnections is deprecated since EXT:solr 10 and will be removed in v11, use sitehandling instead', E_USER_DEPRECATED); |
310
|
13 |
|
|
311
|
13 |
|
$solrConnections = $this->getConfiguredSolrConnections(); |
|
|
|
|
312
|
|
|
$solrConnections = $this->filterDuplicateConnections($solrConnections); |
|
|
|
|
313
|
|
|
|
314
|
13 |
|
if (!empty($solrConnections)) { |
315
|
|
|
$this->setAllConfigurations($solrConnections); |
|
|
|
|
316
|
|
|
} |
317
|
|
|
} |
318
|
|
|
|
319
|
|
|
/** |
320
|
|
|
* Updates the Solr connections for a specific root page ID / site. |
321
|
|
|
* |
322
|
|
|
* @param int $rootPageId A site root page id |
323
|
|
|
* @throws NoSolrConnectionFoundException |
324
|
|
|
* @deprecated Use TYPO3 site config to configure site/connection info |
325
|
|
|
*/ |
326
|
|
|
public function updateConnectionByRootPageId($rootPageId) |
327
|
|
|
{ |
328
|
|
|
trigger_error('solr:deprecation: Method updateConnectionByRootPageId is deprecated since EXT:solr 10 and will be removed in v11, use sitehandling instead', E_USER_DEPRECATED); |
329
|
|
|
|
330
|
|
|
$systemLanguages = $this->systemLanguageRepository->findSystemLanguages(); |
331
|
|
|
/* @var SiteRepository $siteRepository */ |
332
|
|
|
$siteRepository = GeneralUtility::makeInstance(SiteRepository::class); |
333
|
|
|
$site = $siteRepository->getSiteByRootPageId($rootPageId); |
334
|
|
|
$rootPage = $site->getRootPage(); |
335
|
|
|
|
336
|
|
|
$updatedSolrConnections = []; |
337
|
|
|
foreach ($systemLanguages as $languageId) { |
338
|
|
|
$connection = $this->getConfiguredSolrConnectionByRootPage($rootPage, $languageId); |
|
|
|
|
339
|
|
|
|
340
|
|
|
if (!empty($connection)) { |
341
|
|
|
$updatedSolrConnections[$connection['connectionKey']] = $connection; |
342
|
|
|
} |
343
|
|
|
} |
344
|
|
|
|
345
|
|
|
$solrConnections = $this->getAllConfigurations(); |
|
|
|
|
346
|
|
|
$solrConnections = array_merge($solrConnections, $updatedSolrConnections); |
347
|
|
|
$solrConnections = $this->filterDuplicateConnections($solrConnections); |
|
|
|
|
348
|
|
|
$this->setAllConfigurations($solrConnections); |
|
|
|
|
349
|
|
|
} |
350
|
|
|
|
351
|
|
|
/** |
352
|
|
|
* Finds the configured Solr connections. Also respects multi-site |
353
|
|
|
* environments. |
354
|
|
|
* |
355
|
|
|
* @return array An array with connections, each connection with keys rootPageTitle, rootPageUid, solrHost, solrPort, solrPath |
356
|
|
|
* @deprecated will be removed in v11, use SiteRepository |
357
|
|
|
*/ |
358
|
|
|
protected function getConfiguredSolrConnections() |
359
|
|
|
{ |
360
|
|
|
trigger_error('solr:deprecation: Method getConfiguredSolrConnections is deprecated since EXT:solr 10 and will be removed in v11, use sitehandling instead', E_USER_DEPRECATED); |
361
|
|
|
|
362
|
|
|
$configuredSolrConnections = []; |
363
|
|
|
// find website roots and languages for this installation |
364
|
|
|
$rootPages = $this->pagesRepositoryAtExtSolr->findAllRootPages(); |
365
|
|
|
$languages = $this->systemLanguageRepository->findSystemLanguages(); |
366
|
|
|
|
367
|
|
|
// find solr configurations and add them as function menu entries |
368
|
|
|
foreach ($rootPages as $rootPage) { |
369
|
|
|
foreach ($languages as $languageId) { |
370
|
|
|
$connection = $this->getConfiguredSolrConnectionByRootPage($rootPage, $languageId); |
|
|
|
|
371
|
|
|
|
372
|
|
|
if (!empty($connection)) { |
373
|
|
|
$configuredSolrConnections[$connection['connectionKey']] = $connection; |
374
|
|
|
} |
375
|
|
|
} |
376
|
|
|
} |
377
|
|
|
|
378
|
|
|
return $configuredSolrConnections; |
379
|
|
|
} |
380
|
|
|
|
381
|
|
|
/** |
382
|
|
|
* Gets the configured Solr connection for a specific root page and language ID. |
383
|
|
|
* |
384
|
|
|
* @param array $rootPage A root page record with at least title and uid |
385
|
|
|
* @param int $languageId ID of a system language |
386
|
|
|
* @return array A solr connection configuration. |
387
|
|
|
* @deprecated will be removed in v11, use SiteRepository |
388
|
|
|
*/ |
389
|
|
|
protected function getConfiguredSolrConnectionByRootPage(array $rootPage, $languageId) |
390
|
|
|
{ |
391
|
|
|
trigger_error('solr:deprecation: Method getConfiguredSolrConnectionByRootPage is deprecated since EXT:solr 10 and will be removed in v11, use sitehandling instead', E_USER_DEPRECATED); |
392
|
|
|
|
393
|
|
|
$connection = []; |
394
|
|
|
|
395
|
|
|
$languageId = (int)$languageId; |
396
|
|
|
GeneralUtility::_GETset($languageId, 'L'); |
|
|
|
|
397
|
|
|
$connectionKey = $rootPage['uid'] . '|' . $languageId; |
398
|
|
|
|
399
|
|
|
$pageSelect = GeneralUtility::makeInstance(PageRepository::class); |
400
|
|
|
|
401
|
|
|
$rootlineUtility = GeneralUtility::makeInstance(RootlineUtility::class, $rootPage['uid']); |
402
|
|
|
try { |
403
|
|
|
$rootLine = $rootlineUtility->get(); |
404
|
|
|
} catch (RuntimeException $e) { |
405
|
|
|
$rootLine = []; |
406
|
|
|
} |
407
|
|
|
|
408
|
|
|
$tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class); |
409
|
|
|
$tmpl->tt_track = false; // Do not log time-performance information |
410
|
|
|
$tmpl->init(); |
411
|
|
|
$tmpl->runThroughTemplates($rootLine); // This generates the constants/config + hierarchy info for the template. |
412
|
|
|
|
413
|
|
|
// fake micro TSFE to get correct condition parsing |
414
|
|
|
$GLOBALS['TSFE'] = new stdClass(); |
415
|
|
|
$GLOBALS['TSFE']->tmpl = new stdClass(); |
416
|
|
|
$GLOBALS['TSFE']->cObjectDepthCounter = 50; |
417
|
|
|
$GLOBALS['TSFE']->tmpl->rootLine = $rootLine; |
418
|
|
|
// @extensionScannerIgnoreLine |
419
|
|
|
$GLOBALS['TSFE']->sys_page = $pageSelect; |
420
|
|
|
$GLOBALS['TSFE']->id = $rootPage['uid']; |
421
|
|
|
$GLOBALS['TSFE']->page = $rootPage; |
422
|
|
|
|
423
|
|
|
$tmpl->generateConfig(); |
424
|
|
|
$GLOBALS['TSFE']->tmpl->setup = $tmpl->setup; |
425
|
|
|
|
426
|
|
|
$configuration = Util::getSolrConfigurationFromPageId($rootPage['uid'], false, $languageId); |
427
|
|
|
|
428
|
|
|
$solrIsEnabledAndConfigured = $configuration->getEnabled() && $configuration->getSolrHasConnectionConfiguration(); |
429
|
|
|
if (!$solrIsEnabledAndConfigured) { |
430
|
|
|
return $connection; |
431
|
|
|
} |
432
|
|
|
|
433
|
|
|
$connection = [ |
434
|
|
|
'connectionKey' => $connectionKey, |
435
|
|
|
'rootPageTitle' => $rootPage['title'], |
436
|
|
|
'rootPageUid' => $rootPage['uid'], |
437
|
|
|
'read' => [ |
438
|
|
|
'scheme' => $configuration->getSolrScheme(), |
439
|
|
|
'host' => $configuration->getSolrHost(), |
440
|
|
|
'port' => $configuration->getSolrPort(), |
441
|
|
|
'path' => $configuration->getSolrPath(), |
442
|
|
|
'username' => $configuration->getSolrUsername(), |
443
|
|
|
'password' => $configuration->getSolrPassword(), |
444
|
|
|
'timeout' => $configuration->getSolrTimeout() |
445
|
|
|
], |
446
|
|
|
'write' => [ |
447
|
|
|
'scheme' => $configuration->getSolrScheme('http', 'write'), |
448
|
|
|
'host' => $configuration->getSolrHost('localhost', 'write'), |
449
|
|
|
'port' => $configuration->getSolrPort(8983, 'write'), |
450
|
|
|
'path' => $configuration->getSolrPath('/solr/core_en/', 'write'), |
451
|
|
|
'username' => $configuration->getSolrUsername('', 'write'), |
452
|
|
|
'password' => $configuration->getSolrPassword('', 'write'), |
453
|
|
|
'timeout' => $configuration->getSolrTimeout(0, 'write') |
454
|
|
|
], |
455
|
|
|
|
456
|
|
|
'language' => $languageId |
457
|
|
|
]; |
458
|
|
|
|
459
|
|
|
$connection['label'] = $this->buildConnectionLabel($connection); |
460
|
|
|
return $connection; |
461
|
|
|
} |
462
|
|
|
|
463
|
|
|
/** |
464
|
|
|
* Creates a human readable label from the connections' configuration. |
465
|
|
|
* |
466
|
|
|
* @param array $connection Connection configuration |
467
|
|
|
* @return string Connection label |
468
|
|
|
*/ |
469
|
|
|
protected function buildConnectionLabel(array $connection) |
470
|
|
|
{ |
471
|
|
|
return $connection['rootPageTitle'] |
472
|
|
|
. ' (pid: ' . $connection['rootPageUid'] |
473
|
|
|
. ', language: ' . $this->systemLanguageRepository->findOneLanguageTitleByLanguageId($connection['language']) |
474
|
|
|
. ') - Read node: ' |
475
|
|
|
. $connection['read']['host'] . ':' |
476
|
|
|
. $connection['read']['port'] |
477
|
|
|
. $connection['read']['path'] |
478
|
|
|
.' - Write node: ' |
479
|
|
|
. $connection['write']['host'] . ':' |
480
|
|
|
. $connection['write']['port'] |
481
|
|
|
. $connection['write']['path']; |
482
|
|
|
} |
483
|
|
|
|
484
|
|
|
/** |
485
|
|
|
* Filters duplicate connections. When detecting the configured connections |
486
|
|
|
* this is done with a little brute force by simply combining all root pages |
487
|
|
|
* with all languages, this method filters out the duplicates. |
488
|
|
|
* |
489
|
|
|
* @param array $connections An array of unfiltered connections, containing duplicates |
490
|
|
|
* @return array An array with connections, no duplicates. |
491
|
|
|
* @deprecated will be removed in v11, use SiteRepository |
492
|
|
|
*/ |
493
|
|
|
protected function filterDuplicateConnections(array $connections) |
494
|
|
|
{ |
495
|
|
|
trigger_error('solr:deprecation: Method filterDuplicateConnections is deprecated since EXT:solr 10 and will be removed in v11, use sitehandling instead', E_USER_DEPRECATED); |
496
|
|
|
|
497
|
|
|
$hashedConnections = []; |
498
|
|
|
$filteredConnections = []; |
499
|
|
|
|
500
|
|
|
// array_unique() doesn't work on multi dimensional arrays, so we need to flatten it first |
501
|
|
|
foreach ($connections as $key => $connection) { |
502
|
|
|
unset($connection['language']); |
503
|
|
|
$connectionHash = md5(implode('|', $connection)); |
504
|
|
|
$hashedConnections[$key] = $connectionHash; |
505
|
|
|
} |
506
|
|
|
|
507
|
|
|
$hashedConnections = array_unique($hashedConnections); |
508
|
|
|
|
509
|
|
|
foreach ($hashedConnections as $key => $hash) { |
510
|
|
|
$filteredConnections[$key] = $connections[$key]; |
511
|
|
|
} |
512
|
|
|
|
513
|
|
|
return $filteredConnections; |
514
|
|
|
} |
515
|
|
|
|
516
|
|
|
/** |
517
|
|
|
* @param $pageId |
518
|
|
|
* @param $language |
519
|
|
|
* @return NoSolrConnectionFoundException |
520
|
|
|
*/ |
521
|
|
|
protected function buildNoConnectionExceptionForPageAndLanguage($pageId, $language): NoSolrConnectionFoundException |
522
|
|
|
{ |
523
|
|
|
$message = 'Could not find a Solr connection for page [' . $pageId . '] and language [' . $language . '].'; |
524
|
|
|
$noSolrConnectionException = $this->buildNoConnectionException($message); |
525
|
|
|
|
526
|
|
|
$noSolrConnectionException->setLanguageId($language); |
527
|
|
|
return $noSolrConnectionException; |
528
|
|
|
} |
529
|
|
|
|
530
|
|
|
/** |
531
|
|
|
* Throws a no connection exception when no site was passed. |
532
|
|
|
* |
533
|
|
|
* @param Site|null $site |
534
|
|
|
* @param $message |
535
|
|
|
* @throws NoSolrConnectionFoundException |
536
|
|
|
*/ |
537
|
|
|
protected function throwExceptionOnInvalidSite(?Site $site, string $message) |
538
|
|
|
{ |
539
|
|
|
if (!is_null($site)) { |
540
|
|
|
return; |
541
|
|
|
} |
542
|
|
|
|
543
|
|
|
throw $this->buildNoConnectionException($message); |
544
|
|
|
} |
545
|
|
|
|
546
|
|
|
/** |
547
|
|
|
* Build a NoSolrConnectionFoundException with the passed message. |
548
|
|
|
* @param string $message |
549
|
|
|
* @return NoSolrConnectionFoundException |
550
|
|
|
*/ |
551
|
|
|
protected function buildNoConnectionException(string $message): NoSolrConnectionFoundException |
552
|
|
|
{ |
553
|
|
|
/* @var NoSolrConnectionFoundException $noSolrConnectionException */ |
554
|
|
|
$noSolrConnectionException = GeneralUtility::makeInstance( |
555
|
|
|
NoSolrConnectionFoundException::class, |
556
|
|
|
/** @scrutinizer ignore-type */ |
557
|
|
|
$message, |
558
|
|
|
/** @scrutinizer ignore-type */ |
559
|
|
|
1575396474 |
560
|
|
|
); |
561
|
|
|
return $noSolrConnectionException; |
562
|
|
|
} |
563
|
|
|
} |
564
|
|
|
|
This function has been deprecated. The supplier of the function has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.