- Files:
-
- /kladr/addr_suggest.php (modified) (3 diffs)
- /kladr/index.html (modified) (1 diff)
- /kladr/kladr/addr_suggest.js (modified) (8 diffs)
- /kladr/classes (deleted)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
/kladr/addr_suggest.php
r20 r29 8 8 require_once('include/JsHttpRequest.php'); 9 9 10 require_once('classes/region.class.php');11 require_once('classes/zone.class.php');12 require_once('classes/city.class.php');13 require_once('classes/settlement.class.php');14 require_once('classes/street.class.php');15 16 10 // ------------------------------------------------------------------------- 17 11 $JsHttpRequest =& new JsHttpRequest('utf-8'); 18 12 $database = new database($config_db_host,$config_db_user,$config_db_pass,$config_db_name,''); 19 $tbRegions = new tbRegion("regions", "id", $database);20 $tbZones = new tbZone("zones", "id", $database);21 $tbCities = new tbCity("cities", "id", $database);22 $tbSettlements = new tbSettlement("settlements", "id", $database);23 $tbStreets = new tbStreet("streets", "id", $database);24 13 25 14 // ------------------------------------------------------------------------- 26 15 27 16 $task = mosGetParam($_REQUEST,'task',''); 17 $value = mosGetParam($_REQUEST, 'value', ''); 28 18 $region = mosGetParam($_REQUEST,'region',''); 29 19 $zone = mosGetParam($_REQUEST,'zone',''); … … 32 22 $street = mosGetParam($_REQUEST,'street',''); 33 23 24 $value = ($value=="" ? 0 : str_replace("'", "''", $value)); 34 25 $zone = ($zone=="" ? 0 : str_replace("'", "''", $zone)); 35 26 $region = ($region=="" ? 0 : str_replace("'", "''", $region)); … … 39 30 40 31 switch($task) { 41 case 'suggestRegion': 42 $res = $tbRegions->suggest($region); 43 $_RESULT = array( 44 "regions" => $res 45 ); 46 break; 47 case 'suggestZone': 48 $res = $tbZones->suggest($region, $zone); 49 $_RESULT = array( 50 "zones" => $res 51 ); 52 break; 53 case 'suggestCity': 54 $res = $tbCities->suggest($region, $zone, $city); 55 $_RESULT = array( 56 "cities" => $res 57 ); 58 break; 59 case 'suggestSettlement': 60 $res = $tbSettlements->suggest($region, $zone, $city, $settlement); 61 $_RESULT = array( 62 "settlements" => $res 63 ); 64 break; 65 case 'suggestStreet': 66 $res = $tbStreets->suggest($region, $zone, $city, $settlement, $street); 67 $_RESULT = array( 68 "streets" => $res 69 ); 32 case 'suggest': 33 if ($settlement != 0 && $street == 0) { 34 // определяем улицу 35 $where_q = "WHERE name LIKE '$value%' AND parentSettlement = '$settlement'"; 36 $query = "SELECT temp.name, temp.id, types.name AS type, 4 AS level FROM ". 37 " (SELECT name, id, type FROM streets $where_q LIMIT 10) AS temp ". 38 " INNER JOIN types ON temp.type = types.id) ". 39 "ORDER BY name LIMIT 10"; 40 $database->setQuery($query); 41 $res = $database->loadObjectList(); 42 } else if ($city != 0 && $settlement == 0 && $street == 0) { 43 // определяем поселение 44 $where_q = "WHERE name LIKE '$value%' AND parentCity = '$city'"; 45 $query = "SELECT temp.name, temp.id, types.name AS type, 3 AS level FROM ". 46 " (SELECT name, id, type FROM settlements $where_q LIMIT 10) AS temp ". 47 " INNER JOIN types ON temp.type = types.id ". 48 "ORDER BY name LIMIT 10"; 49 $database->setQuery($query); 50 $res = $database->loadObjectList(); 51 } else if ($zone !=0 && $city == 0 && $settlement == 0 && $street == 0) { 52 // определяем город 53 $where_q = "WHERE name LIKE '$value%' AND parentZone = '$zone'"; 54 $query = "(SELECT temp.name, temp.id, types.name AS type, 2 AS level FROM ". 55 " (SELECT name, id, type FROM cities $where_q LIMIT 10) AS temp ". 56 " INNER JOIN types ON temp.type = types.id) ". 57 "UNION ". 58 "(SELECT temp.name, temp.id, types.name AS type, 3 AS level FROM ". 59 " (SELECT name, id, type FROM settlements $where_q LIMIT 10) AS temp ". 60 " INNER JOIN types ON temp.type = types.id) ". 61 "ORDER BY name LIMIT 10"; 62 $database->setQuery($query); 63 $res = $database->loadObjectList(); 64 } else if ($region !=0 && $zone ==0 && $city ==0 && $settlement ==0 && $street ==0) { 65 // определяем район (или город или поселок, если Москва,Питер) 66 $where_q1 = "WHERE name LIKE '$value%' AND parent = '$region'"; 67 $where_q2 = "WHERE name LIKE '$value%' AND parentRegion = '$region' AND parentZone=0"; 68 $where_q3 = "WHERE name LIKE '$value%' AND parentRegion = '$region' AND parentZone=0 AND parentCity=0"; 69 $query = "(SELECT temp.name, temp.id, types.name AS type, 1 AS level FROM ". 70 " (SELECT name, id, type FROM zones $where_q1 LIMIT 10) AS temp ". 71 " INNER JOIN types ON temp.type = types.id) ". 72 "UNION ". 73 "(SELECT temp.name, temp.id, types.name AS type, 2 AS level FROM ". 74 " (SELECT name, id, type FROM cities $where_q2 LIMIT 10) AS temp ". 75 " INNER JOIN types ON temp.type = types.id) ". 76 "UNION ". 77 "(SELECT temp.name, temp.id, types.name AS type, 3 AS level FROM ". 78 " (SELECT name, id, type FROM settlements $where_q3 LIMIT 10) AS temp ". 79 " INNER JOIN types ON temp.type = types.id) ". 80 "ORDER BY name LIMIT 10"; 81 $database->setQuery($query); 82 $res = $database->loadObjectList(); 83 } else if ($region ==0 && $zone ==0 && $city ==0 && $settlement == 0 && $street == 0) { 84 // определяем субъект 85 $where_q = "WHERE name LIKE '$value%'"; 86 $query = "SELECT temp.name, temp.id, types.name AS type, 0 AS level FROM ". 87 " (SELECT name, id, type FROM regions $where_q LIMIT 10) AS temp ". 88 " INNER JOIN types ON temp.type = types.id ". 89 "ORDER BY name LIMIT 10"; 90 $database->setQuery($query); 91 $res = $database->loadObjectList(); 92 } 93 94 $_RESULT = $res; 70 95 break; 71 96 } /kladr/index.html
r18 r30 9 9 <body> 10 10 <table border="0" cellpadding="3" cellspacing="2"> 11 <tr><td>Region:</td><td><input type="text" id="kladr_region" size="40" /></td><td><div id="kladr_regionType"></div></td></tr> 12 <tr><td>Zone:</td><td><input type="text" id="kladr_zone" size="40" /></td><td><div id="kladr_zoneType"></div></td></tr> 13 <tr><td>City:</td><td><input type="text" id="kladr_city" size="40" /></td><td><div id="kladr_cityType"></div></td></tr> 14 <tr><td>Settlement:</td><td><input type="text" id="kladr_settlement" size="40" /></td><td><div id="kladr_settlementType"></div></td></tr> 15 <tr><td>Street:</td><td><input type="text" id="kladr_street" size="40" /></td><td><div id="kladr_streetType"></div></td></tr> 11 <tr><td>1</td><td><input type="text" id="kladr_0" size="40" /></td><td></td></tr> 12 <tr><td>2</td><td><input type="text" id="kladr_1" size="40" /></td><td></td></tr> 13 <tr><td>3</td><td><input type="text" id="kladr_2" size="40" /></td><td></td></tr> 14 <tr><td>4</td><td><input type="text" id="kladr_3" size="40" /></td><td></td></tr> 15 <tr><td>5</td><td><input type="text" id="kladr_4" size="40" /></td><td></td></tr> 16 <tr><td>6</td><td><input type="text" id="kladr_5" size="40" /></td><td></td></tr> 16 17 </table> 17 18 </body> /kladr/kladr/addr_suggest.js
r20 r29 1 REQUEST_INTERVAL = 200; 1 2 /* Autosuggest Textbox written by Nicholas C. Zakas 2 3 Taked from http://www.webreference.com/programming/javascript/ncz/ */ … … 41 42 this.currentNodes = []; 42 43 this.selectedNode = null; 44 this.pressTimer = null; 43 45 //initialize the control 44 46 this.init(); … … 179 181 */ 180 182 AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) { 183 var oThis = this; 184 function onTimer() { 185 oThis.provider.requestSuggestions(oThis, false); 186 } 181 187 var iKeyCode = oEvent.keyCode 182 188 //for backspace (8) and delete (46), shows suggestions without typeahead 183 189 if (iKeyCode == 8 || iKeyCode == 46) { 184 190 this.selectedNode = null; 185 this.provider.requestSuggestions(this, false); 186 191 clearTimeout(this.requestTimer); 192 this.cur = -1; 193 this.requestTimer = setTimeout(onTimer, REQUEST_INTERVAL); 187 194 //make sure not to interfere with non-character keys 188 195 } else if (iKeyCode>0 && iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) { … … 190 197 // alert(iKeyCode) 191 198 } else { 199 clearTimeout(this.requestTimer); 200 this.cur = -1; 201 this.requestTimer = setTimeout(onTimer, REQUEST_INTERVAL); 192 202 //request suggestions from the suggestion provider with typeahead 193 this.selectedNode = null; 194 this.provider.requestSuggestions(this, true); 203 this.selectedNode = null; 195 204 } 196 205 }; … … 367 376 //check for support of typeahead functionality 368 377 if (this.textbox.createTextRange || this.textbox.setSelectionRange){ 369 var iLen = this.textbox.value.length; 370 this.textbox.value = sSuggestion; 378 var iLen = this.textbox.value.length; 379 this.textbox.value = sSuggestion; 371 380 this.selectRange(iLen, sSuggestion.length); 372 381 } … … 377 386 var EFIO_SERVER = "http://www.kladr.org.ru/addr_suggest.php"; 378 387 379 function RegionSuggestions() {} 380 RegionSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 381 var sendValue = autoControl.textbox.value; 382 var req = { 383 task: "suggestRegion", 384 region: sendValue 385 }; 386 JsHttpRequest.query( 387 EFIO_SERVER, req, function(result, errors) { 388 if (result && result.regions) { 389 if (autoControl.textbox.value == sendValue) { 390 autoControl.autosuggest(result.regions, false); 391 } 392 } 393 }, 394 false 395 ); 396 } 397 398 function ZoneSuggestions(parentRegion) { 399 this.parentRegion = parentRegion; 400 } 401 ZoneSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 388 function AddressSuggestions(group) { 389 this.group = group; 390 } 391 AddressSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 402 392 var oThis = this; 403 393 var sendValue = autoControl.textbox.value; 404 var req = { 405 task: "suggestZone", 406 zone: sendValue 407 }; 408 if (this.parentRegion.selectedNode) { 409 req.region = this.parentRegion.selectedNode.id; 410 } 411 412 // Если поменялось поле региона, кэш очищается 413 if (this.lastReq) 414 if (req.region != this.lastReq.region) JsHttpRequest.CACHE = {}; 415 416 JsHttpRequest.query( 417 EFIO_SERVER, req, function(result, errors) { 418 if (result && result.zones) { 419 if (autoControl.textbox.value == sendValue) 420 autoControl.autosuggest(result.zones, false); 421 oThis.lastReq = req; 422 } 423 }, 424 false 425 ); 426 } 427 428 function CitySuggestions(parentRegion, parentZone) { 429 this.parentRegion = parentRegion; 430 this.parentZone = parentZone; 431 } 432 CitySuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 433 var oThis = this; 434 var sendValue = autoControl.textbox.value; 435 var req = { 436 task: "suggestCity", 437 city: sendValue 438 }; 439 440 if (this.parentRegion.selectedNode) req.region = this.parentRegion.selectedNode.id; 441 if (this.parentZone.selectedNode) req.zone = this.parentZone.selectedNode.id; 442 443 // Если поменялись поля региона или области, кэш очищается 444 if (this.lastReq) 445 if (req.region != this.lastReq.region || req.zone != this.lastReq.zone) 446 JsHttpRequest.CACHE = {}; 447 448 JsHttpRequest.query( 449 EFIO_SERVER, req, function(result, errors) { 450 if (result && result.cities) { 451 if (autoControl.textbox.value == sendValue) { 452 autoControl.autosuggest(result.cities, false); 453 oThis.lastReq = req; 454 } 455 } 456 }, 457 false 458 ); 459 } 460 461 function SettlementSuggestions(parentRegion, parentZone, parentCity) { 462 this.parentRegion = parentRegion; 463 this.parentZone = parentZone; 464 this.parentCity = parentCity; 465 } 466 SettlementSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 467 var oThis = this; 468 var sendValue = autoControl.textbox.value; 469 var req = { 470 task: "suggestSettlement", 471 settlement: sendValue 472 }; 473 474 if (this.parentRegion.selectedNode) req.region = this.parentRegion.selectedNode.id; 475 if (this.parentZone.selectedNode) req.zone = this.parentZone.selectedNode.id; 476 if (this.parentCity.selectedNode) req.city = this.parentCity.selectedNode.id; 477 478 // Если поменялись поля региона или области, кэш очищается 394 var req = { task: "suggest", value: sendValue }; 395 var parent = this.group.getParent(autoControl); 396 for (t in parent) req[t] = parent[t]; // add all properties in request 397 479 398 if (this.lastReq) 480 399 if (req.region != this.lastReq.region || 481 400 req.zone != this.lastReq.zone || 482 req.city != this.lastReq.city)483 JsHttpRequest.CACHE = {};484 485 JsHttpRequest.query(486 EFIO_SERVER, req, function(result, errors) {487 if (result && result.settlements) {488 if (autoControl.textbox.value == sendValue) {489 autoControl.autosuggest(result.settlements, false);490 oThis.lastReq = req;491 }492 }493 },494 false495 );496 }497 498 function StreetSuggestions(parentRegion, parentZone, parentCity, parentSettlement) {499 this.parentRegion = parentRegion;500 this.parentZone = parentZone;501 this.parentCity = parentCity;502 this.parentSettlement = parentSettlement;503 }504 StreetSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) {505 var oThis = this;506 var sendValue = autoControl.textbox.value;507 var req = {508 task: "suggestStreet",509 street: sendValue510 };511 512 if (this.parentRegion.selectedNode) req.region = this.parentRegion.selectedNode.id;513 if (this.parentZone.selectedNode) req.zone = this.parentZone.selectedNode.id;514 if (this.parentCity.selectedNode) req.city = this.parentCity.selectedNode.id;515 if (this.parentSettlement.selectedNode) req.settlement = this.parentSettlement.selectedNode.id;516 517 if (this.lastReq)518 if (req.region != this.lastReq.region ||519 req.zone != this.lastReq.zone ||520 req.city != this.lastReq.city ||521 401 req.settlement != this.lastReq.settlement) 522 402 JsHttpRequest.CACHE = {}; … … 524 404 JsHttpRequest.query( 525 405 EFIO_SERVER, req, function(result, errors) { 526 if (result && result.streets) {406 if (result) { 527 407 if (autoControl.textbox.value == sendValue) { 528 autoControl.autosuggest(result .streets, false);408 autoControl.autosuggest(result, bTypeAhead); 529 409 oThis.lastReq = req; 530 410 } … … 543 423 c==45 || c == 39 || // - ' 544 424 c==1105 || c==1025 || // ё, Ё 425 c==32 || // space 545 426 cc==9 || // tab 546 427 cc==0); // special symbols 547 428 } 429 430 function KladrGroup() { 431 this.inputs = []; 432 } 433 KladrGroup.prototype.add = function(c) { 434 this.inputs.push(c); 435 } 436 KladrGroup.prototype.getParent = function(input) { 437 var res = []; 438 var p = this.inputs.indexOf(input); 439 if (p==0 || p==-1) return null; 440 var cn = this.inputs[p-1].selectedNode; 441 if (!cn) return null; 442 switch (cn.level) { 443 case "0": 444 return {region:cn.id}; 445 case "1": 446 return {zone:cn.id}; 447 case "2": 448 return {city:cn.id}; 449 case "3": 450 return {settlement:cn.id}; 451 case "4": 452 return {street:cn.id}; 453 } 454 } 548 455 // ---------------------------------------------------------------------------- 549 456 window.onload = function () { 550 var regionInput = document.getElementById("kladr_region"); 551 var zoneInput = document.getElementById("kladr_zone"); 552 var cityInput = document.getElementById("kladr_city"); 553 var settlementInput = document.getElementById("kladr_settlement"); 554 var streetInput = document.getElementById("kladr_street"); 555 var region = new AutoSuggestControl(regionInput, new RegionSuggestions, kladrFilter); 556 var zone = new AutoSuggestControl(zoneInput, new ZoneSuggestions(region), kladrFilter); 557 var city = new AutoSuggestControl(cityInput, new CitySuggestions(region, zone), kladrFilter); 558 var settlement = new AutoSuggestControl(settlementInput, new SettlementSuggestions(region, zone, city), kladrFilter); 559 var street = new AutoSuggestControl(streetInput, new StreetSuggestions(region, zone, city, settlement), kladrFilter); 560 } 457 kladrGroup = new KladrGroup; 458 var f0Input = document.getElementById("kladr_0"); 459 var f1Input = document.getElementById("kladr_1"); 460 var f2Input = document.getElementById("kladr_2"); 461 var f3Input = document.getElementById("kladr_3"); 462 463 var f0 = new AddressSuggestions(kladrGroup); 464 var f1 = new AddressSuggestions(kladrGroup); 465 var f2 = new AddressSuggestions(kladrGroup); 466 var f3 = new AddressSuggestions(kladrGroup); 467 468 kladrGroup.add(new AutoSuggestControl(f0Input, f0, kladrFilter)); 469 kladrGroup.add(new AutoSuggestControl(f1Input, f1, kladrFilter)); 470 kladrGroup.add(new AutoSuggestControl(f2Input, f2, kladrFilter)); 471 kladrGroup.add(new AutoSuggestControl(f3Input, f3, kladrFilter)); 472 }
