Клуб API Карт

Собственный поиск

ivan-zykov
6 октября 2016, 11:31

Добрый день. Хочу сделать свой собственный поиск по объектам, но искать нужно не по объектам на карте, а по запросу к другому скрипту. Пишем текст - отправляем строку скрипту, скрипт возвращает ответ в JSON, мы этот ответ обрабатываем и выводим на карте и заполняем список результатов.

В песочнице есть пример поиска по своим объектам на карте: https://tech.yandex.ru/maps/jsbox/2.1/custom_search

Так же в песочнице есть собственное отображение результатов: https://tech.yandex.ru/maps/jsbox/2.1/custom_search_results

Однако в документации API (https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IGeocodeProvider-docpage/) не описана даже возможность создания своего собственного провайдера.

Как мне реализовать поиск по запросу к другому скрипту?

Кстати результаты лучше выводить через SuggestView, если надо темизировать их по-своему?

7 комментариев
Подписаться на комментарии к посту
В общем, я справился сам путём создания своего provider. Но осталось много вопросов. Вот мой код:


https://jsfiddle.net/5cv86LxL/


У меня есть вопросы, и я очень надеюсь, что кто-то мне поможет с ними:
1) Как сделать подгрузку результатов? Выводить их по 10 или 20 и показывать ссылку "Ещё" или что-то типа того. Сейчас у меня выводятся все результаты, это не всегда круто.
2) Скрипт для поиска присылает в результатах только координаты, заголовок и описание, метки на карте уже будут, поэтому я поставил noPlacemark: true. Однако метки на карте добавляются через RemoteObjectManager, и мне надо при выборе результата не только центровать карту, но и открывать балун. Как мне эмулировать клик по метке, добавленной через ROM? При том, что в момент перемещения карты по координатам из результатов, метка ещё может не подгрузиться.
3) Как в метаинформации ответа используются results: и skip:, если показываются всё-равно все результаты? Мне кажется, у меня чего-то не хватает в коде... Помогите с этим.
4) Как сделать, чтобы при клике по одному из результатов список (поисковые подсказки?) не закрывался?
5) При клике по резльтату карта центрируется сама и выбирается максимальный масштаб. Как изменить масштаб при центрировании по результату? Скажем, на 14-ый.
Буду благодарен за ответы!
ivan-zykov,
, Поэкспериментировал с балуном объектов ROM, пытаюсь сделать подгрузку данных в балун через ajax. Пошёл путём, каким советовал димик, то есть в Layout. Вроде бы всё должно работать, но почему-то после перестройки макета html-код, переданный в properties, отображается как простой текст: https://jsfiddle.net/huspzun2/


В чём же дело?
ivan-zykov,
Дом разметку лучше всего хранить в шаблоне макета (для этого и нужен шаблон - отделить данные от представления). Если вы все же зачем-то хотите передавать разметку в данных, нужно использовать фильтр "raw" для её вывода
{{properties.contentHeader|raw}}
dimik,
Хорошо, спасибо, не стал юзать raw, перенёс всю разметку в шаблон.
Ещё осталось несколько вопросов. Буду рад ответу.


1) Как мне применить hideIcon: false для балунов объектов ROM? не хочу, чтобы метка скрывалась.
2) Для того, чтобы открывать балун объектов ROM, я слушаю resultshow. При показе выбранного результата поиска проверяю, загружен ли объект с таким id в ROM и открываю его. Для открытия балуна объекта, который ещё не загружен, я при загрузке объектов ROM проверяю, выбран ли он в настоящее время в результатах поиска через searchControl.state.get('currentIndex'). Правильный ли это подход или есть решение лучше?


Далее вопросы уже посылал, они ещё актуальны:
3) Как сделать подгрузку результатов? Выводить их по 10 или 20 и показывать ссылку "Ещё" или что-то типа того. Сейчас у меня выводятся все результаты, это не всегда круто.
4) Как в метаинформации ответа используются results: и skip:, если показываются всё-равно все результаты? Мне кажется, у меня чего-то не хватает в коде... Помогите с этим.
5) Как сделать, чтобы при клике по одному из результатов, список результатов не закрывался?
6) При клике по результату карта центрируется сама и выбирается максимальный масштаб. Как изменить масштаб при центрировании по результату? Скажем, на 14-ый.


С уважением.
ivan-zykov,



1) Опция называется hideIconOnBalloonOpen
Можно добавить в OM при создании с префиксом "geoObject"
objectManager = new ymaps.ObjectManager({
geoObjectHideIconOnBalloonOpen: false
});
либо уже на коллекцию objects без префикса
objectManager.objects.options.set('hideIconOnBalloonOpen', false);
Я бы сделал свой поисковый контрол. Стандартный не всегда возможно на 100% кастомизировать как хотелось бы.
Давайте один пост – один вопрос.
dimik,
Спасибо, это сработало!


А как сделать, чтобы при клике по одному из результатов, список результатов не закрывался? :)
dimik,
Мне для каждого вопроса новый пост создавать, верно?