Класс по фильтрации по нескольким доп. свойствам в интернет-магазине.

#
Класс по фильтрации по нескольким доп. свойствам в интернет-магазине.
Написал тут класс для удобной фильтрации по нескольким дополнительным и обычным свойствам, потому как вручную все это оформлять занимает много времени. Поддержки вложенных условий нет. Класс писался в первую очередь для удобства работы с множеством дополнительных свойств. Пример использования класса:


// Объявление
$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);
    }
  }
#
Re: Класс по фильтрации по нескольким доп. свойствам в интернет-магазине.
В паре с http://www.auris-studio.ru/blog/filtr-po-modifikatsijam-v-hostcms/ получается отличное решение для магазина.
Авторизация