ProjectFilter.class.php 10.4 KB
<?php

namespace SH;

class ProjectFilter
{
    private $params;
    private $filterData = array(

        'section' => array(
            'name' => 'Категории проектов',
            'items' => array(
                'all' => array(
                    'name' => 'все',
                    'filter' => array(),                    
                    'url' => '/projects',
                    'props' => array(),
                ),  
                'house' => array(
                    'name' => 'дома',
                    'filter' => array('PROPERTY_PROJECT_SECTION' => 4),//Дом
                    'props' => array('square', 'floors', 'bedrooms' , 'combo'),
                    'url' => '/projects/doma-iz-kleenogo-brusa/',
                ),                            
                'bathhouse' => array(
                    'name' => 'бани',
                    'filter' => array('PROPERTY_PROJECT_SECTION' => 5),
                    'props' => array('bathhouse-floors'),
                    'url' => '/projects/bani-iz-kleenogo-brusa/',
                ),
                'misc' => array(
                    'name' => 'разное',
                    'filter' => array('PROPERTY_PROJECT_SECTION' => 6),
                    'props' => array('misc-type'),
                    'url' => '/projects/raznye-proekty/',
                ),                
            ),
        ),

        'square' => array(
            'name' => 'Площадь',
            'items' => array(
                'less-200' => array(
                    'name' => 'до 200 м<sup>2</sup>',
                    'filter' => array('<PROPERTY_SQUARE' => 200),
                ),
                '200-300' => array(
                    'name' => '200 - 300 м<sup>2</sup>',
                    'filter' => array('>=PROPERTY_SQUARE' => 200, '<PROPERTY_SQUARE' => 300),
                ),
                '300-500' => array(
                    'name' => '300 - 500 м<sup>2</sup>',
                    'filter' => array('>=PROPERTY_SQUARE' => 300, '<PROPERTY_SQUARE' => 500),
                ),
                'more-500' => array(
                    'name' => 'более 500 м<sup>2</sup>',
                    'filter' => array('>=PROPERTY_SQUARE' => 500),
                ),
            ),
        ),

        'floors' => array(
            'name' => 'Этажи',
            'items' => array(
                '1' => array(
                    'name' => '1 этаж',
                    'filter' => array('PROPERTY_FLOOR_COUNT' => 1),
                ),
                '2' => array(
                    'name' => '2 этажа',
                    'filter' => array('PROPERTY_FLOOR_COUNT' => 2),
                ),
                '3' => array(
                    'name' => '3 этажа',
                    'filter' => array('>=PROPERTY_FLOOR_COUNT' => 3),
                ),
            ),
        ),

        'bedrooms' => array(
            'name' => 'Спальни',
            'items' => array(
                '1' => array(
                    'name' => '1 спальня',
                    'filter' => array('=PROPERTY_BEDROOM_COUNT' => 1),
                ),
                '2' => array(
                    'name' => '2 спальни',
                    'filter' => array('=PROPERTY_BEDROOM_COUNT' => 2),
                ),
                '3' => array(
                    'name' => '3 спальни',
                    'filter' => array('=PROPERTY_BEDROOM_COUNT' => 3),
                ),
                'more-4' => array(
                    'name' => 'более 4',
                    'filter' => array('>=PROPERTY_BEDROOM_COUNT' => 4),
                ),
            ),
        ),

        'bathhouse-floors' => array(
            'name' => 'Этажи',
            'items' => array(
                '1' => array(
                    'name' => '1 этаж',
                    'filter' => array('<=PROPERTY_FLOOR_COUNT' => 1),
                ),
                '2' => array(
                    'name' => '2 этажа',
                    'filter' => array('>=PROPERTY_FLOOR_COUNT' => 2),
                ),
            ),
        ),

        'combo' => array(
            'name' => 'Комбинированные дома',
            'items' => array(
                'combo' => array(
                    'name' => 'Комбинированные дома',
                    'filter' => array('<=PROPERTY_COMBINE_TYPE' => 21),
                ),
            ),
        ),
/*        'bathhouse-square' => array(
            'name' => 'Площадь',
            'items' => array(
                'less-200' => array(
                    'name' => 'до 200 м<sup>2</sup>',
                    'filter' => array('<PROPERTY_SQUARE' => 200),
                ),
                '200-300' => array(
                    'name' => '200 - 300 м<sup>2</sup>',
                    'filter' => array('>=PROPERTY_SQUARE' => 200, '<PROPERTY_SQUARE' => 300),
                ),
                '300-500' => array(
                    'name' => '300 - 500 м<sup>2</sup>',
                    'filter' => array('>=PROPERTY_SQUARE' => 300, '<PROPERTY_SQUARE' => 500),
                ),
                'more-500' => array(
                    'name' => 'более 500 м<sup>2</sup>',
                    'filter' => array('>=PROPERTY_SQUARE' => 500),
                ),
            ),
        ),*/

        'misc-type' => array(
            'name' => 'Тип проекта',
            'items' => array(
                'public' => array(
                    'name' => 'Здания общественного назначения',
                    'filter' => array('PROPERTY_PROJECT_TYPE' => 2),
                ),
                'small' => array(
                    'name' => 'Малые архитектурные формы',
                    'filter' => array('PROPERTY_PROJECT_TYPE' => 3),
                ),
                'reqons' => array(
                    'name' => 'Реконструкции',
                    'filter' => array('PROPERTY_PROJECT_TYPE' => 19),
                ),
            ),
        )

    );

