protected function buildCriteriaForTypeAttributes(array $typeSearchAttributes)
{
$criteria = new CDbCriteria();
$criteria->params = [];
$i = 0;
foreach ($typeSearchAttributes as $attribute => $params) {
if (empty($params['value'])) {
continue;
}
$alias = "attributes_values_{$i}";
$criteria->join .= " JOIN {{store_product_attribute_value}} {$alias} ON t.id = {$alias}.product_id ";
//@TODO подумать как улучшить
if (is_array($params['value'])) {
if (isset($params['value']['from'], $params['value']['to'])) {
$between = new CDbCriteria();
$between->addBetweenCondition("{$alias}." . $params['column'], $params['value']['from'], $params['value']['to']);
$between->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
$between->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
$criteria->mergeWith($between);
} elseif (isset($params['value']['from']) && !isset($params['value']['to'])) {
$between = new CDbCriteria();
$between->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
$between->addCondition("{$alias}.{$params['column']} >= :attr_{$i}");
$between->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
$between->params[":attr_{$i}"] = $params['value']['from'];
$criteria->mergeWith($between);
} elseif (isset($params['value']['to']) && !isset($params['value']['from'])) {
$between = new CDbCriteria();
$between->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
$between->addCondition("{$alias}.{$params['column']} <= :attr_{$i}");
$between->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
$between->params[":attr_{$i}"] = $params['value']['to'];
$criteria->mergeWith($between);
} else {
$in = new CDbCriteria();
$in->addInCondition("{$alias}." . $params['column'], $params['value']);
$criteria->mergeWith($in);
}
} else {
$condition = new CDbCriteria();
$condition->addCondition("{$alias}.attribute_id = :attributeId_{$i}");
$condition->params[":attributeId_{$i}"] = (int) $params['attribute_id'];
$condition->addColumnCondition(["{$alias}." . $params['column'] => $params['value']]);
$criteria->mergeWith($condition);
}
$i++;
}
return $criteria;
}