Написал тут класс для удобной фильтрации по нескольким дополнительным и обычным свойствам, потому как вручную все это оформлять занимает много времени. Поддержки вложенных условий нет. Класс писался в первую очередь для удобства работы с множеством дополнительных свойств. Пример использования класса:
// Объявление
$shop = & singleton ('shop');
$param = array ();
$filterManager = new filterManager ();
// Добавляем фильтры по нескольким дополнительным свойствам
$filterManager->addAdditionalPropertyFilter (200, '=', 'Белый');
$filterManager->addAdditionalPropertyFilter (201, '>', '500');
$filterManager->addAdditionalPropertyFilter (206, '=', 'XXX');
// Добавляем фильтры по обычным свойствам
$filterManager->addStandartPropertyFilter ('shop_items_catalog_price', '>=', 400);
// Применяем фильтры для переменной $param
$filterManager->applyFilters ($param);
// Выводим элементы
$shop->ShowShop (1, 'МагазинКаталогТоваров', $param);
Код самого класса:
/**
* Управление фильтрами
*/
class FilterManager
{
/**
* Фильтры по стандартным параметрам
*/
private $standart_prop_filters = array ();
/**
* Фильтры по доп. параметрам
*/
private $additional_prop_filters = array ();
/**
* Добавление фильтра по обычному параметру
* @param Имя поля
* @param Условие (=, >, < и т.д.)
* @param Сравниваемое значение
*/
public function addStandartPropertyFilter ($name, $if, $value)
{
$this->standart_prop_filters[] = array (
'type' => 0,
'prefix' => 'and',
'name' => $name,
'if' => $if,
'value' => $value,
'sufix' => '',
);
}
/**
* Добавление фильтра по доп. параметру
* @param ID доп. параметра
* @param Условие (=, >, < и т.д.)
* @param Сравниваемое значение
*/
public function addAdditionalPropertyFilter ($property_id, $if = '=', $value = 1)
{
$this->additional_prop_filters[] = array (
'type' => 1,
'property_id' => $property_id,
'if' => $if,
'value' => $value,
);
}
/**
* Применение фильтров.
* @param Переменная $param, куда следует записать все условия
*/
public function applyFilters (&$param)
{
/* Фильтры по дополнительным параметрам */
$count = count ($this->additional_prop_filters);
if ($count == 1)
{
$this->additional_prop_filters[0]['prefix'] = 'and';
$this->additional_prop_filters[0]['sufix'] = '';
} else if ($count > 0) {
for ($i = 0; $i < $count; $i++)
{
if ($i == 0)
$this->additional_prop_filters[$i]['prefix'] = 'and (';
else
$this->additional_prop_filters[$i]['prefix'] = 'or';
if ($i == $count - 1)
$this->additional_prop_filters[$i]['sufix'] = ')';
else
$this->additional_prop_filters[$i]['sufix'] = '';
}
$param['sql_group_by'] = "GROUP BY shop_items_catalog_table.shop_items_catalog_item_id";
$param['sql_having'] = "HAVING COUNT(shop_properties_items_table.shop_properties_items_id) = ".$count;
}
if (count ($this->standart_prop_filters) > 0 || count ($this->additional_prop_filters) > 0)
$param['select'] = array_merge ($this->standart_prop_filters, $this->additional_prop_filters);
}
}