    function getFilterData($key = false)
    {
        return $key ? $this->filterData[$key] : $this->filterData;
    }

    function getAvailableFilters()
    {
        return array_keys($this->filterData);
    }

    function getBitrixFilter()
    {
        $arFilter = array();

        foreach ($this->filterData['section']['items'] as $sectionCode => $section) {
            if (!$section['selected']) continue;

            $arFilter[] = array($section['filter']);

            foreach ($section['props'] as $itemKey) {
                foreach ($this->filterData[$itemKey]['items'] as $item) {
                    if($item['selected']) {
                        $arFilter[$itemKey][] = $item['filter'];
                    }
                }
            }

            $arFilterTmp = $arFilter;
            $arFilter = array();

            foreach($arFilterTmp as $filterItem) {
                if(count($filterItem) > 1) {
                    $arFilter[] = array_merge(array('LOGIC' => 'OR'), $filterItem);
                } else {
                    $arFilter[] = reset($filterItem);
                }
            }

            break;
        }

        return $arFilter;
    }

    static function getInstance($params = false)
    {
        static $instance;
        if ($params || is_null($instance)) {
            if($params) {
                parse_str($params, $params);
            } else {
                $params = $_REQUEST;
            }

            $instance = new self($params);

        }
        return $instance;
    }

    private function __construct($params)
    {
        $this->params = $params;

        // формирование выдачи по GET запросу 

        //var_dump($_GET['section']);

        if (count($_GET['section']) == 1 and !empty($_GET['section'])) {               

            foreach ($_GET as $key => $value) {

                    if ($key == 'section') {

                        //$this->params['section']["house"] = $this->params['section']["all"] = $this->params['section']["bathhouse"] = $this->params['section']["misc"]  = '0';
                    
                        $parent = key($value);

                        $parent ? $this->params['section'][$parent] = '1' : $this->params['section'][$parent] = '0';

                        if ( !empty($_GET[$key][$parent])) {
                            
                            foreach ($_GET[$key][$parent] as $in_key => $in_value) {
                                
                                $in_value = explode(':', $in_value);

                                $in_key = $in_value[0];

                                $in_value = end($in_value);

                                if ($in_value) {

                                    $this->params[$in_key][$in_value] = '1';

                                }
                            
                            }
                        }

                    }                

            }

        }

       

        $this->setSelectedItems();
        $this->setSelectedSection();
    }

    private function setSelectedItems()
    {
        foreach ($this->filterData as $key => $filterData) {
            foreach ($filterData['items'] as $code => $item) {
                $this->filterData[$key]['selected'] =
                $this->filterData[$key]['items'][$code]['selected'] = !empty($this->params[$key][$code]);
            }
        }
    }

    private function setSelectedSection()
    {
        $selected = false;

        foreach ($this->filterData['section']['items'] as $sectionCode => $section) {
            if($section['selected']) {
                $selected = true;
                break;
            }
        }

        if(!$selected) {
            foreach ($this->filterData['section']['items'] as $sectionCode => $section) {
                foreach ($section['props'] as $itemKey) {
                    if (!$this->filterData[$itemKey]['selected']) continue;

                    $selected = true;
                    $this->filterData['section']['items'][$sectionCode]['selected'] = true;
                    break 1;
                }
            }
        }

        if (!$selected) {
            foreach ($this->filterData['section']['items'] as $sectionCode => $section) {
                $this->filterData['section']['items'][$sectionCode]['selected'] = true;
                break;
            }
        }
    }
}