iserg

Доработка главного меню в шаблоне Realia

Recommended Posts

Здравствуйте,

1. подскажите пожалуйста как вывести в главном меню первым пунктом выпадающий список-меню со всеми городами (название пункта: Все города). А когда человек выбрал в этом выпадающем меню город и перешел на его страничку то выводить название города вместо Все города.

Т.е. главное меню будет приобретать такой вид к примеру Алушта ↓ | Аренда посуточная ↓ | Аренда долгосрочная ↓ | Продажа ↓

Желательно чтобы было также разделение на регионы в этом пункте.

- Все города 

--- Большая Алушта
------- Алушта
------- Утес

--- Большая Ялта
------- Ялта
------- Ливадия

Т.е. главный пункт - выпадающие подпункты Регион1 Регион2... из которых выпадают пункты городов - меню третьего уровня.

2. еще когда юзер выбрал город - тогда для пунктов меню Аренда посуточная (выпадающие пункты 1кк, 2кк...), Аренда долгосрочная и пр. мне нужно чтобы добавлялся в url к пунктам меню само id выбранного города. К примеру чтобы url приобретал такой вид: /arenda-posutochno/1-komnatnye/?region_id=8&city_id=3
Сейчас получается когда к примеру в блоки фильтрации человек выбрал город (url приобрел вид /?city_id=3), а затем в главном меню выбрал Аренда посуточная - то параметры города при переходе теряются и опять выводится по всем городам, опять ему нужно в блоке Фильтр выставлять регион и город.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Решение компромиссное нашел тут - только переделал немного по-другому.

Добавил города через админку - Контент - Меню (/admin/index.php?action=menu) - создал первый главный пункт Города (url его #) и добавил подпункты с названием городов (их url ?city_id=X) где X id-шник города.

Для этого как писали на форуме отредактировал /template/frontend/realia/main/main.php

заменил 

  1. private function getTemplateMenu($menues=array()){ . . . });

на

private function getTemplateMenu($menues=array()){
    //remove comment from next string for testing
    //unset($_SESSION['_site_cache']['nave_menu']);
            $DBC=DBC::getInstance();
   
        require_once(SITEBILL_DOCUMENT_ROOT.'/template/frontend/realia/main/realia_menu_decorator.php');
        require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/admin/structure/structure_implements.php');
        require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/admin/structure/structure_manager.php');
        $SM=new Structure_Manager();
        $structure=$SM->loadCategoryStructure();
       
        $DBC=DBC::getInstance();
       
        $add_points=array();
        $additional_menues=array();
        $ids=array();
               
        if(!empty($menues)){
            foreach($menues as $m){
                if($m['id']==0){
                    $m['href']=$this->getServerFullUrl().'/';
                }else{
                    if(isset($_SESSION['_site_cache']['nave_menu'][$m['id']])){
                        $add_points[$m['id']]=$_SESSION['_site_cache']['nave_menu'][$m['id']];
                    }else{
                        $ids[]=$m['id'];
                    }
                }
               
               
                $additional_menues[$m['id']]=$m;
            }
           
            if(!empty($ids)){
                $query='SELECT * FROM '.DB_PREFIX.'_menu_structure WHERE menu_id IN ('.implode(',', $ids).') ORDER BY sort_order';
                $stmt=$DBC->query($query);
                if($stmt){
                    while($ar=$DBC->fetch($stmt)){
                        $ar['url']=trim($ar['url']);
                        if($ar['url']!='' && 0!==strpos($ar['url'], 'http:')){
                            $ar['url'] = trim($ar['url'], '/');
                        }
                        $add_points[$ar['menu_id']][]=$ar;
                        $_SESSION['_site_cache']['nave_menu'][$ar['menu_id']]=$add_points[$ar['menu_id']];
                    }
                }
            }
           
        }
       
        if(!empty($additional_menues)){
            $behind=array();
            $after=array();
            foreach ($additional_menues as $k=>$ad_menu){
                if($ad_menu['position']=='behind'){
                    $behind[]=$ad_menu;
                }else{
                    $after[]=$ad_menu;
                }
               
               
            }
            if(!empty($behind)){
                $behind=array_reverse($behind);
            }
            $additional_menues=array_merge($behind, $after);
            foreach ($additional_menues as $ad_menu){
                $k=$ad_menu['id'];
                $indexes=array_keys($structure['catalog']);
                sort($indexes);
                $last_index=end($indexes)+1;
                if($ad_menu['position']=='behind'){
                    array_unshift($structure['childs'][0], $last_index);
                }else{
                    $structure['childs'][0][]=$last_index;
                }
                if(isset($ad_menu['href']) && $ad_menu['href']!=''){
                    $href=trim($ad_menu['href'], '/');
                }else{
                    $href='#';
                }
                $structure['catalog'][$last_index]=array('url'=>$href, 'name'=>$ad_menu['title']);
               
                if(isset($add_points[$k]) && !empty($add_points[$k])){
                    $current_index=$last_index+1;
                    foreach ($add_points[$k] as $ad_point){
                        $structure['catalog'][$current_index]=array('url'=>$ad_point['url'], 'name'=>$ad_point['name']);
                        $structure['childs'][$last_index][]=$current_index;
                        $current_index++;
                    }
                }
            }
           
        }
       
        return Realia_Menu_Decorator::getMenu($structure);
           
    }

и

$this->template->assert('navmenu', $this->getTemplateMenu());

на

$menues=array(array('id'=>24,'title'=>'Города','position'=>'behind','href'=>'#')); /*наш набор пунктов*/$this->template->assert('navmenu', $this->getTemplateMenu($menues)); /*тут мы его передали в декоратор*/

Ну корявенько - ну хоть как-то.

Спасибо за вменяемый форум!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 17.05.2016 в 18:38, iserg сказал:

вот это я озадачил :):

Не уверен, что кто-то озадачился :) А с другой стороны, зачем такая сложная подчиненность справочников? Захочу у вас на сайте найти предложения поиском по Алуште, мне надо догадаться, что искать надо в Большой Алуште? Да я название такое впервые вижу, хорошо что там слово Алушта присутствует... Думаю, что ваша примочка больше во вред чем на пользу посетителям.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так захотел клиент.

Но вообще когда в фильтре в сайдбаре выбрал город, отфильтровал, а затем кликнул в главном меню тип недвижимости, перешел и заново в фильтре нужно выбирать город, я считаю, что главное меню может и «подыграть» пользователю не сбрасывая настройки города в фильтре - это правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас