bradcornford/Googlmapper

How to use AutoComplete Listener

Mohsing511 opened this issue · 18 comments

i am finding it difficult to join map with input field which can be used to auto complete Help will be appreciated please reply fast

This isn't something this package doesn't do out of the box, but has been done before, see: #114

its not working correctly here is my code
my form

{!! Mapper::renderJavascript() !!}
     {!! Form::open(array('action' => 'locationController@store','method' => 'POST','id'=>'form_location')) !!}
               <div class="form-group col-lg-12">
                 {{Form::label('address','Address Manual')}}
                 {{Form::text('address','',['class'=>'form-control','placeholder'=>'Address here','id'=>"Manual",'name'=>"address"])}} 
               </div>
               <div class="form-group col-lg-12">
                 {{Form::label('lati','Latitude')}}
                 {{Form::text('latitude','',['class'=>'form-control','placeholder'=>'Latitude','id'=>"lat",'name'=>"lati"])}} 
               </div>
               <div class="form-group col-lg-12">
                 {{Form::label('longi','Longitude')}}
                 {{Form::text('longitude','',['class'=>'form-control','placeholder'=>'Longitude','name'=>'long','id'=>'long'])}}
               </div>
                 <div class="form-group col-lg-12">
                   {{Form::label('Search','Search Places Here')}}
                  {{ Form::input('text', 'location', null, ['id' => 'location', 'class' => 'form-control']) }}
                 </div>
                  <div class="form-group col-lg-12">
                 <div style="height: 600px;width: 90%" id="map"> {!! Mapper::render() !!}</div>
                 </div>
               <div class="col-lg-12">
                 <center>{{Form::Submit('Submit Location',['class' => 'btn btn-success btn-lg'])}}</center>
               </div>
                 {!! Form::close() !!}

and here is controller which displays map

public function create()
   {
        Mapper::map(31.5204, 74.3587,['marker'=>false,'zoom' => 12,'animation' => 'DROP','eventAfterLoad' => "new google.maps.places.Autocomplete(document.getElementById('mapaddress'));"])->marker(31.5204, 74.3587,['markers' => ['title' => 'lahore','symbol' => 'circle', 'scale' => 1000,], 'animation' => 'DROP', 'draggable' =>true,'eventDragEnd' =>"(document.getElementById('lat').value=(event.latLng.lat())); (document.getElementById('long').value=(event.latLng.lng()))",'google.maps.places.Autocomplete']);
            return view ('sadminpages.location.create');
   }

and here is script code

<script>
var autocomplete = new google.maps.places.Autocomplete(document.getElementById('location'));
var form_location = $('#form_location');

form_location.on('submit', function(e){
    e.preventDefault();
});

google.maps.event.addListener(autocomplete, 'place_changed', function(){
    var place = autocomplete.getPlace();
    if(!place.geometry)
    {
        $.ajax({
            type: "POST",
            url: form_location.attr('action'),
            data: form_location.serialize(),
            success: function(location)
            {
                var latLng = new google.maps.LatLng(location.latitude, location.longitude);
                maps[0].map.setCenter(latLng);
                new google.maps.Marker({position: latLng, map: maps[0].map, draggable: true});
            }
        });
    }
    else
    {
        maps[0].map.setCenter(place.geometry.location);
        maps[0].markers[0].setPosition(place.geometry.location);
    }
});
</script>

location

Do you have any console errors?

yes
location console errors

What version of this package are you using? It appears to be old as the src for marker cluster has changed.

You also appear to be using a reference to an element that doesn't exist document.getElementById('mapaddress')

Also you need to setup your Google Maps API key properly (and also enable a development host), see: https://developers.google.com/maps/documentation/javascript/get-api-key

