Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 1 Гость просматривают эту тему.

*

rauschen

  • *
  • 22
  • +1/-0
    • Просмотр профиля
Здравствуйте, форумчане.

Помогите, пожалуйста, реализовать такую задачку.

Есть каталог многоквартирных домов (объектов недвижимости; дом является разделом каталога). У домов есть подразделы - объекты каталога - квартиры. У квартир есть характеристики "цена от" и "цена до" за квадратный метр.


Когда я нахожусь в конкретном доме, мне нужно сделать выборку похожих домов по цене. То есть выбрать дома из каталога, квартиры которых похожи по стоимости на квартиры текущего дома.

Делаю я все это с помощью класса selector, но слабая документация по нему, не позволяет продвинуться.

Привожу пример выборки:

public function getRelatedOffers($element_id, $metro, $price) {
        $sel = new selector('pages');
        $sel->types('object-type')->id(853); // house type
        $sel->where('hierarchy')->page('/object-info/')->childs(1);
        if(isset($metro)){
           $sel->where("metro")->like($metro);
        }
       
       
        if(isset($price)){
           $sel->where('hierarchy')->page('/object-info/')->childs(1, $sel->where("cena_ot")->between(1000, 5000));
        }

       
        $sel->order('name')->asc();
        $sel->limit(0, 6);

}

Собственно не могу понять как сделать запрос, если передан параметр price.

Заранее благодарю за любые мысли по этому поводу.

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Совсем недавно на форуме была тема, где товарищ делал выборку по диапазону цен для гостиниц. Поищите, задача похожая была.

*

rauschen

  • *
  • 22
  • +1/-0
    • Просмотр профиля
Спасибо за подсказку, Владимир. Но так и не нашел этой темы.

В итоге родилось у меня следующее решение. Очень простое кстати.

Нужно было искать не дом с квартирами, а квартиры удовлетворяющие условиям и брать их родителя (то есть дом) для дальнейшей работы.

Привожу листинг кода.

public function getRelatedOffers($element_id, $metro, $price) {
   
        $sel = new selector('pages');
        if(isset($price) && $price != ""){
        $sel->types('object-type')->id(860);
        $sel->where('hierarchy')->page('/object-info/')->childs(2);
        }else{
        $sel->types('object-type')->id(853);
        $sel->where('hierarchy')->page('/object-info/')->childs(1);
        }
       
 
       
        $hierarchy = umiHierarchy::getInstance();
       
        if(isset($price) && $price != ""){//Если передан параметр price, то мы ищем самые дешевые квартиры в домах по заданному диапазону цен
       
        $flats = $hierarchy->getChilds($element_id);
       
        foreach ($flats as $key => $value){
$prices_and_names[] = array($hierarchy->getElement($key)->getValue('cena_ot'), $hierarchy->getElement($key)->getName());
}

$price = min($prices_and_names);
       
        $min_price = $price[0] * 0.85;
        $max_price = $price[0] * 1.15;
       
        $sel->where("cena_ot")->between($min_price, $max_price);
        $sel->where("name")->equals($price[1]);
        }
       
        $sel->order('rand');
        $sel->limit(0, 6);



        foreach($sel->result as $house) {
       
       
        if(isset($price) && $price != ""){//Если передан параметр price, то получаем экземпляр родителя страницы (т.е. получаем id дома)
        $house = umiHierarchy::getInstance()->getElement(umiHierarchy::getInstance()->getElement($house->id)->getParentId());
        }

//далее делаем что нам нужно с каждым элементом
...

         }
}

Конечно правильнее было бы написать прямой sql запрос, чтобы увеличить быстродействие. Но так как я не умею писать запросы, реализовал выборку средствами api.
« Последнее редактирование: 04 Мая 2012, 11:35:40 от rauschen »

*

KTI

  • **
  • 72
  • +1/-0
    • Просмотр профиля
берите код в теги code, т.е. {code} какой-то код {/code}
только не круглые скобки, а квадратные, смотрится в разы читабельнее
На счет запросов, во первых запрос можно посмотреть. Добавьте в код:
$sql_query_string=$sel ->query();
return $sql_query_string;
и увидите свой запрос, только не рекомендуется пользоваться прямыми запросами, могут возникнуть проблемы при обновлении, структуру таблиц могут изменить в любой момент.
А времени вы много не сэкономите, запрос выполняется гораздо дольше, чем его формирование

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля

*

rauschen

  • *
  • 22
  • +1/-0
    • Просмотр профиля
KTI, ну как скажете :) Спасибо.

Vladimir, там про usel идет речь, а у меня про selector.