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) public function autocompleteAction(FilterSettings $filterSettings, $search)
{ {
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']); $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); return json_encode($destinations);
} }
@@ -92,6 +92,7 @@ class AjaxSearchController 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 ($filterSettings === null) { if ($filterSettings === null) {
$filterSettings = $this->filterService->getDefaultFilterSettings($forcedConceptUids); $filterSettings = $this->filterService->getDefaultFilterSettings($forcedConceptUids);
@@ -109,7 +110,11 @@ class AjaxSearchController extends ActionController
$organic = false; $organic = false;
} }
$filterOptions = $this->filterService->getFilterOptions($filterSettings, $excludedConceptUids); $filterOptions = $this->filterService->getFilterOptions(
$filterSettings,
$excludedConceptUids,
$excludedRegionUids
);
$options = [ $options = [
'defaultDetailPageUid' => $this->settings['defaultDetailPageUid'], 'defaultDetailPageUid' => $this->settings['defaultDetailPageUid'],
@@ -73,7 +73,9 @@ class AjaxSearchbarController extends ActionController
} else { } else {
$filterSettings = FilterSettings::fromSearchParams($searchParams); $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([ return json_encode([
'filterOptions' => $filterOptions, 'filterOptions' => $filterOptions,
'searchParams' => $searchParams, 'searchParams' => $searchParams,
@@ -72,7 +72,12 @@ class SearchController extends ActionController
$forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true); $forcedConceptUids = GeneralUtility::trimExplode(',', $this->settings['forcedConceptUids'], true);
$this->defaultFilterSettings = $this->filterService->getDefaultFilterSettings($forcedConceptUids); $this->defaultFilterSettings = $this->filterService->getDefaultFilterSettings($forcedConceptUids);
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']); $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() public function searchbarAction()
@@ -75,10 +75,11 @@ class DateRepository extends AbstractRepository
/** /**
* @param FilterSettings $filterSettings * @param FilterSettings $filterSettings
* @param array $excludedConceptUids * @param array $excludedConceptUids
* @param array $excludedRegionUids
* @return array * @return array
* @throws \Doctrine\DBAL\DBALException * @throws \Doctrine\DBAL\DBALException
*/ */
public function getFilterOptions(FilterSettings $filterSettings, $excludedConceptUids = []) public function getFilterOptions(FilterSettings $filterSettings, $excludedConceptUids = [], $excludedRegionUids = [])
{ {
$qb = $this->getDbConnection()->createQueryBuilder(); $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); $this->addFiltersettingsConditions($query, $filterSettings);
return $query->execute()->fetchAll(); return $query->execute()->fetchAll();
@@ -205,10 +213,11 @@ class DateRepository extends AbstractRepository
* @param string $type * @param string $type
* @param string $search * @param string $search
* @param FilterSettings $filterSettings * @param FilterSettings $filterSettings
* @param array $excludedRegionUids
* @return array * @return array
* @throws \Doctrine\DBAL\DBALException * @throws \Doctrine\DBAL\DBALException
*/ */
public function searchDestinations($type, $search, FilterSettings $filterSettings) public function searchDestinations($type, $search, FilterSettings $filterSettings, $excludedRegionUids = [])
{ {
$qb = $this->getDbConnection()->createQueryBuilder(); $qb = $this->getDbConnection()->createQueryBuilder();
@@ -234,6 +243,13 @@ class DateRepository extends AbstractRepository
$this->addPaxFilterConditions($query, $filterSettings); $this->addPaxFilterConditions($query, $filterSettings);
$this->addConceptFilterConditions($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(); return $query->execute()->fetchAll();
} }
@@ -175,10 +175,17 @@ class DateService implements SingletonInterface
* @param FilterSettings $filterSettings * @param FilterSettings $filterSettings
* @param string $search * @param string $search
* @param array $excludedConceptUids * @param array $excludedConceptUids
* * @param array $excludedRegionUids
* @return array * @return array
* @throws \Doctrine\DBAL\DBALException
*/ */
public function getAutocompleteOptions(FilterSettings $filterSettings, $search, $excludedConceptUids = []) public function getAutocompleteOptions
(
FilterSettings $filterSettings,
$search,
$excludedConceptUids = [],
$excludedRegionUids = []
)
{ {
$destinations = [ $destinations = [
'country' => [ 'country' => [
@@ -216,7 +223,12 @@ class DateService implements SingletonInterface
$result = $this->dateRepository->searchProducts($search, $filterSettings, $excludedConceptUids); $result = $this->dateRepository->searchProducts($search, $filterSettings, $excludedConceptUids);
break; break;
default: default:
$result = $this->dateRepository->searchDestinations($type, $search, $filterSettings); $result = $this->dateRepository->searchDestinations(
$type,
$search,
$filterSettings,
$excludedRegionUids
);
} }
foreach ($result as $row) foreach ($result as $row)
@@ -80,14 +80,19 @@ class FilterService implements SingletonInterface
/** /**
* @param FilterSettings $filterSettings * @param FilterSettings $filterSettings
* @param array $excludedConceptUids * @param array $excludedConceptUids
* @param array $excludedRegionUids
* @return FilterOptions * @return FilterOptions
* @throws \Doctrine\DBAL\DBALException * @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])) { 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]; $filterOptionsData = static::$cache['filterOptions'][$key];
if (count($filterOptionsData) === 0) { if (count($filterOptionsData) === 0) {
@@ -24,6 +24,8 @@ plugin.tx_epproducts {
defaultDetailPageUid = defaultDetailPageUid =
# cat=plugin.tx_epproducts//a; type=string; label=Exclude products with concept UIDs from search result (CSV) # cat=plugin.tx_epproducts//a; type=string; label=Exclude products with concept UIDs from search result (CSV)
excludedConceptUids = 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) # cat=plugin.tx_epproducts//a; type=string; label=Force concept UID in all search related parts (CSV)
forcedConceptUids = forcedConceptUids =
# cat=plugin.tx_epproducts//a; type=string; label=Don't show availability info for products with these concept UIDs # 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} defaultSearchPageUid = {$plugin.tx_epproducts.settings.defaultSearchPageUid}
defaultDetailPageUid = {$plugin.tx_epproducts.settings.defaultDetailPageUid} defaultDetailPageUid = {$plugin.tx_epproducts.settings.defaultDetailPageUid}
excludedConceptUids = {$plugin.tx_epproducts.settings.excludedConceptUids} excludedConceptUids = {$plugin.tx_epproducts.settings.excludedConceptUids}
excludedRegionUids = {$plugin.tx_epproducts.settings.excludedRegionUids}
forcedConceptUids = {$plugin.tx_epproducts.settings.forcedConceptUids} forcedConceptUids = {$plugin.tx_epproducts.settings.forcedConceptUids}
noInfoConceptUids = {$plugin.tx_epproducts.settings.noInfoConceptUids} noInfoConceptUids = {$plugin.tx_epproducts.settings.noInfoConceptUids}
priceTableRoomTypes = {$plugin.tx_epproducts.settings.priceTableRoomTypes} priceTableRoomTypes = {$plugin.tx_epproducts.settings.priceTableRoomTypes}