"cornford/googlmapper": "2.*" (in composer.json)
and document.getElementById('mapaddress') =>(my Bad!!! i added this id on search input)
but still getting these errors and i have placed API key in vendor/comford/googlemapper/src/config/config.php
'key' => env('GOOGLE_API_KEY', 'AIzaSyAtqWsq5Ai3G***********'
location consoleerrors

It may require you to re-publish the package assets, as version 2.37.0 has the correct path for marker clusters (Ensure you are up to date by running composer update). This can be done by running: php artisan vendor:publish --provider="Cornford\Googlmapper\MapperServiceProvider" --tag=googlmapper --force

The api key should live within your packages app/config/packages/cornford/googlmapper/config.php under the key variable.

Furthermore you API key doesnt appear to have permissions to run the palces api.

I have done all the tasks you have asked me to do. thanks for that but still its not working correctly
billingerror

i think we are close to solve this issue so please help me to get over this problem i'll be thankful to you sir

should i use this script in blade file or not

<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCGC**********&libraries=places"></script>

You shouldn't need to add the script yourself, it should be added by the render method.

As for the billing, you need to enable this on your Google account to get rid of that error, along with add some restrictions:

Screenshot at 2020-06-24 19-11-34

still have same problem auto complete is not working showing this error given below
This page can't load google map correctly
in Script link we use this. i think something like this is missing in my code or my java Script function is not working
libraries=places
guide me please i am stucked and working since last three day on maps

in my controller
Mapper::map(31.5204, 74.3587, ['eventAfterLoad' => "searchmap()"]);
and script function is

<script>
function searchmap() {
console.log('working');
  var ac = new google.maps.places.Autocomplete(
    (document.getElementById('location')), {
      types: ['geocode']
    });

  ac.addListener('place_changed', function() {

    var place = ac.getPlace();

    if (!place.geometry) {
      // User entered the name of a Place that was not suggested and
      // pressed the Enter key, or the Place Details request failed.
      // Do anything you like with what was entered in the ac field.
      console.log('You entered: ' + place.name);
      return;
    }

    console.log('You selected: ' + place.formatted_address);
  });
}

</script>

whats wrong with this code
Thank You

Your script will need to be after the {!! Mapper::render() !!} call in your template.

The places library is already included as part of this library.

What does your template look like?

Thanks for reply long waited

{!! Mapper::renderJavascript() !!}
@extends(Auth::guard('admin')->check() ? 'layouts.adminapp' : 'layouts.sadminapp')
@section('content') 
<div class="col-lg-12"><center><h2 class="bg-primary">Location on map</h2></center></div>
<div class="col-md-8 col-md-offset-2">
            <div class="panel panel-default">
                <div class="panel-heading" style="background: grey;"><center><h3 style="font-family:cursive;">Academy Location Form</h3></center></div>

                <div class="panel-body bg-info">
                  {!! Form::open(array('action' => 'locationController@store','method' => 'POST','id'=>'form_location')) !!}
                <div class="form-group col-lg-12">
                  {{Form::label('address','Address Manual')}}
                  {{Form::text('address','',['class'=>'form-control','placeholder'=>'Address here','id'=>"Manual",'name'=>"address"])}} 
                </div>
                <div class="form-group col-lg-12">
                  {{Form::label('lati','Latitude')}}
                  {{Form::text('latitude','',['class'=>'form-control','placeholder'=>'Latitude','id'=>"lat",'name'=>"lati"])}} 
                </div>
                <div class="form-group col-lg-12">
                  {{Form::label('longi','Longitude')}}
                  {{Form::text('longitude','',['class'=>'form-control','placeholder'=>'Longitude','name'=>'long','id'=>'long'])}}
                </div>

                  <div class="form-group col-lg-12">
                    {{Form::label('Search','Search Places Here')}}
                   {{ Form::input('text','location','',['id' => 'location', 'class' => 'form-control']) }}
                  </div>
                   {{--   --}}
                   <div class="form-group col-lg-12">
                  <div style="height: 600px;width: 90%" id="map"> {!! Mapper::render() !!}</div>
                  </div>
                <div class="col-lg-12">
                  <center>{{Form::Submit('Submit Location',['class' => 'btn btn-success btn-lg'])}}</center>
                </div>
                  {!! Form::close() !!}
</div>
</div>
</div>
 @endsection
 @section('javascript')
<script>
function searchmap() {
var autocomplete = new google.maps.places.Autocomplete($("#location")[0], {});
console.log(autocomplete);
google.maps.event.addListener(autocomplete, 'place_changed', function(){
    var place = autocomplete.getPlace();
     console.log(place.address_components);
    if(!place.geometry)
    {
        //This is where I believe I need to do the ajax request.
        console.log('Getting here on form submit with just a zip code. Not using an autocomplete selection.');
    }

    maps[0].map.setCenter(place.geometry.location);
    maps[0].markers[0].setPosition(place.geometry.location);
});
}
</script>
@endsection

in controller to load map

Mapper::map(31.5204, 74.3587, ['eventAfterLoad' => "searchmap()"])->->marker(31.5204, 74.3587,['markers' => ['symbol' => 'circle', 'scale' => 1000,], 'animation' => 'DROP', 'draggable' =>true,'eventDragEnd' =>"(document.getElementById('lat').value=(event.latLng.lat())); (document.getElementById('long').value=(event.latLng.lng()))"]);
             return view ('sadminpages.location.create');

Api using
apiuseing
version using
cornford/googlmapper v2.37.0 An easy way to integrate Google Maps with Laravel.

how can i use callback function which runs after i type something in searchbox.

{!! Mapper::render() !!}
<input type='text' id='location'>

<script>
var input = document.getElementById('location');
var autocomplete = new google.maps.places.Autocomplete(input);

autocomplete.addListener('place_changed', function() {
    var place = autocomplete.getPlace();

    if (!place.geometry) {
        window.alert('No details available for input: ' + place.name);
        return;
    }

    maps[0].map.setCenter(place.geometry.location);
    maps[0].markers[0].setPosition(place.geometry.location);
});
</script>

You need to enable billing on your account for this to work!

I got it. i have to enable billing.
you are such a humble person very cooperative and helped me a lots.best wishes for you man.again thanks for your time :)