Фильтр/поиск для InstantMaps первой ветки

+11
2.24K
Сделал для себя какой мне нужно поиск/фильтр для InstantMaps в InstantCMS v1.9, стандартный фильтр InstantMaps отключил, чтобы они не мешали друг другу. Изменения вносятся в 2 файла.
В \templates\_default_\components\com_inmaps_map.tpl и \components\maps\frontend.php

Если кому интересно то порядок действий такой.

1. Файл \templates\_default_\components\com_inmaps_map.tpl

вверху после кода
  1. <!-- MAP -->
  2. <div id="map_wrapper">
вставляем форму поиска по нужным полям или характеристикам.
здесь у меня поиск по трём полям: название объекта, улица и такая характеристика как округ/район,
для себя можете сделать и другие, хоть описание объекта, мэтатеги, контакты и пр.и любые характеристики.

Вставляем:
  1. <form action="/maps/{$root_cat.seolink}" method="post">
  2. <table cellpadding="2" cellspacing="0" width="100%">
  3. <tbody><tr>
  4. <td style="padding-top:8px;"><strong>Район:</strong></td>
  5. <td>
  6. <select name="srch_rayon">
  7. <option {if $srch_rayon == '(все)'} selected="selected" {/if} value="">(все)</option>
  8. <option {if $srch_rayon == 'ЦАО'} selected="selected" {/if} value="ЦАО">ЦАО</option>
  9. <option {if $srch_rayon == 'ЗАО'} selected="selected" {/if} value="ЗАО">ЗАО</option>
  10. <option {if $srch_rayon == 'САО'} selected="selected" {/if} value="САО">САО</option>
  11. <option {if $srch_rayon == 'ЮАО'} selected="selected" {/if} value="ЮАО">ЮАО</option>
  12. <option {if $srch_rayon == 'ВАО'} selected="selected" {/if} value="ВАО">ВАО</option>
  13. </select>
  14. </td>
  15. <td style="padding-top:8px;"><strong>Название организации:</strong></td>
  16. <td><input type="text" name="srch_name" value="{$srch_name}" /></td>
  17. <td style="padding-top:8px;"><strong>Адрес(улица):</strong></td>
  18. <td><input type="text" name="srch_street" value="{$srch_street}" /></td>
  19. <td> <input value="Найти" type="submit"></td>
  20. </tr></tbody></table>
  21. </form>
2. Теперь переходим к файлу \www\components\maps\frontend.php
вверху после строчки
  1. //получаем входные параметры
вставляем, дописываем нужные нам параметры поиска:
  1. //получаем данные с формы поиска обьекта
  2. if(!$srch_rayon) $srch_rayon = $inCore->request('srch_rayon', 'str', ''); // округ
  3. if(!$srch_name) $srch_name = $inCore->request('srch_name', 'str', ''); // название объекта
  4. //$srch_name = urldecode($srch_name);
  5. if(!$srch_street) $srch_street = $inCore->request('srch_street', 'str', ''); // адрес: улица
  6. //$srch_street = urldecode($srch_street);
  7.  
находим строчку
  1. // ------- получаем значения фильтров -----------------
и после неё вставляем код:
  1. if($srch_rayon) $model->whereCharIs(37, $srch_rayon);
  2. else {
и перед следующим разделом
  1. //получаем хар-ки категории
вставляем
  1. }
Тут нужны пояснения.
В админке мапса мы задали характеристику "Округ" и привязали её ко всем объектам.
Тип характеристики указали Набор опций и в "возможные значения" перечислили все возможные округа, у нас это ЦАО, САО, ЗАО, ВАО, ЮАО.
Множественный выбор в фильтре отключили.
Соответственно у нас в админке теперь при добавлении/редактировании объектов появилась возможность прописать каждому объекту свой округ или даже несколько округов. Наведя курсор на этот фильтр в админке в "Характеристики объектов" мы увидим номер этого фильтра, его item_id=
у меня он 37, вот его мы и пропишем в нашем поиске.
То есть выше мы отключаем стандартный фильтр, если задали поиск по одной из характеристик фильтра и указываем номер фильтра и какая переменная за него у нас будет отвечать.

находим строчку:
  1. $model->where('i.published=1');
и перед ней вставляем:
  1. if($srch_name) $model->where('i.title like \'%'.$srch_name.'%\''); // найти имя объекта
  2. if($srch_street) $model->where('m.addr_street like \'%'.$srch_street.'%\''); // найти улицу объекта
  3.  
это мы добавляем в sql-код поиск в базе данных нужный полей.

теперь если объектов больше чем на одну страницу, нам нужно сформировать пангинацию,
поэтому после строчки
  1. if ($filter_str){ $pages_url .= '/' . urlencode($filter_str); }
и перед строчкой
  1. $pagebar = cmsPage::getPagebar($total, $page, $perpage, $pages_url);
вставляем код
  1.  
  2. if($srch_name) { $pages_url .= '?srch_name=' . urlencode($srch_name); }
  3. if($srch_street && $srch_name) { $pages_url .= '&srch_street=' . urlencode($srch_street); }
  4. else if ($srch_street) { $pages_url .= '?srch_street=' . urlencode($srch_street); }
  5. if( ($srch_rayon && $srch_name) || ($srch_rayon && $srch_street)) { $pages_url .= '&srch_rayon=' . urlencode($srch_rayon); }
  6. else if($srch_rayon) { $pages_url .= '?srch_rayon=' . urlencode($srch_rayon); }
наверняка этот код можно упростить, но я с регулярными выражениями не знаком.

И наконец для того чтобы передать в шаблон переменные,
перед строчкой
  1. $smarty->display($root_cat['tpl']);
вставляем код
  1. $smarty->assign('srch_name', $srch_name);
  2. $smarty->assign('srch_street', $srch_street);
  3. $smarty->assign('srch_rayon', $srch_rayon);
Не забываем перед внесением изменений сделать копии изменяемых файлов.
Таким образом по аналогии можно сделать любой поиск по полям объекта и его характеристикам.
Да, и не знаю нужно там для них использовать функции urlencode и urldecode...
А ещё, он работает только в какой-либо категории, на главной мапса работать не будет,
тут его или убрать с главной нужно или смотреть как задать чтобы работал и с главной,
этим пока не заморачивался.

Еще дополню данный фильтр/поиск.
Чтобы убрать поиск с главной мапса, так как там он не ищет, дописываем пару строк.
В файле \templates\_default_\components\com_inmaps_map.tpl
после
  1. <!-- MAP -->
  2. <div id="map_wrapper">
вставляем строчку
  1. {if $root_cat.seolink !== ''}
после строчки
  1. </form>
вставляем
  1. {/if}
Всё. Быстрый поиск по объектам мапса готов.
Ищет по названию или части названия объекта/организации, по адресу(улице) или части названия улицы объекта и по округу/району объекта или иной характеристике, которую мы включим в поиск.
У меня это выглядит вот так:
Иллюстрация
над картой видна строчка с полями для поиска: с выпадающим списком значений(район), название организации, улицы, но можно сделать по любым полям (!!!), думаю для посетителей сайта такой быстрый поиск всегда удобней.
+3
Raiden Raiden 8 лет назад #
Оффтоп

Еще от автора

Начинаем создавать календарь событий в InstantCMS 1.9
Сайт у меня на Instant старой версии 1.9, поэтому не знаю, подойдёт ли то что я сделал, для других версий. Итак - нужен календарь предстоящих событий.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.