Streamline fetching of filter options
This commit is contained in:
@@ -74,7 +74,7 @@ class AjaxFilterPanelController extends ActionController
|
|||||||
->searchResultService
|
->searchResultService
|
||||||
->getResult($filterSettings, $excludedConceptUids);
|
->getResult($filterSettings, $excludedConceptUids);
|
||||||
|
|
||||||
$filterOptions = $this->filterService->collectFilterOptionsFromResult($searchResult);
|
$filterOptions = $this->filterService->collectFilterOptionsFromSearchResult($searchResult);
|
||||||
|
|
||||||
$resultsUri = $this->uriBuilder
|
$resultsUri = $this->uriBuilder
|
||||||
->reset()
|
->reset()
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class AjaxSearchController extends ActionController
|
|||||||
$organic = false;
|
$organic = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$filterOptions = $this->filterService->collectFilterOptionsFromResult($searchResult);
|
$filterOptions = $this->filterService->collectFilterOptionsFromSearchResult($searchResult);
|
||||||
|
|
||||||
$referringPageUri = $this
|
$referringPageUri = $this
|
||||||
->uriBuilder
|
->uriBuilder
|
||||||
|
|||||||
@@ -100,7 +100,6 @@ class SearchController extends ActionController
|
|||||||
$organic = true;
|
$organic = true;
|
||||||
$forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true);
|
$forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true);
|
||||||
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
|
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
|
||||||
$excludedRegionUids = GeneralUtility::trimExplode(',', $this->settings['excludedRegionUids']);
|
|
||||||
|
|
||||||
if (!empty($filterSettings['dateFrom']) || !empty($filterSettings['dateTo'])) {
|
if (!empty($filterSettings['dateFrom']) || !empty($filterSettings['dateTo'])) {
|
||||||
$dateSelected = true;
|
$dateSelected = true;
|
||||||
@@ -125,7 +124,7 @@ class SearchController extends ActionController
|
|||||||
$organic = false;
|
$organic = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$filterOptions = $this->filterService->collectFilterOptionsFromResult($searchResult);
|
$filterOptions = $this->filterService->collectFilterOptionsFromSearchResult($searchResult);
|
||||||
|
|
||||||
$referringPageUri = $this
|
$referringPageUri = $this
|
||||||
->uriBuilder
|
->uriBuilder
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class SearchbarController extends ActionController
|
|||||||
use RequestArgumentTypeConversionTrait;
|
use RequestArgumentTypeConversionTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \EP\EpProducts\Service\FilterService
|
* @var FilterService
|
||||||
*/
|
*/
|
||||||
protected $filterService;
|
protected $filterService;
|
||||||
|
|
||||||
@@ -69,15 +69,14 @@ class SearchbarController extends ActionController
|
|||||||
public function indexAction(array $searchParams)
|
public function indexAction(array $searchParams)
|
||||||
{
|
{
|
||||||
$forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true);
|
$forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true);
|
||||||
$filterSettings = $this->filterService->getFilterSettingsFromSearchParams($searchParams);
|
$filterSettings = $this->filterService->getFilterSettingsFromSearchParams($searchParams, $forcedConceptUids);
|
||||||
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
|
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
|
||||||
$excludedRegionUids = GeneralUtility::trimExplode(',', $this->settings['excludedRegionUids']);
|
|
||||||
$filterOptions = $this->filterService->getFilterOptions(
|
$searchResult = $this
|
||||||
$filterSettings,
|
->searchResultService
|
||||||
$excludedConceptUids,
|
->getResult($filterSettings, $excludedConceptUids);
|
||||||
$excludedRegionUids,
|
|
||||||
$forcedConceptUids
|
$filterOptions = $this->filterService->collectFilterOptionsFromSearchResult($searchResult);
|
||||||
);
|
|
||||||
|
|
||||||
$this->view->assignMultiple([
|
$this->view->assignMultiple([
|
||||||
'filterOptions' => $filterOptions,
|
'filterOptions' => $filterOptions,
|
||||||
|
|||||||
@@ -71,63 +71,6 @@ class DateRepository extends AbstractRepository
|
|||||||
return [$dateRangeFrom, $dateRangeTo];
|
return [$dateRangeFrom, $dateRangeTo];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFilterOptions(
|
|
||||||
array $filterSettings,
|
|
||||||
array $excludedConceptUids = [],
|
|
||||||
array $excludedRegionUids = [],
|
|
||||||
array $forcedConceptUids = []
|
|
||||||
) {
|
|
||||||
$qb = $this->getDbConnection()->createQueryBuilder();
|
|
||||||
|
|
||||||
$query = $qb
|
|
||||||
->select(
|
|
||||||
'date.concept as conceptUid', 'date.concept_name as conceptName', 'date.concept_sorting as conceptSorting',
|
|
||||||
'date.concept_code as conceptCode', 'date.min_price as minPrice', 'date.date_start as dateStart', 'date.date_end as dateEnd',
|
|
||||||
'date.country as countryUid','date.country_name as countryName', 'date.country_code as countryCode',
|
|
||||||
'date.region as regionUid', 'date.region_name as regionName',
|
|
||||||
'date.nights as nights', 'date.board as boardType', 'date.board_bus_pro_id as boardUid',
|
|
||||||
'date.bus_available as busAvailable',
|
|
||||||
'date.hotel_type as hotelType',
|
|
||||||
'room.type as roomType'
|
|
||||||
)
|
|
||||||
->from('tx_epproducts_domain_model_date', 'date')
|
|
||||||
->innerJoin('date', 'tx_epproducts_domain_model_room', 'room', 'room.date = date.uid')
|
|
||||||
->where('date.date_start >= NOW()')
|
|
||||||
->andWhere('date.product_searchable = 1')
|
|
||||||
->andWhere('date.hotel_type > 0')
|
|
||||||
->orderBy('conceptSorting')
|
|
||||||
->addOrderBy('countryName')
|
|
||||||
->addOrderBy('regionName')
|
|
||||||
->addOrderBy('nights')
|
|
||||||
->addOrderBy('roomType')
|
|
||||||
;
|
|
||||||
|
|
||||||
if (count($excludedConceptUids) > 0) {
|
|
||||||
$query
|
|
||||||
->andWhere('date.concept NOT IN (:excludedConceptUids)')
|
|
||||||
->setParameter('excludedConceptUids', $excludedConceptUids, Connection::PARAM_INT_ARRAY)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($excludedRegionUids) > 0) {
|
|
||||||
$query
|
|
||||||
->andWhere('date.region NOT IN (:excludedRegionUids)')
|
|
||||||
->setParameter('excludedRegionUids', $excludedRegionUids, Connection::PARAM_INT_ARRAY)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($forcedConceptUids) > 0) {
|
|
||||||
$query
|
|
||||||
->andWhere('date.concept IN (:forcedConceptUids)')
|
|
||||||
->setParameter('forcedConceptUids', $forcedConceptUids, Connection::PARAM_INT_ARRAY)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->addFiltersettingsConditions($query, $filterSettings);
|
|
||||||
|
|
||||||
return $query->execute()->fetchAllAssociative();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $search
|
* @param string $search
|
||||||
* @param array $filterSettings
|
* @param array $filterSettings
|
||||||
|
|||||||
+18
-28
@@ -27,6 +27,8 @@ namespace EP\EpProducts\Traits;
|
|||||||
* This copyright notice MUST APPEAR in all copies of the script!
|
* This copyright notice MUST APPEAR in all copies of the script!
|
||||||
***************************************************************/
|
***************************************************************/
|
||||||
|
|
||||||
|
use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
|
||||||
|
use TYPO3\CMS\Core\Imaging\ImageManipulation\Area;
|
||||||
use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariantCollection;
|
use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariantCollection;
|
||||||
use TYPO3\CMS\Core\Resource\FileReference;
|
use TYPO3\CMS\Core\Resource\FileReference;
|
||||||
use TYPO3\CMS\Core\Resource\FileRepository;
|
use TYPO3\CMS\Core\Resource\FileRepository;
|
||||||
@@ -35,12 +37,7 @@ use TYPO3\CMS\Extbase\Service\ImageService;
|
|||||||
trait ImageServiceTrait
|
trait ImageServiceTrait
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var FileRepository
|
||||||
*/
|
|
||||||
protected static $cache = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \TYPO3\CMS\Core\Resource\FileRepository
|
|
||||||
*/
|
*/
|
||||||
protected $fileRepository;
|
protected $fileRepository;
|
||||||
|
|
||||||
@@ -50,42 +47,38 @@ trait ImageServiceTrait
|
|||||||
protected $imageService;
|
protected $imageService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param FileRepository $fileRepository
|
* @var FrontendInterface
|
||||||
* @param ImageService $imageService
|
|
||||||
*/
|
*/
|
||||||
public function __construct(FileRepository $fileRepository, ImageService $imageService)
|
protected $cache;
|
||||||
|
|
||||||
|
public function __construct(FileRepository $fileRepository, ImageService $imageService, FrontendInterface $cache)
|
||||||
{
|
{
|
||||||
$this->fileRepository = $fileRepository;
|
$this->fileRepository = $fileRepository;
|
||||||
$this->imageService = $imageService;
|
$this->imageService = $imageService;
|
||||||
|
$this->cache = $cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function getImages($uid): array
|
||||||
* @param int $uid
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getImages($uid)
|
|
||||||
{
|
{
|
||||||
if (!isset(static::$cache[$uid])) {
|
$key = $this->table.$uid;
|
||||||
|
if (false === ($value = $this->cache->get($key))) {
|
||||||
$original = $this->fileRepository->findByRelation(
|
$original = $this->fileRepository->findByRelation(
|
||||||
$this->table,
|
$this->table,
|
||||||
$this->field,
|
$this->field,
|
||||||
$uid
|
$uid
|
||||||
);
|
);
|
||||||
$resized = $this->generateResizedImages($original);
|
$resized = $this->generateResizedImages($original);
|
||||||
static::$cache[$uid] = [
|
$value = [
|
||||||
'original' => $original,
|
'original' => $original,
|
||||||
'resized' => $resized,
|
'resized' => $resized,
|
||||||
];
|
];
|
||||||
|
$this->cache->set($key, $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return static::$cache[$uid];
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function generateResizedImages($images): array
|
||||||
* @param array $images
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function generateResizedImages($images)
|
|
||||||
{
|
{
|
||||||
$resized = [];
|
$resized = [];
|
||||||
foreach ($this->imageSizes as $version => $instructions)
|
foreach ($this->imageSizes as $version => $instructions)
|
||||||
@@ -101,20 +94,17 @@ trait ImageServiceTrait
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $resized;
|
return $resized;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected function getCroppingInfo(FileReference $image, array $processingInstructions): ?Area
|
||||||
* @param FileReference $image
|
|
||||||
* @param array $processingInstructions
|
|
||||||
* @return null|\TYPO3\CMS\Core\Imaging\ImageManipulation\Area
|
|
||||||
*/
|
|
||||||
protected function getCroppingInfo(FileReference $image, array $processingInstructions)
|
|
||||||
{
|
{
|
||||||
$cropString = $image->getProperty('crop');
|
$cropString = $image->getProperty('crop');
|
||||||
$cropVariantCollection = CropVariantCollection::create((string) $cropString);
|
$cropVariantCollection = CropVariantCollection::create((string) $cropString);
|
||||||
$cropVariant = $processingInstructions['cropVariant'] ?: 'default';
|
$cropVariant = $processingInstructions['cropVariant'] ?: 'default';
|
||||||
$cropArea = $cropVariantCollection->getCropArea($cropVariant);
|
$cropArea = $cropVariantCollection->getCropArea($cropVariant);
|
||||||
|
|
||||||
return $cropArea->isEmpty() ? null : $cropArea->makeAbsoluteBasedOnFile($image);
|
return $cropArea->isEmpty() ? null : $cropArea->makeAbsoluteBasedOnFile($image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -39,11 +39,6 @@ class FilterService implements SingletonInterface
|
|||||||
public const DURATION_SHORT = 4;
|
public const DURATION_SHORT = 4;
|
||||||
public const DURATION_LONG = 5;
|
public const DURATION_LONG = 5;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
static protected $cache = [];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \EP\EpProducts\Domain\Repository\DateRepository
|
* @var \EP\EpProducts\Domain\Repository\DateRepository
|
||||||
*/
|
*/
|
||||||
@@ -87,9 +82,9 @@ class FilterService implements SingletonInterface
|
|||||||
return $filterSettings;
|
return $filterSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFilterSettingsFromSearchParams(array $searchParams): array
|
public function getFilterSettingsFromSearchParams(array $searchParams, array $forcedConceptUids = []): array
|
||||||
{
|
{
|
||||||
$filterSettings = $this->getNormalizedFilterSettings();
|
$filterSettings = $this->getNormalizedFilterSettings([], $forcedConceptUids);
|
||||||
|
|
||||||
if ($searchParams['destinationType'] && $searchParams['destinationUid']) {
|
if ($searchParams['destinationType'] && $searchParams['destinationUid']) {
|
||||||
switch ($searchParams['destinationType']) {
|
switch ($searchParams['destinationType']) {
|
||||||
@@ -164,27 +159,7 @@ class FilterService implements SingletonInterface
|
|||||||
return $filterSettings;
|
return $filterSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFilterOptions
|
public function collectFilterOptionsFromSearchResult(SearchResult $searchResult): FilterOptions
|
||||||
(
|
|
||||||
array $filterSettings,
|
|
||||||
array $excludedConceptUids = [],
|
|
||||||
array $excludedRegionUids = [],
|
|
||||||
array $forcedConceptUids = []
|
|
||||||
): FilterOptions {
|
|
||||||
$filterOptionsData = $this->dateRepository->getFilterOptions(
|
|
||||||
$filterSettings,
|
|
||||||
$excludedConceptUids,
|
|
||||||
$excludedRegionUids,
|
|
||||||
$forcedConceptUids
|
|
||||||
);
|
|
||||||
if (count($filterOptionsData) === 0) {
|
|
||||||
return new FilterOptions();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->preprocessFilterOptions($filterOptionsData);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function collectFilterOptionsFromResult(SearchResult $searchResult): FilterOptions
|
|
||||||
{
|
{
|
||||||
$priceRanges = [];
|
$priceRanges = [];
|
||||||
$busAvailable = false;
|
$busAvailable = false;
|
||||||
@@ -302,133 +277,6 @@ class FilterService implements SingletonInterface
|
|||||||
return $filterOptions;
|
return $filterOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function preprocessFilterOptions(array $filterOptionsData): FilterOptions
|
|
||||||
{
|
|
||||||
$priceRanges = [];
|
|
||||||
$busAvailable = false;
|
|
||||||
$nights = [];
|
|
||||||
$concepts = [];
|
|
||||||
$destinations = [];
|
|
||||||
$hotelTypes = [];
|
|
||||||
$roomTypes = [];
|
|
||||||
$boardTypes = [];
|
|
||||||
$dateMin = $dateMax = null;
|
|
||||||
|
|
||||||
foreach ($filterOptionsData as $row) {
|
|
||||||
// Date
|
|
||||||
if (null === $dateMin || $row['dateStart'] < $dateMin) {
|
|
||||||
$dateMin = $row['dateStart'];
|
|
||||||
}
|
|
||||||
if (null === $dateMax || $row['dateEnd'] > $dateMax) {
|
|
||||||
$dateMax = $row['dateEnd'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bus
|
|
||||||
if ((bool) $row['busAvailable'] === true) {
|
|
||||||
$busAvailable = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nights
|
|
||||||
$duration = (int) $row['nights'] <= 4 ? self::DURATION_SHORT : self::DURATION_LONG;
|
|
||||||
|
|
||||||
if (!\in_array($duration, $nights, false)) {
|
|
||||||
$nights[] = $duration;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Concepts
|
|
||||||
if (!array_key_exists($row['conceptUid'], $concepts)) {
|
|
||||||
$concepts[$row['conceptSorting']] = [
|
|
||||||
'uid' => $row['conceptUid'],
|
|
||||||
'name' => $row['conceptName'],
|
|
||||||
'code' => $row['conceptCode'],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destinations
|
|
||||||
if (!array_key_exists($row['countryUid'], $destinations)) {
|
|
||||||
$destinations[$row['countryUid']] = [
|
|
||||||
'country' => [
|
|
||||||
'uid' => $row['countryUid'],
|
|
||||||
'label' => $row['countryName'],
|
|
||||||
'code' => $row['countryCode'],
|
|
||||||
],
|
|
||||||
'regions' => [],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
if (!array_key_exists($row['regionUid'], $destinations[$row['countryUid']]['regions'])) {
|
|
||||||
$destinations[$row['countryUid']]['regions'][$row['regionUid']] = [
|
|
||||||
'uid' => $row['regionUid'],
|
|
||||||
'label' => $row['regionName'],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hotel types
|
|
||||||
if (!\in_array($row['hotelType'], $hotelTypes, false)) {
|
|
||||||
$hotelTypes[] = $row['hotelType'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Room types
|
|
||||||
if (!\in_array($row['roomType'], $roomTypes, false)) {
|
|
||||||
$roomTypes[] = $row['roomType'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Board types
|
|
||||||
$boardType = [
|
|
||||||
'uid' => $row['boardUid'],
|
|
||||||
'label' => $row['board'],
|
|
||||||
];
|
|
||||||
if (!\in_array($boardType, $boardTypes, false)) {
|
|
||||||
$boardTypes[] = $boardType;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Price range
|
|
||||||
foreach (FilterOptions::$priceRangeOptions as $index => $priceRange) {
|
|
||||||
if (array_key_exists($index, $priceRanges)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
[$min, $max] = $priceRange;
|
|
||||||
if ($row['minPrice'] >= $min && $row['minPrice'] < $max) {
|
|
||||||
$range = FilterOptions::$priceRangeOptions[$index];
|
|
||||||
$priceRanges[$index] = [
|
|
||||||
'uid' => $index,
|
|
||||||
'min' => $range[0],
|
|
||||||
'max' => $range[1],
|
|
||||||
'formatted' => $this->formatPriceRange($range[0], $range[1]),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($destinations as $key => $value)
|
|
||||||
{
|
|
||||||
usort($value['regions'], function ($a, $b) {
|
|
||||||
return strcmp($a['label'], $b['label']);
|
|
||||||
});
|
|
||||||
$destinations[$key] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
sort($nights);
|
|
||||||
ksort($priceRanges);
|
|
||||||
|
|
||||||
usort($boardTypes, function ($a, $b) {
|
|
||||||
return strcmp($a['label'], $b['label']);
|
|
||||||
});
|
|
||||||
|
|
||||||
$filterOptions = new FilterOptions();
|
|
||||||
$filterOptions->setPriceRanges($priceRanges);
|
|
||||||
$filterOptions->setDateFrom($dateMin);
|
|
||||||
$filterOptions->setDateTo($dateMax);
|
|
||||||
$filterOptions->setConcepts($concepts);
|
|
||||||
$filterOptions->setDestinations($destinations);
|
|
||||||
$filterOptions->setHotelTypes($hotelTypes);
|
|
||||||
$filterOptions->setRoomTypes($roomTypes);
|
|
||||||
$filterOptions->setBoardTypes($boardTypes);
|
|
||||||
$filterOptions->setBusAvailable($busAvailable);
|
|
||||||
$filterOptions->setNights($nights);
|
|
||||||
|
|
||||||
return $filterOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function formatPriceRange(int $min, int $max): string
|
public function formatPriceRange(int $min, int $max): string
|
||||||
{
|
{
|
||||||
if ($min === 1) {
|
if ($min === 1) {
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace EP\EpProducts\Service;
|
|
||||||
|
|
||||||
/***************************************************************
|
|
||||||
*
|
|
||||||
* Copyright notice
|
|
||||||
*
|
|
||||||
* (c) 2018 Björn Fromme <[email protected]>, dreipunktnull
|
|
||||||
*
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* This script is part of the TYPO3 project. The TYPO3 project is
|
|
||||||
* free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* The GNU General Public License can be found at
|
|
||||||
* http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
*
|
|
||||||
* This script is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* This copyright notice MUST APPEAR in all copies of the script!
|
|
||||||
***************************************************************/
|
|
||||||
|
|
||||||
use TYPO3\CMS\Core\SingletonInterface;
|
|
||||||
use TYPO3\CMS\Extbase\Service\ImageService;
|
|
||||||
|
|
||||||
class FlagIconService implements SingletonInterface
|
|
||||||
{
|
|
||||||
const FLAGICON_PATH = 'EXT:ep_theme/Resources/Public/images/%s.png';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var ImageService
|
|
||||||
*/
|
|
||||||
protected $imageService;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected static $cache = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ImageService $imageService
|
|
||||||
*/
|
|
||||||
public function __construct(ImageService $imageService)
|
|
||||||
{
|
|
||||||
$this->imageService = $imageService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $code
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getImage($code)
|
|
||||||
{
|
|
||||||
if (!isset(self::$cache[$code])) {
|
|
||||||
$src = sprintf(self::FLAGICON_PATH, strtolower($code));
|
|
||||||
$image = $this->imageService->getImage($src, null, false);
|
|
||||||
self::$cache[$code] = $this->imageService->getImageUri($image, true);
|
|
||||||
}
|
|
||||||
return self::$cache[$code];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -49,26 +49,14 @@ class SearchResultService implements SingletonInterface
|
|||||||
*/
|
*/
|
||||||
protected $hotelImageService;
|
protected $hotelImageService;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var FlagIconService
|
|
||||||
*/
|
|
||||||
protected $flagIconService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ProductRepository $productRepository
|
* @param ProductRepository $productRepository
|
||||||
* @param HotelImageService $hotelImageService
|
* @param HotelImageService $hotelImageService
|
||||||
* @param FlagIconService $flagIconService
|
|
||||||
*/
|
*/
|
||||||
public function __construct
|
public function __construct(ProductRepository $productRepository, HotelImageService $hotelImageService)
|
||||||
(
|
|
||||||
ProductRepository $productRepository,
|
|
||||||
HotelImageService $hotelImageService,
|
|
||||||
FlagIconService $flagIconService
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
$this->productRepository = $productRepository;
|
$this->productRepository = $productRepository;
|
||||||
$this->hotelImageService = $hotelImageService;
|
$this->hotelImageService = $hotelImageService;
|
||||||
$this->flagIconService = $flagIconService;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNormalizedSearchParams(array $searchParams = []): array
|
public function getNormalizedSearchParams(array $searchParams = []): array
|
||||||
@@ -147,7 +135,6 @@ class SearchResultService implements SingletonInterface
|
|||||||
'uid' => $row['countryUid'],
|
'uid' => $row['countryUid'],
|
||||||
'code' => $row['countryCode'],
|
'code' => $row['countryCode'],
|
||||||
'name' => $row['countryName'],
|
'name' => $row['countryName'],
|
||||||
'flag' => $this->flagIconService->getImage($row['countryCode']),
|
|
||||||
],
|
],
|
||||||
'region' => [
|
'region' => [
|
||||||
'uid' => $row['regionUid'],
|
'uid' => $row['regionUid'],
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace EP\EpTheme\ViewHelpers;
|
|
||||||
|
|
||||||
/***************************************************************
|
|
||||||
*
|
|
||||||
* Copyright notice
|
|
||||||
*
|
|
||||||
* (c) 2018 Björn Fromme <[email protected]>, dreipunktnull
|
|
||||||
*
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* This script is part of the TYPO3 project. The TYPO3 project is
|
|
||||||
* free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* The GNU General Public License can be found at
|
|
||||||
* http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
*
|
|
||||||
* This script is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* This copyright notice MUST APPEAR in all copies of the script!
|
|
||||||
***************************************************************/
|
|
||||||
|
|
||||||
use EP\EpProducts\Domain\Model\Country;
|
|
||||||
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
|
|
||||||
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
|
|
||||||
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
|
|
||||||
|
|
||||||
class FlagiconSourceViewHelper extends AbstractViewHelper
|
|
||||||
{
|
|
||||||
use CompileWithRenderStatic;
|
|
||||||
|
|
||||||
public function initializeArguments()
|
|
||||||
{
|
|
||||||
parent::initializeArguments();
|
|
||||||
|
|
||||||
$this->registerArgument('countryCode', 'string', 'Country code to return a flag icon source for.');
|
|
||||||
$this->registerArgument('country', 'mixed', 'Country entity to return a flag icon source for.');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $arguments
|
|
||||||
* @param \Closure $renderChildrenClosure
|
|
||||||
* @param RenderingContextInterface $renderingContext
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public static function renderStatic(
|
|
||||||
array $arguments,
|
|
||||||
\Closure $renderChildrenClosure,
|
|
||||||
RenderingContextInterface $renderingContext
|
|
||||||
)
|
|
||||||
{
|
|
||||||
$code = null;
|
|
||||||
|
|
||||||
if (\is_object($arguments['country']) && $arguments['country'] instanceof Country) {
|
|
||||||
/** @var \EP\EpProducts\Domain\Model\Country $country */
|
|
||||||
$country = $arguments['country'];
|
|
||||||
$code = strtolower($country->getCode());
|
|
||||||
} elseif (!empty($arguments['countryCode'])) {
|
|
||||||
$code = strtolower($arguments['countryCode']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($code !== null) {
|
|
||||||
return 'EXT:ep_theme/Resources/Public/images/' . $code . '.png';
|
|
||||||
}
|
|
||||||
|
|
||||||
return 'EXT:ep_theme/Resources/Public/images/gb.png';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user