diff --git a/doc/03_Installation/01_Upgrade_Notes.md b/doc/03_Installation/01_Upgrade_Notes.md index 7a126cbc..953bb5be 100644 --- a/doc/03_Installation/01_Upgrade_Notes.md +++ b/doc/03_Installation/01_Upgrade_Notes.md @@ -1,4 +1,6 @@ # Upgrade Notes +#### v2.1.0 +Added the possibility to distinguish relations conditions applied as preconditions. #### v2.0.0 Added `bool` as possible type to `$condition` parameter of `addCondition` function in `ProductListInterface` (and all implementing classes). @@ -8,4 +10,4 @@ Added `bool` as possible type to `$condition` parameter of `addCondition` functi please check if custom CSS/JS code added by `pimcore_head_script` and `pimcore_head_link` is still working. #### v2.0.0 -- `AbstractOfferToolProduct` now only accepts int as the `$id` parameter. \ No newline at end of file +- `AbstractOfferToolProduct` now only accepts int as the `$id` parameter. diff --git a/src/FilterService/FilterType/AbstractFilterType.php b/src/FilterService/FilterType/AbstractFilterType.php index f60155e5..d62590da 100644 --- a/src/FilterService/FilterType/AbstractFilterType.php +++ b/src/FilterService/FilterType/AbstractFilterType.php @@ -26,6 +26,8 @@ abstract class AbstractFilterType { const EMPTY_STRING = '$$EMPTY$$'; + public const PREFIX_PRECONDITION = 'PRECONDITION_'; + protected TranslatorInterface $translator; protected EngineInterface $templatingEngine; @@ -68,6 +70,11 @@ protected function getField(AbstractFilterDefinitionType $filterDefinition): str return $field; } + protected function getConditionField(string $field, bool $isPrecondition): string + { + return $isPrecondition ? self::PREFIX_PRECONDITION . $field : $field; + } + protected function getTemplate(AbstractFilterDefinitionType $filterDefinition): ?string { $template = $this->template; diff --git a/src/FilterService/FilterType/Findologic/MultiSelectRelation.php b/src/FilterService/FilterType/Findologic/MultiSelectRelation.php index fd3cf946..17d27448 100644 --- a/src/FilterService/FilterType/Findologic/MultiSelectRelation.php +++ b/src/FilterService/FilterType/Findologic/MultiSelectRelation.php @@ -121,7 +121,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $currentFilter[$field] = $value; if (!empty($value)) { - $productList->addRelationCondition($field, $value); + $productList->addRelationCondition($this->getConditionField($field, $isPrecondition), $value); } return $currentFilter; diff --git a/src/FilterService/FilterType/Findologic/NumberRange.php b/src/FilterService/FilterType/Findologic/NumberRange.php index 295ded25..3fb64657 100644 --- a/src/FilterService/FilterType/Findologic/NumberRange.php +++ b/src/FilterService/FilterType/Findologic/NumberRange.php @@ -100,7 +100,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro } else { $v['max'] = 9999999999999999; // findologic won't accept only one of max or min, always needs both } - $productList->addCondition($v, $field); + $productList->addCondition($v, $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/Findologic/NumberRangeSelection.php b/src/FilterService/FilterType/Findologic/NumberRangeSelection.php index 0bd93e25..dcd7abfc 100644 --- a/src/FilterService/FilterType/Findologic/NumberRangeSelection.php +++ b/src/FilterService/FilterType/Findologic/NumberRangeSelection.php @@ -123,7 +123,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro } else { $v['max'] = 9999999999999999; // findologic won't accept only one of max or min, always needs both } - $productList->addCondition($v, $field); + $productList->addCondition($v, $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/Findologic/Select.php b/src/FilterService/FilterType/Findologic/Select.php index f06f4e6c..0ca74821 100644 --- a/src/FilterService/FilterType/Findologic/Select.php +++ b/src/FilterService/FilterType/Findologic/Select.php @@ -47,7 +47,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $currentFilter[$field] = $value; if (!empty($value)) { - $productList->addCondition([$value], $field); + $productList->addCondition([$value], $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/Findologic/SelectRelation.php b/src/FilterService/FilterType/Findologic/SelectRelation.php index 48ade95d..5ed103e4 100644 --- a/src/FilterService/FilterType/Findologic/SelectRelation.php +++ b/src/FilterService/FilterType/Findologic/SelectRelation.php @@ -86,7 +86,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $currentFilter[$field] = $value; if (!empty($value)) { - $productList->addCondition([$value], $field); + $productList->addCondition([$value], $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/Input.php b/src/FilterService/FilterType/Input.php index 62004696..f39b75a1 100644 --- a/src/FilterService/FilterType/Input.php +++ b/src/FilterService/FilterType/Input.php @@ -51,11 +51,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($value)) { $db = Db::get(); - if ($isPrecondition) { - $productList->addCondition('TRIM(`' . $field . '`) LIKE ' . $db->quote('%' . $value . '%'), 'PRECONDITION_' . $field); - } else { - $productList->addCondition('TRIM(`' . $field . '`) LIKE ' . $db->quote('%' . $value . '%'), $field); - } + $productList->addCondition( + 'TRIM(`' . $field . '`) LIKE ' . $db->quote('%' . $value . '%'), + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/MultiSelect.php b/src/FilterService/FilterType/MultiSelect.php index 73e6b53c..5415eea6 100644 --- a/src/FilterService/FilterType/MultiSelect.php +++ b/src/FilterService/FilterType/MultiSelect.php @@ -81,18 +81,16 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if ($filterDefinition->getUseAndCondition()) { foreach ($quotedValues as $value) { - if ($isPrecondition) { - $productList->addCondition($field . ' = ' . $value, 'PRECONDITION_' . $field); - } else { - $productList->addCondition($field . ' = ' . $value, $field); - } + $productList->addCondition( + $field . ' = ' . $value, + $this->getConditionField($field, $isPrecondition) + ); } } else { - if ($isPrecondition) { - $productList->addCondition($field . ' IN (' . implode(',', $quotedValues) . ')', 'PRECONDITION_' . $field); - } else { - $productList->addCondition($field . ' IN (' . implode(',', $quotedValues) . ')', $field); - } + $productList->addCondition( + $field . ' IN (' . implode(',', $quotedValues) . ')', + $this->getConditionField($field, $isPrecondition) + ); } } } diff --git a/src/FilterService/FilterType/MultiSelectCategory.php b/src/FilterService/FilterType/MultiSelectCategory.php index b1074b37..5a8ffee0 100644 --- a/src/FilterService/FilterType/MultiSelectCategory.php +++ b/src/FilterService/FilterType/MultiSelectCategory.php @@ -69,7 +69,8 @@ public function getFilterValues(AbstractFilterDefinitionType $filterDefinition, public function addCondition(AbstractFilterDefinitionType $filterDefinition, ProductListInterface $productList, array $currentFilter, array $params, bool $isPrecondition = false): array { - $value = $params[$filterDefinition->getField()] ?? null; + $field = $this->getField($filterDefinition); + $value = $params[$field] ?? null; $isReload = $params['is_reload'] ?? null; if ($value == AbstractFilterType::EMPTY_STRING) { @@ -83,7 +84,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $value = $preSelect; } - $currentFilter[$filterDefinition->getField()] = $value; + $currentFilter[$field] = $value; $conditions = []; if (!empty($value)) { @@ -95,7 +96,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $category = '%,' . trim((string)$category) . ',%'; - $conditions[] = $filterDefinition->getField() . ' LIKE ' . $db->quote($category); + $conditions[] = $field . ' LIKE ' . $db->quote($category); } } @@ -111,11 +112,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $conditions = '(' . implode(' OR ', $conditions) . ')'; } - if ($isPrecondition) { - $productList->addCondition($conditions, 'PRECONDITION_' . $filterDefinition->getField()); - } else { - $productList->addCondition($conditions, $filterDefinition->getField()); - } + $productList->addCondition($conditions, $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/MultiSelectFromMultiSelect.php b/src/FilterService/FilterType/MultiSelectFromMultiSelect.php index fb37f775..b1316aba 100644 --- a/src/FilterService/FilterType/MultiSelectFromMultiSelect.php +++ b/src/FilterService/FilterType/MultiSelectFromMultiSelect.php @@ -115,11 +115,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro } $quotedValues = '('.$quotedValues.')'; - if ($isPrecondition) { - $productList->addCondition($quotedValues, 'PRECONDITION_' . $field); - } else { - $productList->addCondition($quotedValues, $field); - } + $productList->addCondition($quotedValues, $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/MultiSelectRelation.php b/src/FilterService/FilterType/MultiSelectRelation.php index 3ca09ea6..a19246f5 100644 --- a/src/FilterService/FilterType/MultiSelectRelation.php +++ b/src/FilterService/FilterType/MultiSelectRelation.php @@ -124,10 +124,16 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($quotedValues)) { if ($filterDefinition->getUseAndCondition()) { foreach ($quotedValues as $value) { - $productList->addRelationCondition($field, 'dest = ' . $value); + $productList->addRelationCondition( + $this->getConditionField($field, $isPrecondition), + 'dest = ' . $value + ); } } else { - $productList->addRelationCondition($field, 'dest IN (' . implode(',', $quotedValues) . ')'); + $productList->addRelationCondition( + $this->getConditionField($field, $isPrecondition), + 'dest IN (' . implode(',', $quotedValues) . ')' + ); } } } diff --git a/src/FilterService/FilterType/NumberRange.php b/src/FilterService/FilterType/NumberRange.php index dcd64f03..b1339dd3 100644 --- a/src/FilterService/FilterType/NumberRange.php +++ b/src/FilterService/FilterType/NumberRange.php @@ -47,19 +47,20 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $db = Db::get(); - if (!empty($value['from'])) { - if ($isPrecondition) { - $productList->addCondition($this->getField($filterDefinition) . ' >= ' . $db->quote($value['from']), 'PRECONDITION_' . $this->getField($filterDefinition)); - } elseif ($value['from'] != AbstractFilterType::EMPTY_STRING) { - $productList->addCondition($this->getField($filterDefinition) . ' >= ' . $db->quote($value['from']), $this->getField($filterDefinition)); - } + $from = $value['from'] ?? null; + $to = $value['to'] ?? null; + + if ($from && $from !== AbstractFilterType::EMPTY_STRING) { + $productList->addCondition( + $field . ' >= ' . $db->quote((string)$from), + $this->getConditionField($field, $isPrecondition) + ); } - if (!empty($value['to'])) { - if ($isPrecondition) { - $productList->addCondition($this->getField($filterDefinition) . ' <= ' . $db->quote($value['to']), 'PRECONDITION_' . $this->getField($filterDefinition)); - } elseif ($value['to'] != AbstractFilterType::EMPTY_STRING) { - $productList->addCondition($this->getField($filterDefinition) . ' <= ' . $db->quote($value['to']), $this->getField($filterDefinition)); - } + if ($to && $to !== AbstractFilterType::EMPTY_STRING) { + $productList->addCondition( + $field . ' <= ' . $db->quote((string)$to), + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/NumberRangeSelection.php b/src/FilterService/FilterType/NumberRangeSelection.php index 7516f68e..0731ae08 100644 --- a/src/FilterService/FilterType/NumberRangeSelection.php +++ b/src/FilterService/FilterType/NumberRangeSelection.php @@ -122,18 +122,16 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($value)) { if (!empty($value['from'])) { - if ($isPrecondition) { - $productList->addCondition($field . ' >= ' . $db->quote($value['from']), 'PRECONDITION_' . $field); - } else { - $productList->addCondition($field . ' >= ' . $db->quote($value['from']), $field); - } + $productList->addCondition( + $field . ' >= ' . $db->quote((string)$value['from']), + $this->getConditionField($field, $isPrecondition) + ); } if (!empty($value['to'])) { - if ($isPrecondition) { - $productList->addCondition($field . ' <= ' . $db->quote($value['to']), 'PRECONDITION_' . $field); - } else { - $productList->addCondition($field . ' < ' . $db->quote($value['to']), $field); - } + $productList->addCondition( + $field . ' < ' . $db->quote((string)$value['to']), + $this->getConditionField($field, $isPrecondition) + ); } } diff --git a/src/FilterService/FilterType/SearchIndex/Input.php b/src/FilterService/FilterType/SearchIndex/Input.php index cbc17df3..f7a1f1c7 100644 --- a/src/FilterService/FilterType/SearchIndex/Input.php +++ b/src/FilterService/FilterType/SearchIndex/Input.php @@ -47,7 +47,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($value)) { $value = '.*"' . $value . '".*'; - $productList->addCondition(['regexp' => ['attributes.' . $field => $value]], $field); + $productList->addCondition( + ['regexp' => ['attributes.' . $field => $value]], + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/SearchIndex/MultiSelect.php b/src/FilterService/FilterType/SearchIndex/MultiSelect.php index 1e820acd..952c6d53 100644 --- a/src/FilterService/FilterType/SearchIndex/MultiSelect.php +++ b/src/FilterService/FilterType/SearchIndex/MultiSelect.php @@ -83,10 +83,13 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($quotedValues)) { if ($filterDefinition->getUseAndCondition()) { foreach ($quotedValues as $value) { - $productList->addCondition($value, $field); + $productList->addCondition($value, $this->getConditionField($field, $isPrecondition)); } } else { - $productList->addCondition(['terms' => ['attributes.' . $field => $quotedValues]], $field); + $productList->addCondition( + ['terms' => ['attributes.' . $field => $quotedValues]], + $this->getConditionField($field, $isPrecondition) + ); } } } diff --git a/src/FilterService/FilterType/SearchIndex/MultiSelectFromMultiSelect.php b/src/FilterService/FilterType/SearchIndex/MultiSelectFromMultiSelect.php index 4d23559a..6562e3e1 100644 --- a/src/FilterService/FilterType/SearchIndex/MultiSelectFromMultiSelect.php +++ b/src/FilterService/FilterType/SearchIndex/MultiSelectFromMultiSelect.php @@ -72,7 +72,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if ($filterDefinition->getUseAndCondition()) { foreach ($value as $entry) { - $productList->addCondition(['term' => ['attributes.' . $field => $entry]], $field); + $productList->addCondition( + ['term' => ['attributes.' . $field => $entry]], + $this->getConditionField($field, $isPrecondition) + ); } } else { $boolArray = []; @@ -80,7 +83,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $boolArray[] = ['term' => ['attributes.' . $field => $entry]]; } - $productList->addCondition(['bool' => ['should' => $boolArray, 'minimum_should_match' => 1]], $field); + $productList->addCondition( + ['bool' => ['should' => $boolArray, 'minimum_should_match' => 1]], + $this->getConditionField($field, $isPrecondition) + ); } } diff --git a/src/FilterService/FilterType/SearchIndex/MultiSelectRelation.php b/src/FilterService/FilterType/SearchIndex/MultiSelectRelation.php index 4f8a3d50..d80103d3 100644 --- a/src/FilterService/FilterType/SearchIndex/MultiSelectRelation.php +++ b/src/FilterService/FilterType/SearchIndex/MultiSelectRelation.php @@ -75,10 +75,13 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($quotedValues)) { if ($filterDefinition->getUseAndCondition()) { foreach ($quotedValues as $value) { - $productList->addRelationCondition($field, $value); + $productList->addRelationCondition($this->getConditionField($field, $isPrecondition), $value); } } else { - $productList->addRelationCondition($field, ['terms' => ['relations.' . $field => $quotedValues]]); + $productList->addRelationCondition( + $this->getConditionField($field, $isPrecondition), + ['terms' => ['relations.' . $field => $quotedValues]] + ); } } } diff --git a/src/FilterService/FilterType/SearchIndex/NumberRange.php b/src/FilterService/FilterType/SearchIndex/NumberRange.php index eb40d019..fff72ad2 100644 --- a/src/FilterService/FilterType/SearchIndex/NumberRange.php +++ b/src/FilterService/FilterType/SearchIndex/NumberRange.php @@ -48,7 +48,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (strlen($value['to']) > 0) { $range['lte'] = $value['to']; } - $productList->addCondition(['range' => ['attributes.' . $field => $range]], $field); + $productList->addCondition( + ['range' => ['attributes.' . $field => $range]], + $this->getConditionField($field, $isPrecondition), + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/SearchIndex/NumberRangeSelection.php b/src/FilterService/FilterType/SearchIndex/NumberRangeSelection.php index 617a8ba5..489b3609 100644 --- a/src/FilterService/FilterType/SearchIndex/NumberRangeSelection.php +++ b/src/FilterService/FilterType/SearchIndex/NumberRangeSelection.php @@ -55,7 +55,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($value['to'])) { $range['lte'] = $value['to']; } - $productList->addCondition(['range' => ['attributes.' . $field => $range]], $field); + $productList->addCondition( + ['range' => ['attributes.' . $field => $range]], + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/SearchIndex/Select.php b/src/FilterService/FilterType/SearchIndex/Select.php index e2e2769e..906d4b10 100644 --- a/src/FilterService/FilterType/SearchIndex/Select.php +++ b/src/FilterService/FilterType/SearchIndex/Select.php @@ -42,7 +42,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $currentFilter[$field] = $value; if (!empty($value)) { - $productList->addCondition(trim($value), $field); + $productList->addCondition(trim($value), $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/SearchIndex/SelectCategory.php b/src/FilterService/FilterType/SearchIndex/SelectCategory.php index ed544225..46ad3953 100644 --- a/src/FilterService/FilterType/SearchIndex/SelectCategory.php +++ b/src/FilterService/FilterType/SearchIndex/SelectCategory.php @@ -55,7 +55,8 @@ public function getFilterValues(AbstractFilterDefinitionType $filterDefinition, public function addCondition(AbstractFilterDefinitionType $filterDefinition, ProductListInterface $productList, array $currentFilter, array $params, bool $isPrecondition = false): array { - $value = $params[$filterDefinition->getField()] ?? null; + $field = $this->getField($filterDefinition); + $value = $params[$field] ?? null; $isReload = $params['is_reload'] ?? null; if ($value == AbstractFilterType::EMPTY_STRING) { @@ -67,11 +68,11 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro } } - $currentFilter[$filterDefinition->getField()] = $value; + $currentFilter[$field] = $value; if (!empty($value)) { $value = trim((string)$value); - $productList->addCondition($value, $filterDefinition->getField()); + $productList->addCondition($value, $this->getConditionField($field, $isPrecondition)); } return $currentFilter; diff --git a/src/FilterService/FilterType/SearchIndex/SelectClassificationStoreAttributes.php b/src/FilterService/FilterType/SearchIndex/SelectClassificationStoreAttributes.php index 384108ac..97f3ec40 100644 --- a/src/FilterService/FilterType/SearchIndex/SelectClassificationStoreAttributes.php +++ b/src/FilterService/FilterType/SearchIndex/SelectClassificationStoreAttributes.php @@ -133,7 +133,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $currentFilter[$field][$keyId] = $filterValue; $valueField = $nestedPath . '.' . $keyId . '.keyword'; - $productList->addCondition($filterValue, $valueField); + $productList->addCondition($filterValue, $this->getConditionField($valueField, $isPrecondition)); } } } diff --git a/src/FilterService/FilterType/SearchIndex/SelectFromMultiSelect.php b/src/FilterService/FilterType/SearchIndex/SelectFromMultiSelect.php index 46ba944d..56fcee90 100644 --- a/src/FilterService/FilterType/SearchIndex/SelectFromMultiSelect.php +++ b/src/FilterService/FilterType/SearchIndex/SelectFromMultiSelect.php @@ -45,7 +45,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $currentFilter[$field] = $value; if (!empty($value)) { - $productList->addCondition(['term' => ['attributes.' . $field => $value]], $field); + $productList->addCondition( + ['term' => ['attributes.' . $field => $value]], + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/SearchIndex/SelectRelation.php b/src/FilterService/FilterType/SearchIndex/SelectRelation.php index 1ac79e2c..b5816957 100644 --- a/src/FilterService/FilterType/SearchIndex/SelectRelation.php +++ b/src/FilterService/FilterType/SearchIndex/SelectRelation.php @@ -44,7 +44,7 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $currentFilter[$field] = $value; if (!empty($value)) { - $productList->addRelationCondition($field, $value); + $productList->addRelationCondition($this->getConditionField($field, $isPrecondition), $value); } return $currentFilter; diff --git a/src/FilterService/FilterType/Select.php b/src/FilterService/FilterType/Select.php index 3bc922fb..5fc492e8 100644 --- a/src/FilterService/FilterType/Select.php +++ b/src/FilterService/FilterType/Select.php @@ -53,11 +53,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($value)) { $db = Db::get(); - if ($isPrecondition) { - $productList->addCondition('TRIM(`' . $field . '`) = ' . $db->quote($value), 'PRECONDITION_' . $field); - } else { - $productList->addCondition('TRIM(`' . $field . '`) = ' . $db->quote($value), $field); - } + $productList->addCondition( + 'TRIM(`' . $field . '`) = ' . $db->quote($value), + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/SelectCategory.php b/src/FilterService/FilterType/SelectCategory.php index 7cdce8fe..ccb1e4d4 100644 --- a/src/FilterService/FilterType/SelectCategory.php +++ b/src/FilterService/FilterType/SelectCategory.php @@ -78,7 +78,8 @@ public function getFilterValues(AbstractFilterDefinitionType $filterDefinition, */ public function addCondition(AbstractFilterDefinitionType $filterDefinition, ProductListInterface $productList, array $currentFilter, array $params, bool $isPrecondition = false): array { - $value = $params[$filterDefinition->getField()] ?? null; + $field = $this->getField($filterDefinition); + $value = $params[$field] ?? null; $isReload = $params['is_reload'] ?? null; if ($value == AbstractFilterType::EMPTY_STRING) { @@ -90,18 +91,16 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro } } - $currentFilter[$filterDefinition->getField()] = $value; + $currentFilter[$field] = $value; if (!empty($value)) { $value = '%,' . trim((string)$value) . ',%'; $db = Db::get(); - - if ($isPrecondition) { - $productList->addCondition($filterDefinition->getField() . ' LIKE ' . $db->quote($value), 'PRECONDITION_' . $filterDefinition->getField()); - } else { - $productList->addCondition($filterDefinition->getField() . ' LIKE ' . $db->quote($value), $filterDefinition->getField()); - } + $productList->addCondition( + $field . ' LIKE ' . $db->quote($value), + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/SelectFromMultiSelect.php b/src/FilterService/FilterType/SelectFromMultiSelect.php index 9caeecab..1d802a37 100644 --- a/src/FilterService/FilterType/SelectFromMultiSelect.php +++ b/src/FilterService/FilterType/SelectFromMultiSelect.php @@ -73,11 +73,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro if (!empty($value)) { $value = '%' . WorkerInterface::MULTISELECT_DELIMITER . $value . WorkerInterface::MULTISELECT_DELIMITER . '%'; - if ($isPrecondition) { - $productList->addCondition($field . ' LIKE ' . $db->quote($value), 'PRECONDITION_' . $field); - } else { - $productList->addCondition($field . ' LIKE ' . $db->quote($value), $field); - } + $productList->addCondition( + $field . ' LIKE ' . $db->quote($value), + $this->getConditionField($field, $isPrecondition) + ); } return $currentFilter; diff --git a/src/FilterService/FilterType/SelectRelation.php b/src/FilterService/FilterType/SelectRelation.php index 9587c813..73903148 100644 --- a/src/FilterService/FilterType/SelectRelation.php +++ b/src/FilterService/FilterType/SelectRelation.php @@ -105,7 +105,10 @@ public function addCondition(AbstractFilterDefinitionType $filterDefinition, Pro $db = Db::get(); if (!empty($value)) { - $productList->addRelationCondition($field, 'dest = ' . $db->quote($value)); + $productList->addRelationCondition( + $this->getConditionField($field, $isPrecondition), + 'dest = ' . $db->quote($value) + ); } return $currentFilter; diff --git a/src/IndexService/ProductList/DefaultMysql.php b/src/IndexService/ProductList/DefaultMysql.php index 97f540be..e2b28341 100644 --- a/src/IndexService/ProductList/DefaultMysql.php +++ b/src/IndexService/ProductList/DefaultMysql.php @@ -15,6 +15,7 @@ use Pimcore\Bundle\EcommerceFrameworkBundle\CoreExtensions\ObjectData\IndexFieldSelection; use Pimcore\Bundle\EcommerceFrameworkBundle\Factory; +use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\FilterType\AbstractFilterType; use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\Config\MysqlConfigInterface; use Pimcore\Bundle\EcommerceFrameworkBundle\Model\AbstractCategory; use Pimcore\Bundle\EcommerceFrameworkBundle\Model\IndexableInterface; @@ -50,6 +51,8 @@ class DefaultMysql implements ProductListInterface protected LoggerInterface $logger; + private const AND = ' AND '; + public function __construct(MysqlConfigInterface $tenantConfig, LoggerInterface $pimcoreEcommerceSqlLogger) { $this->tenantName = $tenantConfig->getTenantName(); @@ -98,8 +101,11 @@ public function resetCondition(string $fieldname): void public function addRelationCondition(string $fieldname, string|array $condition): void { + $realFieldname = $this->getRealFieldname($fieldname); + $fieldnameCondition = '`fieldname` = ' . $this->quote($realFieldname); + $this->products = null; - $this->relationConditions[$fieldname][] = '`fieldname` = ' . $this->quote($fieldname) . ' AND ' . $condition; + $this->relationConditions[$fieldname][] = $fieldnameCondition . self::AND . $condition; } /** @@ -275,6 +281,19 @@ public function load(): array return $this->products; } + /** + * Returns fieldname without precondition prefix. + */ + protected function getRealFieldname(string $fieldname): string + { + $isPrecondition = str_starts_with($fieldname, AbstractFilterType::PREFIX_PRECONDITION); + if ($isPrecondition) { + return substr($fieldname, strlen(AbstractFilterType::PREFIX_PRECONDITION)); + } + + return $fieldname; + } + /** * First case: no price filtering and no price sorting * @@ -454,18 +473,18 @@ protected function buildQueryFromConditions(bool $excludeConditions = false, ?st $variantMode = $this->getVariantMode(); } - $preCondition = 'active = 1 AND virtualProductActive = 1'; + $preCondition = 'active = 1' . self::AND . 'virtualProductActive = 1'; if ($this->inProductList) { - $preCondition .= ' AND inProductList = 1'; + $preCondition .= self::AND . 'inProductList = 1'; } $tenantCondition = $this->getCurrentTenantConfig()->getCondition(); if ($tenantCondition) { - $preCondition .= ' AND ' . $tenantCondition; + $preCondition .= self::AND . $tenantCondition; } if ($this->getCategory()) { - $preCondition .= " AND parentCategoryIds LIKE '%," . $this->getCategory()->getId() . ",%'"; + $preCondition .= self::AND . "parentCategoryIds LIKE '%," . $this->getCategory()->getId() . ",%'"; } $condition = $preCondition; @@ -476,19 +495,19 @@ protected function buildQueryFromConditions(bool $excludeConditions = false, ?st case ProductListInterface::VARIANT_MODE_INCLUDE_PARENT_OBJECT: //make sure, that only variant objects are considered - $condition .= ' AND a.id != virtualProductId '; + $condition .= self::AND . 'a.id != virtualProductId '; break; case ProductListInterface::VARIANT_MODE_HIDE: - $condition .= " AND `type` != 'variant'"; + $condition .= self::AND . "`type` != 'variant'"; break; case ProductListInterface::VARIANT_MODE_VARIANTS_ONLY: - $condition .= " AND `type` = 'variant'"; + $condition .= self::AND . "`type` = 'variant'"; break; } @@ -496,7 +515,7 @@ protected function buildQueryFromConditions(bool $excludeConditions = false, ?st if (!$excludeConditions) { $userspecific = $this->buildUserspecificConditions($excludedFieldname); if ($userspecific) { - $condition .= ' AND ' . $userspecific; + $condition .= self::AND . $userspecific; } } @@ -513,7 +532,10 @@ protected function buildQueryFromConditions(bool $excludeConditions = false, ?st } } - $condition .= ' AND ' . $this->resource->buildFulltextSearchWhere($this->tenantConfig->getSearchAttributes(), $searchstring); + $condition .= self::AND . $this->resource->buildFulltextSearchWhere( + $this->tenantConfig->getSearchAttributes(), + $searchstring + ); } $this->logger->info('Total Condition: ' . $condition); @@ -528,7 +550,7 @@ protected function buildUserspecificConditions(?string $excludedFieldname = null if ($fieldname !== $excludedFieldname) { foreach ($condArray as $cond) { if ($condition) { - $condition .= ' AND '; + $condition .= self::AND; } $condition .= 'a.id IN (SELECT DISTINCT src FROM ' . $this->getCurrentTenantConfig()->getRelationTablename() . ' WHERE ' . $cond . ')'; @@ -540,7 +562,7 @@ protected function buildUserspecificConditions(?string $excludedFieldname = null if ($fieldname !== $excludedFieldname) { foreach ($condArray as $cond) { if ($condition) { - $condition .= ' AND '; + $condition .= self::AND; } $condition .= is_array($cond)