Implement exclusion of regions in filters

This commit is contained in:
Björn Fromme
2018-12-06 13:52:01 +01:00
parent 38a5e29a6a
commit cee4cc0773
9 changed files with 67 additions and 12 deletions
@@ -74,7 +74,14 @@ class AjaxFilterpanelController extends ActionController
public function autocompleteAction(FilterSettings $filterSettings, $search)
{
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
$destinations = $this->dateService->getAutocompleteOptions($filterSettings, $search, $excludedConceptUids);
$excludedRegionUids = GeneralUtility::trimExplode(',', $this->settings['excludedRegionUids']);
$destinations = $this->dateService->getAutocompleteOptions(
$filterSettings,
$search,
$excludedConceptUids,
$excludedRegionUids
);
return json_encode($destinations);
}
@@ -92,6 +92,7 @@ class AjaxSearchController extends ActionController
$organic = true;
$forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true);
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
$excludedRegionUids = GeneralUtility::trimExplode(',', $this->settings['excludedRegionUids']);
if ($filterSettings === null) {
$filterSettings = $this->filterService->getDefaultFilterSettings($forcedConceptUids);
@@ -109,7 +110,11 @@ class AjaxSearchController extends ActionController
$organic = false;
}
$filterOptions = $this->filterService->getFilterOptions($filterSettings, $excludedConceptUids);
$filterOptions = $this->filterService->getFilterOptions(
$filterSettings,
$excludedConceptUids,
$excludedRegionUids
);
$options = [
'defaultDetailPageUid' => $this->settings['defaultDetailPageUid'],
@@ -73,7 +73,9 @@ class AjaxSearchbarController extends ActionController
} else {
$filterSettings = FilterSettings::fromSearchParams($searchParams);
}
$filterOptions = $this->filterService->getFilterOptions($filterSettings);
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
$excludedRegionUids = GeneralUtility::trimExplode(',', $this->settings['excludedRegionUids']);
$filterOptions = $this->filterService->getFilterOptions($filterSettings, $excludedConceptUids, $excludedRegionUids);
return json_encode([
'filterOptions' => $filterOptions,
'searchParams' => $searchParams,
@@ -72,7 +72,12 @@ class SearchController extends ActionController
$forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true);
$this->defaultFilterSettings = $this->filterService->getDefaultFilterSettings($forcedConceptUids);
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
$this->defaultFilterOptions = $this->filterService->getFilterOptions($this->defaultFilterSettings, $excludedConceptUids);
$excludedRegionUids = GeneralUtility::trimExplode(',', $this->settings['excludedRegionUids']);
$this->defaultFilterOptions = $this->filterService->getFilterOptions(
$this->defaultFilterSettings,
$excludedConceptUids,
$excludedRegionUids
);
}
public function searchbarAction()
@@ -75,10 +75,11 @@ class DateRepository extends AbstractRepository
/**
* @param FilterSettings $filterSettings
* @param array $excludedConceptUids
* @param array $excludedRegionUids
* @return array
* @throws \Doctrine\DBAL\DBALException
*/
public function getFilterOptions(FilterSettings $filterSettings, $excludedConceptUids = [])
public function getFilterOptions(FilterSettings $filterSettings, $excludedConceptUids = [], $excludedRegionUids = [])
{
$qb = $this->getDbConnection()->createQueryBuilder();
@@ -113,6 +114,13 @@ class DateRepository extends AbstractRepository
;
}
if (count($excludedRegionUids) > 0) {
$query
->andWhere('date.region NOT IN (:excludedRegionUids)')
->setParameter('excludedRegionUids', $excludedRegionUids, Connection::PARAM_INT_ARRAY)
;
}
$this->addFiltersettingsConditions($query, $filterSettings);
return $query->execute()->fetchAll();
@@ -205,10 +213,11 @@ class DateRepository extends AbstractRepository
* @param string $type
* @param string $search
* @param FilterSettings $filterSettings
* @param array $excludedRegionUids
* @return array
* @throws \Doctrine\DBAL\DBALException
*/
public function searchDestinations($type, $search, FilterSettings $filterSettings)
public function searchDestinations($type, $search, FilterSettings $filterSettings, $excludedRegionUids = [])
{
$qb = $this->getDbConnection()->createQueryBuilder();
@@ -234,6 +243,13 @@ class DateRepository extends AbstractRepository
$this->addPaxFilterConditions($query, $filterSettings);
$this->addConceptFilterConditions($query, $filterSettings);
if (count($excludedRegionUids) > 0) {
$query
->andWhere('date.region NOT IN (:excludedRegionUids)')
->setParameter('excludedRegionUids', $excludedRegionUids, Connection::PARAM_INT_ARRAY)
;
}
return $query->execute()->fetchAll();
}
@@ -175,10 +175,17 @@ class DateService implements SingletonInterface
* @param FilterSettings $filterSettings
* @param string $search
* @param array $excludedConceptUids
*
* @param array $excludedRegionUids
* @return array
* @throws \Doctrine\DBAL\DBALException
*/
public function getAutocompleteOptions(FilterSettings $filterSettings, $search, $excludedConceptUids = [])
public function getAutocompleteOptions
(
FilterSettings $filterSettings,
$search,
$excludedConceptUids = [],
$excludedRegionUids = []
)
{
$destinations = [
'country' => [
@@ -216,7 +223,12 @@ class DateService implements SingletonInterface
$result = $this->dateRepository->searchProducts($search, $filterSettings, $excludedConceptUids);
break;
default:
$result = $this->dateRepository->searchDestinations($type, $search, $filterSettings);
$result = $this->dateRepository->searchDestinations(
$type,
$search,
$filterSettings,
$excludedRegionUids
);
}
foreach ($result as $row)
@@ -80,14 +80,19 @@ class FilterService implements SingletonInterface
/**
* @param FilterSettings $filterSettings
* @param array $excludedConceptUids
* @param array $excludedRegionUids
* @return FilterOptions
* @throws \Doctrine\DBAL\DBALException
*/
public function getFilterOptions(FilterSettings $filterSettings, $excludedConceptUids = [])
public function getFilterOptions(FilterSettings $filterSettings, $excludedConceptUids = [], $excludedRegionUids = [])
{
$key = md5(serialize($filterSettings) . serialize($excludedConceptUids));
$key = md5(serialize($filterSettings) . serialize($excludedConceptUids). serialize($excludedRegionUids));
if (empty(static::$cache['filterOptions'][$key])) {
static::$cache['filterOptions'][$key] = $this->dateRepository->getFilterOptions($filterSettings, $excludedConceptUids);
static::$cache['filterOptions'][$key] = $this->dateRepository->getFilterOptions(
$filterSettings,
$excludedConceptUids,
$excludedRegionUids
);
}
$filterOptionsData = static::$cache['filterOptions'][$key];
if (count($filterOptionsData) === 0) {
@@ -24,6 +24,8 @@ plugin.tx_epproducts {
defaultDetailPageUid =
# cat=plugin.tx_epproducts//a; type=string; label=Exclude products with concept UIDs from search result (CSV)
excludedConceptUids =
# cat=plugin.tx_epproducts//a; type=string; label=Exclude regions with these UIDs from filter options (CSV)
excludedRegionUids =
# cat=plugin.tx_epproducts//a; type=string; label=Force concept UID in all search related parts (CSV)
forcedConceptUids =
# cat=plugin.tx_epproducts//a; type=string; label=Don't show availability info for products with these concept UIDs
@@ -29,6 +29,7 @@ plugin.tx_epproducts {
defaultSearchPageUid = {$plugin.tx_epproducts.settings.defaultSearchPageUid}
defaultDetailPageUid = {$plugin.tx_epproducts.settings.defaultDetailPageUid}
excludedConceptUids = {$plugin.tx_epproducts.settings.excludedConceptUids}
excludedRegionUids = {$plugin.tx_epproducts.settings.excludedRegionUids}
forcedConceptUids = {$plugin.tx_epproducts.settings.forcedConceptUids}
noInfoConceptUids = {$plugin.tx_epproducts.settings.noInfoConceptUids}
priceTableRoomTypes = {$plugin.tx_epproducts.settings.priceTableRoomTypes}