Имеется своя гео-база. Гео базу яндекса не используем совсем, только координату с карты.
И так:
Есть несколько классов.
MtOrder, - вся логика заказа
MtAddress, - класс адреса, состоящего из 3 MtPlace
MtPlace - место на карте
Это 3 основных, ломающих мне мозг, не смотря на то, что я их придумал. :D
http://html.multitaxi.ru/map.html
Вот тут все лежит.
Я не стал копировать код, т.к. он все время меняется.
Логика работы:
1 Ситуация. - Заполнение адресов заказа такси вручную. {
Двойной автокомплит. Вводим текст, получаем улицу, открываем автокомплит с другим source для выбора дома ( в этот момент курсор ужке стоит на карте, как точка А). То же самое с точкой б. Сервер посылает координаты и строки адреса.
После нажатия кнопки "поехали", данные будут отправляться на сервер в виде заказа... Но это уже другая уже реализованная история.
}
2 Ситуация. - Заказ такси только по кликам на карте. {
Юзер кликнул на точку А и точку Б, сервер получил эти координаты, вернул координаты домов из базы, строки адресов. Чел жмет "Поехали", данные отправились, все счастливы.
}
3 Ситуация. - Смешанная {
Чел вводил адрес, потом кликнул на карту, потом стер и ввел заново.
Тут начинает мешать одно другому, т.к. при ручном вводе адреса, происходит полное перестроение маршрута. И наоборот.
}
Я придумал ключ (фокус на input - вводит вручную, не посылаем запросы к серверу при перестроении маршрута) ну и наоборот.
Вообщем у меня не хватает мозгов на воплощение своего же алгоритма и конструкции. Кстати, первая версия работала, но 3 Ситуация.... Прошу помощи в наведении порядка в классах JS, т.к. не знаю этот язык.
<script type="text/javascript">
$(function () {
Order = new MtOrder();
$(".address").bind().change(function(){
Order.addAddress($(this).attr("id"));
});
Map = new MtMap("#map");
Map.addListeners();
});
</script>
// Местоположение
var MtPlace = createClass({
str: null, // Название места
id: null, // id из базы
lat: null, // Широта (х)
lon: null, // Долгота (у)
construct: function(str) {
console.log(typeof(str));
this.reset();
if (typeof(str) == 'string'){
this.search(str);
} else if(typeof(str) != 'undefined'){
this.searchByCoords(str);
}
},
// Поиск места по строке
search: function(str){
this.str = str;
this.id = 1;
this.lat = 33.88;
this.lon = 55.77;
return true;
},
searchByCoords: function (data){
console.log(data);
this.str = data.str;
this.id = data.id;
this.lat = data.x;
this.lon = data.y;
},
// Обнуление
reset: function(){
this.str = null;
this.id = null;
this.lat = null;
this.lon = null;
}
});
/**
* @todo: Посылать в конструктор только сформированные данные.
* @todo: Написать функции формирования данных
*/
// Адрес
var MtAddress = createClass({
city: null, // Место - город
street: null, // Место - улица
build: null, // Место - строение
str: null, // Строка адреса
input: null,
autocomplete: null,
construct: function(id, data){
this.input = $("#"+id);
this.reset(id);
var obj = {}; // Данные для заполнения
if (data){
$.ajax({
url: "/ajax/FindAddress.html",
data: "term="+data[0]+","+data[1],
dataType: 'json',
async: false,
success: function(data){
$("#"+id).val(data.str);
obj = data;
},
error: function(e){
$('body').html(e.responseText);
}
});
this.build = new MtPlace(obj.build);
this.street = new MtPlace(obj.street);
this.city = new MtPlace(obj.city);
}
},
reset: function(id){
this.city = new MtPlace();
this.street = new MtPlace();
this.build = new MtPlace();
this.input = $("#"+id);
this.autocomplete = new MtAutocomplete(this.input);
this.str = null;
}
});
MtAutocomplete = createClass({
construct: function(input){
this.input = input;
$(this.input).autocomplete({
source: function( request, response ) {
// Проверяем введенное и меняем source
$.getJSON( "/ajax/searchstreet", {
term: request.term
}, response );
},
minLength: 1,
select: function(event, ui){
Map.createRoad();
console.log('CreateRoad');
},
search: function(event, ui){
},
create: function(event, ui){
//$(this.input).autocomplete("search");
}
});
},
input: false,
currentmode: 'build',
// Улица + город
street: {
},
// Строение
build: {
source: function( request, response ) {
// Проверяем введенное и меняем source
$.getJSON( "/ajax/searchstreet", {
term: request.term
}, response );
},
minLength: 1,
select: function(event, ui){
Map.createRoad();
console.log('CreateRoad');
},
search: function(event, ui){
},
create: function(event, ui){
console.log(this.input);
$(this.input).autocomplete("search");
}
}
});
// Заказ
var MtOrder = createClass({
addresses: createClass({}),
construct: function(){
this.reset();
},
addAddress: function(id){
this.addresses[String(id)] = new MtAddress(String(id));
},
ajaxAddress: function(id, data){
this.addresses[String(id)] = new MtAddress(String(id), data);
},
removeAddress: function(id){
delete this.addresses[String(id)];
},
getAddress: function(id){
return this.addresses[id];
},
addOrder: function(){
var KeyPattern = /^a\d{1}$/;
$.each(this.addresses, function(key, val){
if(key.match(KeyPattern)){
alert(Order.getAddress(key).str);
}
});
},
reset: function(){
this.addresses = createClass({});
this.addAddress('a0');
}
});
var Order = new Object;
var MtMapPoints = createClass({
// Сами точки
p0: null,
p1: null,
p2: null,
p3: null,
p4: null,
construct: function(){
this.p0 = null;
this.p1 = null;
this.p2 = null;
this.p3 = null;
this.p4 = null;
},
// Функция перезагрузки точек
rebuild: function(helper){
var WayPoint = false;
// Обнуление текущих точек
this.p0 = null;
this.p1 = null;
this.p2 = null;
this.p3 = null;
this.p4 = null;
// Перебор точек с карты
for (var i=0; i<6; i++){
WayPoint = helper.getWayPoint(i);
// Кончились точки - завершаем цикл
if (!WayPoint)
break;
// Добавляем значение к точке
this['p'+i] = WayPoint.data.point;
Order.ajaxAddress('a'+i, WayPoint.data.point);
}
},
// Map.points.get() - вернет все точки
// Map.points.get('p1') - вернет точку p1
get: function(one){
var KeyPattern = /^p\d{1}$/;
if(one.match(KeyPattern)){
// Отдаем одну
return this[one];
} else {
var ret = {};
$.each(this, function(key, val){
if(key.match(KeyPattern)){
ret[key] = val;
}
});
// Отдаем несколько
return ret;
}
}
});
var MtMap = createClass({
map: new Object(),
// Точки маршрута на карте
points: new Object(),
// Плагины
plugins: new createClass({
// Модель редактора маршрутов
routerModel: new Object(),
// Редактор маршрутов
routerEditor: new Object()
}),
construct: function(container){
this.map = new YMaps.Map($(container));
this.points = new MtMapPoints();
this.plugins.routerModel = new YMaps.RouterEditor.RouterModel();
this.plugins.routerEditor = new YMaps.RouterEditor.DragAndDropEditor(this.plugins.routerModel,{
maxPoints: 2
});
this.map.addControl(this.plugins.routerEditor);
var zoom = 12;
//if (YMaps.location || false == true) {
// center = new YMaps.GeoPoint(YMaps.location.longitude, YMaps.location.latitude);
// if (YMaps.location.zoom) {
// zoom = YMaps.location.zoom;
// }
//} else {
center = new YMaps.GeoPoint(38.1681, 56.3211);
//}
this.map.setCenter(center, zoom);
this.plugins.routerEditor.startDrawing();
},
clear: function(){
this.plugins.routerEditor.clear();
this.plugins.routerEditor.startDrawing();
},
addListeners: function(){
// Ловим событие изменения маршрута
YMaps.Events.observe(
this.plugins.routerModel,
this.plugins.routerModel.Events.RouterResultChange, function (event) {
var helper = new YMaps.RouterEditor.RouterResultHelper(event);
// Перезагружаем точки маршрута
Map.points.rebuild(helper);
});
},
createRoad: function(){
var key=0;
var points = new Array();
while (addr = Order.getAddress('a'+key)){
if (!addr)
break;
console.log(addr);
if (addr.build.id){
points[points.length] = new YMaps.GeoPoint(addr.build.lat, addr.build.lon);
} else if (addr.street.id) {
points[points.length] = new YMaps.GeoPoint(addr.street.lat, addr.street.lon);
} else if (addr.city.id) {
points[points.length] = new YMaps.GeoPoint(addr.city.lat, addr.city.lon);
}
key++;
}
}
});
var Map = new Object();
/**
* $(function () {
Map = new MtMap("#map");
Map.addListeners();
});
*/
Для тех, кто скажет, что такое только за деньги:
free-lance 3 исполнителя с хорошим портфолио сказали, что не потянут. 2 жителя форума сказали, что топик надо сделать :)
Спустя 2 минуты, 52 секунды (18.03.2012 - 03:10) ADiel написал(а):
Сейчас проблема в создании MtPlace. т.к. может создаваться из 2 разных место по-разному. Писать класс - потомок или как? Мне кажется, что я еще сильнее запутаюсь.
Скрытый текст |
Я либо псих, либо ненормальный |
Спустя 5 минут, 45 секунд (18.03.2012 - 03:15) ADiel написал(а):
m4a1fox, я знаю, тебе есть, что добавить =)
Спустя 42 минуты, 37 секунд (18.03.2012 - 03:58) bodja написал(а):
Да уж,тут даже ящик пива не поможет

