first commit
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
namespace WapplerSystems\Meilisearch\ViewHelpers\Widget\Controller;
|
||||
|
||||
/*
|
||||
* This file is part of the TYPO3 CMS project.
|
||||
*
|
||||
* It is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* For the full copyright and license information, please read the
|
||||
* LICENSE.txt file that was distributed with this source code.
|
||||
*
|
||||
* The TYPO3 project - inspiring people to share!
|
||||
*/
|
||||
|
||||
use WapplerSystems\Meilisearch\Domain\Search\FrequentSearches\FrequentSearchesService;
|
||||
use WapplerSystems\Meilisearch\Widget\AbstractWidgetController;
|
||||
use Psr\Log\LoggerAwareInterface;
|
||||
use Psr\Log\LoggerAwareTrait;
|
||||
use TYPO3\CMS\Core\Cache\CacheManager;
|
||||
use TYPO3\CMS\Core\Cache\Exception\NoSuchCacheException;
|
||||
use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
/**
|
||||
* Class FrequentlySearchedController
|
||||
*
|
||||
* @author Frans Saris <frans@beech.it>
|
||||
* @author Timo Hund <timo.hund@dkd.de>
|
||||
*/
|
||||
class FrequentlySearchedController extends AbstractWidgetController implements LoggerAwareInterface
|
||||
{
|
||||
use LoggerAwareTrait;
|
||||
|
||||
/**
|
||||
* Initializes the cache for this command.
|
||||
*
|
||||
* @return FrontendInterface|null
|
||||
*/
|
||||
protected function getInitializedCache(): ?FrontendInterface
|
||||
{
|
||||
$cacheIdentifier = 'tx_meilisearch';
|
||||
/* @var FrontendInterface $cacheInstance */
|
||||
try {
|
||||
$cacheInstance = GeneralUtility::makeInstance(CacheManager::class)->getCache($cacheIdentifier);
|
||||
} catch (NoSuchCacheException $exception) {
|
||||
$this->logger->error('Getting cache failed: ' . $exception->getMessage());
|
||||
return null;
|
||||
}
|
||||
|
||||
return $cacheInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Last searches
|
||||
*/
|
||||
public function indexAction()
|
||||
{
|
||||
$tsfe = $GLOBALS['TSFE'];
|
||||
$cache = $this->getInitializedCache();
|
||||
$configuration = $this->controllerContext->getTypoScriptConfiguration();
|
||||
|
||||
/* @var FrequentSearchesService $frequentSearchesService */
|
||||
$frequentSearchesService = GeneralUtility::makeInstance(
|
||||
FrequentSearchesService::class,
|
||||
/** @scrutinizer ignore-type */ $configuration,
|
||||
/** @scrutinizer ignore-type */ $cache,
|
||||
/** @scrutinizer ignore-type */ $tsfe
|
||||
);
|
||||
|
||||
$frequentSearches = $frequentSearchesService->getFrequentSearchTerms();
|
||||
$minimumSize = $configuration->getSearchFrequentSearchesMinSize();
|
||||
$maximumSize = $configuration->getSearchFrequentSearchesMaxSize();
|
||||
|
||||
$this->view->assign(
|
||||
'contentArguments',
|
||||
[
|
||||
'frequentSearches' => $this->enrichFrequentSearchesInfo($frequentSearches, $minimumSize, $maximumSize)
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enrich the frequentSearches
|
||||
*
|
||||
* @param array Frequent search terms as array with terms as keys and hits as the value
|
||||
* @param int $minimumSize
|
||||
* @param int $maximumSize
|
||||
* @return array An array with content for the frequent terms markers
|
||||
*/
|
||||
protected function enrichFrequentSearchesInfo(array $frequentSearchTerms, int $minimumSize, int $maximumSize): array
|
||||
{
|
||||
$frequentSearches = [];
|
||||
if (count($frequentSearchTerms)) {
|
||||
$maximumHits = max(array_values($frequentSearchTerms));
|
||||
$minimumHits = min(array_values($frequentSearchTerms));
|
||||
$spread = $maximumHits - $minimumHits;
|
||||
$step = ($spread == 0) ? 1 : ($maximumSize - $minimumSize) / $spread;
|
||||
|
||||
foreach ($frequentSearchTerms as $term => $hits) {
|
||||
$size = round($minimumSize + (($hits - $minimumHits) * $step));
|
||||
$frequentSearches[] = [
|
||||
'q' => htmlspecialchars_decode($term),
|
||||
'hits' => $hits,
|
||||
'style' => 'font-size: ' . $size . 'px', 'class' => 'tx-solr-frequent-term-' . $size,
|
||||
'size' => $size
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return $frequentSearches;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user