Я делал это с помощью Яндекс карт. Просто в модуле. Правда давно делал и на коленке, но это вполне рабочий вариант, обрабатывается клиентом, а не сервером, что опять же плюс. Можно сделать при выборе города обычный each jQuery для всех цен. Ну а дальше куки в руки.
<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<style>
#modal_form {
width: 700px;
height: 340px;
border-radius: 5px;
background: #fff;
position: fixed;
top: 45%;
left: 50%;
margin-top: -170px;
margin-left: -350px;
display: none;
opacity: 0;
z-index: 5;
padding: 20px 10px;
}
#modal_form #modal_close {
width: 21px;
height: 21px;
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
display: block;
}
#overlay {
z-index: 3;
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
cursor: pointer;
display: none;
}
#insol-map-modal{width:315px; height:315px;float:right;margin:10px;}
#spisok-gorodov{width:345px;height:460px;margin:10px;float:left;}
#spisok-gorodov table{width:100%;}
#spisok-gorodov td{text-decoration:underline;cursor:pointer;}
</style>
<div id="select-city-go">выбор города</div>
<div id="modal_form">
<span id="modal_close">X</span>
<div id="spisok-gorodov">
<table>
<tr><td>Архангельск</td><td>Омск</td></tr>
<tr><td>Астрахань</td><td>Орел</td></tr>
<tr><td>Барнаул</td><td>Оренбург</td></tr>
<tr><td>Владивосток</td><td>Пенза</td></tr>
<tr><td>Волгоград</td><td>Пермь</td></tr>
<tr><td>Вологда</td><td>Петрозаводск</td></tr>
<tr><td>Воронеж</td><td>Ростов-на-Дону</td></tr>
<tr><td>Екатеринбург</td><td>Рязань</td></tr>
<tr><td>Ижевск</td><td>Самара</td></tr>
<tr><td>Иркутск</td><td>Санкт-Петербург</td></tr>
<tr><td>Казань</td><td>Саратов</td></tr>
<tr><td>Кемерово</td><td>Тольятти</td></tr>
<tr><td>Красноярск</td><td>Томск</td></tr>
<tr><td>Краснодар</td><td>Тула</td></tr>
<tr><td>Липецк</td><td>Тюмень</td></tr>
<tr><td>Махачкала</td><td>Ульяновск</td></tr>
<tr><td>Москва</td><td>Уфа</td></tr>
<tr><td>Набережные Челны</td><td>Хабаровск</td></tr>
<tr><td>Нижний Новгород</td><td>Челябинск</td></tr>
<tr><td>Новокузнецк</td><td>Ялта</td></tr>
<tr><td>Новосибирск</td><td>Ярославль</td></tr>
</table>
</div>
<div id="insol-map-modal"></div>
</div>
<div id="overlay"></div>
<script>
jQuery('#select-city-go').click(function() {
jQuery('#overlay').fadeIn(400,
function(){
jQuery('#modal_form')
.css('display', 'block')
.animate({opacity: 1, top: '50%'}, 200);
});
jQuery('#select-city-go').click( function(event){
event.preventDefault();
jQuery('#overlay').fadeIn(400,
function(){
jQuery('#modal_form')
.css('display', 'block')
.animate({opacity: 1, top: '50%'}, 200);
});
});
jQuery('#modal_close, #overlay').click( function(){
jQuery('#modal_form')
.animate({opacity: 0, top: '45%'}, 200,
function(){
jQuery(this).css('display', 'none');
jQuery('#overlay').fadeOut(400);
}
);
});
});
function setCookie(name, value) {
document.cookie = name + "=" + value;
}
function getCookie(name) {
var r = document.cookie.match("(^|;)?" + name + "=([^;]*)(;|$)");
if (r) return r[2];
else return "";
}
function deleteCookie(name) {
var date = new Date();
date.setTime(date.getTime() - 1);
document.cookie = name += "=; expires=" + date.toGMTString();
}
//jQuery("#spisok-gorodov td").click(function(){ alert(jQuery(this).text()); });
ymaps.ready(function () {
geolocation = ymaps.geolocation;
var myMapMod = new ymaps.Map('insol-map-modal', {
center: [47.22, 39.71],
zoom: 12,
controls: []
});
geolocation.get({
provider: 'yandex',
mapStateAutoApply: true
}).then(function (result) {
result.geoObjects.options.set('preset', 'islands#blueIcon');
myMapMod.geoObjects.add(result.geoObjects);
var firstGeoObject = result.geoObjects.get(0);
coords = firstGeoObject.geometry.getCoordinates();
myMapMod.setZoom(12);
city_name=firstGeoObject.properties.get('name');
jQuery('#select-city-go').html(city_name);
setCookie("city_name", city_name);
});
jQuery("#spisok-gorodov td").click(function(){
city_click=jQuery(this).text();
jQuery('#select-city-go').html(city_click);
setCookie("city_name", city_click);
ymaps.geocode(city_click, { results: 1 }).then(function (res) {
var firstGeoObject = res.geoObjects.get(0),
coords = firstGeoObject.geometry.getCoordinates(),
bounds = firstGeoObject.properties.get('boundedBy');
myMapMod.geoObjects.add(firstGeoObject);
myMapMod.setBounds(bounds, { checkZoomRange: true });
});
});
mySearchControl = new ymaps.control.SearchControl({
options: {
noPlacemark: true,
position: { left: 0, top: 0 }
}
});
// Результаты поиска будем помещать в коллекцию.
mySearchResults = new ymaps.GeoObjectCollection(null, {
hintContentLayout: ymaps.templateLayoutFactory.createClass('$[properties.name]')
});
myMapMod.controls.add(mySearchControl);
myMapMod.geoObjects.add(mySearchResults);
// Выбранный результат помещаем в коллекцию.
mySearchControl.events.add('resultselect', function (e) {
var index = e.get('index');
var results = mySearchControl.getResultsArray(); coords = results[index].geometry.getCoordinates();
myMapMod.setZoom(12);
city_name=results[index].properties.get('name');
jQuery('#select-city-go').html(city_name);
setCookie("city_name", city_name);
mySearchControl.getResult(index).then(function (res) {
mySearchResults.add(res);
});
}).add('submit', function () {
mySearchResults.removeAll();
});
});
</script>