Спустя 2 минуты, 51 секунда (18.03.2012 - 04:01) inpost написал(а):
Я не понял, 1-2 работало, а проблема была только в третьем пункте, или в первом и втором тоже?
Спустя 41 минута, 7 секунд (18.03.2012 - 04:42) ADiel написал(а):
В третьем. Сейчас над автокомплитом бьюсь. Мне кажется, я сообразил как сделать. Допишу код - будет ясно

Спустя 26 минут, 40 секунд (18.03.2012 - 05:09) ADiel написал(а):
Прекрасная ночь
Мозги сами отвечают на вопрос по конструкции срипта и алгоритмам его работы, но не в состоянии ответить жене, хочу ли я чай
))


Спустя 8 минут, 43 секунды (18.03.2012 - 05:17) inpost написал(а):
ADiel
Аналогично.
Если проблема взаимодействия, то можешь пойти дубово, при переключении режима выбора - перезагружай страницу, чтобы выбирали с нуля
Аналогично.
Если проблема взаимодействия, то можешь пойти дубово, при переключении режима выбора - перезагружай страницу, чтобы выбирали с нуля

Спустя 2 минуты, 10 секунд (18.03.2012 - 05:19) ADiel написал(а):
Не пойдет. Там много данных кроме как в js нигде не хранится. С куками морочиться не прет
Спустя 3 часа, 22 минуты, 58 секунд (18.03.2012 - 08:42) ADiel написал(а):
Работает о0
Когда сделаю этот скрипт на основной странице сайта, обязательно всем покажу
Когда сделаю этот скрипт на основной странице сайта, обязательно всем покажу

Спустя 53 минуты, 23 секунды (18.03.2012 - 09:36) ADiel написал(а):
http://html.multitaxi.ru/ вот он. Правда автокомплит потом будет еще хитрее и интереснее.
_____________
Ищи меня тут (ilyaplot)