Клуб API Карт

Проблема с API карты

vosovec777
5 июля 2016, 10:24

После смены версии карт имя текстовому полю теперь не присваивается и соответственно адрес который ввел пользователь в строку поиска адреса не заносятся в базу. Как это исправить? У нас запрос передаётся формой через post и значение принимается сервером php. Без ajax.

<form action="map_save.php" method="POST">  
<div>              
Имя<input id="name" name="name" type="text"/>
</div>
<div> 
Телефон<input id="tel" name="tel" type="text" /> 
</div> 
<div id="map"></div>
<div id="marker" style="float:left;"></div> 
<p class="header" style="float:left;"> Перетащите метку на карту</p>
  <div style="clear: left"></div>
   <input id="latitude" name="x" type="hidden"/><input id="longitude" name="y" type="hidden" />       
 <!--  <input id="latitude" name="x" type="text"/><input id="longitude" name="y" type="text" />      -->
    <br /><br /><br />
 <input type="submit" value="Сохранить и продолжить">   
</form>
	<script>
    
jQuery(function () {
    ymaps.ready(init);
    jQuery("#map input").attr("name", "adress"); 
    
});

function init () {
    var map = new ymaps.Map('map', {
            center: [44.32907842796631, 38.74097519022592],
            zoom: 9
        }, {
            searchControlProvider: 'yandex#search'
        }),
        markerElement = jQuery('#marker'),
        dragger = new ymaps.util.Dragger({
            // Драггер будет автоматически запускаться при нажатии на элемент 'marker'.
            autoStartElement: markerElement[0]
        }),
        // Смещение маркера относительно курсора.
        markerOffset,
        markerPosition;

    dragger.events
        .add('start', onDraggerStart)
        .add('move', onDraggerMove)
        .add('stop', onDraggerEnd);

    function onDraggerStart(event) {   
        var offset = markerElement.offset(),
            position = event.get('position');
        // Сохраняем смещение маркера относительно точки начала драга.	
        markerOffset = [
            position[0] - offset.left,
            position[1] - offset.top
        ];
        markerPosition = [
            position[0] - markerOffset[0],
            position[1] - markerOffset[1]
        ];

        applyMarkerPosition();
    }

    function onDraggerMove(event) {
        applyDelta(event);
    }

    function onDraggerEnd(event) {
        applyDelta(event);
        markerPosition[0] += markerOffset[0];
        markerPosition[1] += markerOffset[1];
        // Переводим координаты страницы в глобальные пиксельные координаты.
        var markerGlobalPosition = map.converter.pageToGlobal(markerPosition),
            // Получаем центр карты в глобальных пиксельных координатах.
            mapGlobalPixelCenter = map.getGlobalPixelCenter(),
            // Получением размер контейнера карты на странице.
            mapContainerSize = map.container.getSize(),
            mapContainerHalfSize = [mapContainerSize[0] / 2, mapContainerSize[1] / 2],
            // Вычисляем границы карты в глобальных пиксельных координатах.
            mapGlobalPixelBounds = [
                [mapGlobalPixelCenter[0] - mapContainerHalfSize[0], mapGlobalPixelCenter[1] - mapContainerHalfSize[1]],
                [mapGlobalPixelCenter[0] + mapContainerHalfSize[0], mapGlobalPixelCenter[1] + mapContainerHalfSize[1]]
            ];
        // Проверяем, что завершение работы драггера произошло в видимой области карты.
        if (containsPoint(mapGlobalPixelBounds, markerGlobalPosition)) {
            // Теперь переводим глобальные пиксельные координаты в геокоординаты с учетом текущего уровня масштабирования карты.
            var geoPosition = map.options.get('projection').fromGlobalPixels(markerGlobalPosition, map.getZoom());
            xy = geoPosition.join(' ');
            xyz = geoPosition.join(' ');
            xy = xy.split(' ') 
            $("#latitude").val(xy[0]);
            $("#longitude").val(xy[1]);
            if ($(".ymaps-2-1-39-input__control").val()=="")
            {
 var myGeocoder = ymaps.geocode(xyz, {kind: 'house'});
        myGeocoder.then(
            function (res) {
                var street = res.geoObjects.get(0);
                var name = street.properties.get('text');
                $(".ymaps-2-1-39-input__control").val(name);
                
                alert (name);
            }
        );

            
            }
        }
    }

    function applyDelta (event) {
        // Поле 'delta' содержит разницу между положениями текущего и предыдущего события драггера.
        var delta = event.get('delta');
        markerPosition[0] += delta[0];
        markerPosition[1] += delta[1];
        applyMarkerPosition();
    }

    function applyMarkerPosition () {
        markerElement.css({
            left: markerPosition[0],
            top: markerPosition[1]
        });
    }

    function containsPoint (bounds, point) {
        return point[0] >= bounds[0][0] && point[0] <= bounds[1][0] &&
               point[1] >= bounds[0][1] && point[1] <= bounds[1][1];
    }
  
}
    
window.onload = function () {
$("input.ymaps-2-1-39-input__control").attr("name", "adress"); 
};

	</script>

Запись в базу:

<?php
function no_injection($str='') {
    $str = stripslashes($str);
    $str = mysql_real_escape_string($str);
    $str = trim($str);
    $str = htmlspecialchars($str);
    return $str;
}
$name=no_injection($_POST['name']);
$tel=no_injection($_POST['tel']);
$address=no_injection($_POST['adress']);
//$adr_razbor = explode(',', $address);
//if (count($adr_razbor)!=6) {
//echo "Неправильно введён адрес";
//exit ();
$x=no_injection($_POST['x']);
$y=no_injection($_POST['y']);
$zapros = mysql_query("insert into `hotels` (`id_user`, `name`, `tel`, `adres`, `x`, `y`)
values ('".$_COOKIE['id']."', '".$name."', '".$tel."', '".$address."', '".$x."', '".$y."')");
echo "<script>location.href = 'objekt.php';</script>";
?>

Как исправить? Голова уже кипит.

1 комментарий
Подписаться на комментарии к посту
1. Не надо ковыряться в DOM-е карты и ее контролов, ставить и менять аттрибуты и строить логику на именах классов. Это все меняется с каждой версией, работайте только через документированные интерфейсы.


2. Стандартный SearchControl должен использоваться для поиска по карте и менять его поведение запрещено Условиями Использования.
Для добавления данных в базу лучше создать собственный элемент управления