Показаны сообщения с ярлыком ajax. Показать все сообщения
Показаны сообщения с ярлыком ajax. Показать все сообщения

22 февраля 2012

AJAX тройной выпадающий список (triple select)

Опишу очень простую реализацию трех выпадающих списков, данные которых связанны последовательно. Выглядит это примерно так "Город" -> "Улица" -> "Дом". После выбора дома, на основе AJAX запроса, генерируется список улиц этого города, а после выбора улицы генерируется список домов на этой улице. Создадим html файл:

index.html
City:
Street:
Build:

При выборе города срабатывает функция getStreet, которая генерирует код списка улиц. Добавим ниже javascript:

Теперь проделаем то же само для выбора улицы, добавим функции:
function getBuild(sel) {
    //If our XmlHttpRequest object is not in the middle of a request, start the new asyncronous call.
    var value = sel.options[sel.selectedIndex].value;
    if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
        //Setup the connection as a GET call to SayHello.html.
        //True explicity sets the request to asyncronous (default).
        receiveReq.open("GET", "/ajax/get_ajax_build?street="+value, true);
        //Set the function that will be called when the XmlHttpRequest objects state changes.
        receiveReq.onreadystatechange = handleBuild;
        //Make the actual request.
        receiveReq.send(null);
    }
}

//Called every time our XmlHttpRequest objects state changes.
function handleBuild() {
    //Check to see if the XmlHttpRequests state is finished.
    if (receiveReq.readyState == 4) {
        //Set the contents of our span element to the result of the asyncronous call.
        //document.getElementById('span_result').innerHTML = receiveReq.responseText;
        //alert(receiveReq.responseText);
        document.getElementById('buildAJAX').innerHTML = receiveReq.responseText;
        summAddress();
    }
}

Все должно работать :) Осталось написать функции на стороне сервера, для AJAX запросов. Тут их две get_ajax_build и get_ajax_street. Обе возвращают обычный HTML списсок формата:

У меня на питоне они выглядят так:
def get_ajax_street(self):
        city = request.GET['city']
        streets = s.query(Streets).filter(Streets.city==city).\
                order_by(Streets.name).all()
        html = ''
        for street in streets:
            html += "\n" % (street.name or 'No name')

        if html:
            html = ""

        return html

    def get_ajax_build(self):
        street = request.GET['street']
        builds = s.query(Builds).filter(Builds.streetid==street).\
                order_by(Builds.building).all()
        html = ''
        for build in builds:
            html += "\n" % (build.building or 'No name')

        if html:
            html = ""

        return html
Выглядит это как-то так:


Думаю понятно, что функции должны быть доступны по адресам /ajax/get_ajax_street и /ajax/get_ajax_build соответственно.
Пользуйтесь )

10 февраля 2012

OpenStreetMap, Геокодирование и автодополнение адреса в строке поиска (как у гугла) с помощью Яндекс API :)

Геокоди́рование — процесс назначения географических идентификаторов (таких как географические координаты, выраженные в виде широты и долготы) объектам карты и записям данных.
Например, геокодированием является назначение координат записям, описывающим адрес (улица/дом) или фотографиям (где было сделано фото) или IP-адресам, или любой другой информации, имеющей географический компонент. Геокодированные объекты могут быть использованы в геоинформационных системах.

Создадим карту и строку поиска объекта по адресу, через API Яндекс Карты. Служба Яндекс.Карт предлагает своим пользователям сервис геокодирования. Он позволяет определять координаты и получать сведения о географическом объекте по его названию или адресу и наоборот, определять адрес объекта на карте по его координатам (обратное геокодирование).
Например, по запросу «Москва, ул. Малая Грузинская, д. 27/13» геокодер возвратит географические координаты этого дома: "37.571309, 55.767190" (долгота, широта). И, наоборот, если в запросе указать географические коордианты дома "37.571309, 55.767190", то геокодер вернет его адрес.
К геокодеру можно обращаться как по HTTP-протоколу, так и с помощью JavaScript API. При обращении к геокодеру по HTTP-протоколу ответ может быть сформирован либо в виде XML-документа формата YMapsML, либо в формате JSON.

При обращении к геокодеру по HTTP-протоколу в параметрах запроса требуется указывать API-ключ. Ключ можно получить, заполнив соответствующую форму.
В данном документе описаны параметры HTTP-запроса к геокодеру, его ответ, а также приведены примеры использования.

Как добавить карту на сайт можно посмотреть здесь

Я приведу пример использования в окружении Pylons и шаблонизатора Jinja. При желании переделать скрипты под другие фреймворки не составит труда. Главное понять принципы.

Добавим поле для поиска
input id="searchAddress" name="address" size="73" type="text" />

Напишем AJAX функцию для выпадающего списка при автодополнении (http://www.devbridge.com/projects/autocomplete/jquery/





Создадим контроллер который будет отдавать данные по AJAX запросу
common.py
# coding=utf8
import logging
import pylons

from pyandexmap import geotagging
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from myapp.lib.base import BaseController, render

log = logging.getLogger(__name__)

class CommonController(BaseController):

    def geocodding_ajax(self):
        """ for autocomplete search in Yandex API
        """
        # Ключ для Яндекс карт из development.ini
        key = pylons.config['yandexKey']
        address = ''
        for addr in geotagging.listGeoObject(request.GET['query'], key):
            if address:
                address = address +", '"+addr+"'"
            else:
                address = "['"+addr+"'"

        resp = '''{
         query:'%s',
         suggestions: %s,
         data:[]
        }''' % (request.GET['query'], address+']')
        return resp


Формат ответа выглядит так
{
 query:'Li',
 suggestions:['Liberia','Libyan Arab Jamahiriya','Liechtenstein','Lithuania'],
 data:['LR','LY','LI','LT']
}

pyandexmap устанавливаем из pypi (про этот модуль я напишу позже)
pip install pyandexmap

Все должно заработать, остались только стили


Результат
Яндекс Карты автодополнение через геокодинг