help manejo mapas yii

amigos estoy empezando con el manejo de mapas y localizacion, estoy haciendo una aplicacion que al loguearse el usuario

y al darle click en un boton me guarde las coordenadas (lat,long) de donde esta en la base de datos, no necesariamente tiene q salir el mapa, y q en otro usuario, pueda ver al seleccionar dicho usuario en el mapa en donde guardo esas coordenadas, me pueden ayudar, michas gracias, estuve colocando la api de google pero no fui capaz, hice esto en el view solo para mostrar algun mapa pero q hace: cuando abro la pagina me trata de mostrar el mapa pero lo esconde en menos de un segundo y desaparece, si alguien me puede ayudar con lo q pido y de paso resolverme la duda del error q tengo gracias

el codigo siguiente es en el view/ubicacionLider/admin


<?php

/* @var $this UbicacionLideresController */

/* @var $model UbicacionLideres */

/* @var $form CActiveForm */

?>


<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'ubicacion-lideres-form',

	// Please note: When you enable ajax validation, make sure the corresponding

	// controller action is handling ajax validation correctly.

	// There is a call to performAjaxValidation() commented in generated controller code.

	// See class documentation of CActiveForm for details on this.

	'enableAjaxValidation'=>false,

)); ?>


	<p class="note">Fields with <span class="required">*</span> are required.</p>


	<?php echo $form->errorSummary($model); ?>


	<div class="row">

		<?php echo $form->labelEx($model,'id_lider'); ?>

		<?php echo $form->textField($model,'id_lider',array('size'=>20,'maxlength'=>20)); ?>

		<?php echo $form->error($model,'id_lider'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'latitud'); ?>

		<?php echo $form->textField($model,'latitud'); ?>

		<?php echo $form->error($model,'latitud'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'longitud'); ?>

		<?php echo $form->textField($model,'longitud'); ?>

		<?php echo $form->error($model,'longitud'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'fecha'); ?>

		<?php echo $form->textField($model,'fecha'); ?>

		<?php echo $form->error($model,'fecha'); ?>

	</div>


	<div class="row buttons">

		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>

	</div>

        <?php $this->endWidget(); ?>

</div><!-- form -->








   <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>

    <script type="text/javascript">

var map;

function initialize() {

  var mapOptions = {

    zoom: 8,

    center: new google.maps.LatLng(-34.397, 150.644)

  };

  map = new google.maps.Map(document.getElementById('map-canvas'),

      mapOptions);

}


google.maps.event.addDomListener(window, 'load', initialize);


    </script>

   

<div id="map-canvas">

    <div id="map_canvas" style="width:100%; height:400px"></div>

    <div id="crosshair"></div>

</div>

    <div id="map-canvas"></div>



Buenas, no sé si será por eso pero tienes 3 div con el mismo id.

Supongo que te cogerá el último que no tiene ni altura ni anchura (las cuáles son obligatorias para uso de mapas, creo).

Pon algo así:




<div id="parentMap">

    <div id="map_canvas" style="width:100%; height:400px"></div>

    <div id="crosshair"></div>

</div>



Un saludo.

amigo el probelma q tengo es el siguiente, en ultimas necesito es obtener las coordenadas y enviarlas a la base de datos

yo pego en el view ‘_form’ este codigo


<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>


    <script>

// Note: This example requires that you consent to location sharing when

// prompted by your browser. If you see a blank space instead of the map, this

// is probably because you have denied permission for location sharing.


var latitud;


function initialize() {

  // Try HTML5 geolocation

  if(navigator.geolocation) {

    navigator.geolocation.getCurrentPosition(function(position) {

      var pos = new google.maps.LatLng(position.coords.latitude,

                                       position.coords.longitude);


     latitud=position.coords.latitude;

     window.alert(latitud);

     

    


    }, function() {

      handleNoGeolocation(true);

      

    });

  } else {

      

    // Browser doesn't support Geolocation

    handleNoGeolocation(false);

  }

}

google.maps.event.addDomListener(window, 'load', initialize);


     </script>

se q el esta tomando las coordenadas porq lo muestra mediante el alert, yo quiero q me guarde las coordenadas en la base de datos, haciendo pruebas hice q mediante el get.elementbyid() los pusiera en un textfield y al darle el boton guardar me dice q falta llenar esos campos, visualmente los muestra pero no los toma,

lo q quiero es q se guarden directamente en la base de datos pero no se como enviarlos, gracias

Buenas konan.

Lo que tienes que hacer es una llamada AJAX una vez recuperas las coordenadas:




