-
Notifications
You must be signed in to change notification settings - Fork 15
Description
Доброе утро!
Работаю с движком Eximus. И недавно исправлял баг Множественного выбора. Вот описание исправленного бага из трекера багов и задач Eximus'а:
После выбора множественных атрибутов, движок ищет все товары по критерию. Однако, в расширении EEavBehavior было немного другое трактование условия множественного выбора. Если пришел массив со значениями для одного атрибута, то EEavBehavior делал составной JOIN, в котором по всем значениям из массива делал склейку - т.е. это даже не точное соответствие товара всем значениям при перечислении через AND, а сложный запрос с пропорциональным количеством JOIN'ов, в каждом из которых идет проверка на соответствие.
Решение: если в EEavBehavior приходит массив со значениям для атрибута, то сделал проверку на вхождение в массив через IN.
Вот изменение в функции protected function getFindByEavAttributesCriteria($attributes){:
Было:
foreach ($values as $value) {
$value = $conn->quoteValue($value);
$criteria->join .= "\nJOIN {$this->tableName} eavb$i"
. "\nON t.{$pk} = eavb$i.{$this->entityField}"
. "\nAND eavb$i.{$this->attributeField} = $attribute"
. "\nAND eavb$i.{$this->valueField} = $value";
$i++;
}
Стало:
$valueTmpArr = array();
foreach ($values as $value) {
$valueTmpArr[] = $conn->quoteValue($value);
}
$valueInCondition = implode(',',$valueTmpArr);
$criteria->join .= "\nJOIN {$this->tableName} eavb$i"
. "\nON t.{$pk} = eavb$i.{$this->entityField}"
. "\nAND eavb$i.{$this->attributeField} = $attribute"
. "\nAND eavb$i.{$this->valueField} IN ($valueInCondition)";
$i++;
Правильно ли я понял, что именно здесь нужно было исправить и что здесь планировался такой критерий? :)