...

  if(navigator.geolocation) {

    navigator.geolocation.getCurrentPosition(function(position) {

      var pos = new google.maps.LatLng(position.coords.latitude,

                                       position.coords.longitude);


     //latitud=position.coords.latitude;

     //window.alert(latitud);


     $.ajax(

           {

               url  : "<?php echo Yii::app()->createUrl('controlador/accion'); ?>",

               type : "POST",

               data : {latitud : positions.coords.latitude, longitud : positions.coords.longitude}, 

               success : function(data)

                         {

                             if($.trim(data) == 'lo que devuelvas')

                                 alert("Coordenadas guardadsa correctamente");

                             else

                                 alert("Error guardando coordenadas.");

                         }

           });


....

....



Lo que tienes que tener es una acción en tu controlador que recoga los datos POST que envías por AJAX, que serán




$_POST['latitud']

$_POST['longitud']



y guardarlos en la base de datos. Y por ejemplo si no hubo error haces un




echo('1');



al final de la acción, y si hubo error haces




echo('0');



Esto será lo que tienes que comprobar en




...

if($.trim(data) == 'lo que devuelvas')

...



Por ejemplo:




...

if($.trim(data) == '1')

...

else

...



Un saludo.

me da error, me sale esto :Undefined index: latitud voy a colocar todo el codigo, yo lo q quiero e q cuando cargue el ubicacionLideres/create me tome las coordenadas y me las muestre en un textfuiedl, para ver si me las esta cogiendo, despues de la prueba ps solo mostrare un mensaje y quitare los textfield, pero inicilmente quiero verlos en el textfield. ay pongo mi codigo:

en la vista view/ubicacionLideres/_form:


<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>

<script>

var latitud;

var longitud;

function initialize() {

  // Try HTML5 geolocation

  if(navigator.geolocation) {

    navigator.geolocation.getCurrentPosition(function(position) {

      var pos = new google.maps.LatLng(position.coords.latitude,

                                       position.coords.longitude);


     latitud=position.coords.latitude;

     longitud=position.coords.longitude;

     $.ajax(

           {

               url  : "<?php echo Yii::app()->createUrl('UbicacionLideres/create'); ?>",

               type : "POST",

               data : {latitud : latitud, longitud : longitud}, 

               success : function(data)

                         {

                             alert($.trim(data));

                             if($.trim(data) == "lo que devuela")

                                 alert("Coordenadas guardadsa correctamente");

                             else

                                 alert("Error guardando coordenadas.");

                         }

           });

 

    


    }, function() {

      handleNoGeolocation(true);

      

    });

  } else {

      

    // Browser doesn't support Geolocation

    handleNoGeolocation(false);

  }

}

google.maps.event.addDomListener(window, 'load', initialize);

</script>

en el controlador: ubicacionLideresController la parte del create


public function actionCreate()

	{

        	$model=new UbicacionLideres;

                $model->id_usuario=Yii::app()->user->id;

                $model->fecha=date('y-m-d');

               $model->latitud=$_POST['latitud'];

               $model->longitud=$_POST['longitud'];

                if(isset($_POST['UbicacionLideres']))

		{

                    	$model->attributes=$_POST['UbicacionLideres'];

			if($model->save())

                           

				$this->redirect(array('admin'));

		}


		$this->render('create',array(

			'model'=>$model,

		));

	}

y me sale ese error q comente al incio com si no reconociera la variable

Es q la primera vez q te carga el create no tienes POST con las variables latitud y longitud!!!!

El código JavaScript está en la view, no en el controlador. Entonces como primero se carga el controlador, no tienes latitud y longitud en POST.

El código funciona pq lo acabo de probar.

Haz lo siguiente:




public function actionCreate()

        {

                $model=new UbicacionLideres;


                if(isset($_POST['UbicacionLideres']))

                {

                     $model->attributes=$_POST['UbicacionLideres'];


                     $model->id_usuario=Yii::app()->user->id;

                     $model->fecha=date('y-m-d');


                     // Esto sólo lo quieres hacer si la petición es mediante AJAX

                     if(Yii::app()->request->isAjaxRequest)

                     {

                          $model->latitud=$_POST['latitud'];

                          $model->longitud=$_POST['longitud'];

                     }


                     if($model->save() && !Yii::app()->request->isAjaxRequest)  

                          $this->redirect(array('admin'));

                     else

                          Yii::app()->end();

                }


                $this->render('create',array(

                        'model'=>$model,

                ));

        }



Y listo.

De todas formas, yo en lugar de hacerlo en la acción create lo haría en otra acción, es decir, me crearía otra acción para la petición AJAX.

Un saludo.

listo amigo, como lo haria en otra accion para pasar los datos porq estuve intentando pero no me pasa los datos,pero entonces por lo q veo no podria al abrir la pagina ejecutar el intert puesto q no a hecho post, entonces tendria q colocar un boton para q le dieran y ay si registrar registrar, es q necesito q abran esa pagina en un celular y guarden las coordenadas para verlas desde otro y como yii no hace app entonces me toca asi :) ay manera de q una vez q le den en el boton cada cierto tiempo guarde las coordenadas? gracias

konan, lo que yo te puse actualiza (mediante POST) automáticamente, siempre y cuando lances la función initialize() al cargar la página!!!!!!

Por ejemplo, antes del div de tu mapa escribes:




<script>

 initialize();

</script>



Y listo.

Ten en cuenta que esta función se ejecutará siempre que cargues esta vista, por lo que las coordenadas se actualizarán cada vez.

Para ponerlo en otra acción, creas la acción y haces allí el save().

Un saludo.