ayuda con traer consulta de un model

hola amigos lo q quiero hacer es lo siguiente, en mi vista tengo un cGridView donde muestro unos usuarios y su ubicacion guardada y alli tengo un un chtml:link en cada fila del cgridView en el cual cuando de click quiero q vaya a mi modelo y me consulte todos los registros de ese usuario y me los grafique, tengo lo siguiente en el modelo

UbicacionLideres


public function search()

	{

            $criteria=new CDbCriteria;

            //aca traemos la relacion tercero con usuarios

            $criteria->with = array('idUsuario.idTercero');

            //alias tabla ubicacionLideres

            $criteria->alias='t1';

            $criteria->select=array('t1.id_ubicacion','t1.id_usuario','t1.latitud','t1.longitud','t2.fecha');

            //inner join con la misma para sacar la ultima fecha de cada ubicacion

            $criteria->join='inner join(

                            SELECT id_ubicacion,id_usuario, MAX(fecha) AS fecha

                            FROM ubicacion_lideres

                            GROUP BY id_usuario

                            ) t2  ON T1.id_usuario= t2.id_usuario

                            AND t1.fecha = t2.fecha';

            //$criteria->compare('t2.fecha',$this->fecha,true);

            $criteria->compare('idTercero.nombre',$this->nombre,true);


            return new CActiveDataProvider($this, array(

                            'criteria'=>$criteria,

            ));

	}

el codigo anterior me muestra todos los usuarios una vez, pues cada usuario puede registrar su ubicacion muchas veces.


 public function getListarUbicacionLider($id_usuario)

    {

           //$id_usuario = $_GET['id_usuario'];

            $criteria=new CDbCriteria;

            $criteria->condition = 'id_usuario=:id_usuario';

            $criteria->params = array(':id_usuario'=>$id_usuario);

            $ubicaciones =  UbicacionLideres::model()->findAll($criteria);

            $lista = array();

            foreach($ubicaciones as $v)

                $lista[] = array($v->latitud, $v->longitud,$v->idUsuario->idTercero->nombre);

            return $lista;

    } 

este codigo anterior es el q me consultaria despues de seleccionar un registro del gridview, las veces q se encuentra en la BD, esto lo hago en el modelo…

en la vista tengo lo siguiente




<?php $this->widget('zii.widgets.grid.CGridView', array(

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

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

            array(

                   'name'=>'id_usuario', 

                   'header'=>'Nombre del Lider',

                   'value'=>'$data->idUsuario->idTercero->nombre',

                   'htmlOptions'=>array('style'=>'width:400px;'),

                   'filter' => CHtml::activeTextField($model,'nombre'),

		),

            array(

            'name'=>'fecha',

            'filter' => false, // para que no se muestre el campo de filtrar para el atributo direccion

            ),

            array(

                'header' => '',

                'type' => 'raw',

                'value' => 'CHtml::link("Ver Ubicacion", null, array("onclick" => "javascript:cargarmap($data->id_usuario)", "class" => "btn"))',

                'htmlOptions' => array('style'=>'cursor: pointer;','width'=>'75px')

        ),

		

)));?>


<div id="mapholder"></div>

<script src="http://maps.google.com/maps/api/js?sensor=false"></script>

<script type="text/javascript">


 function cargarmap(id_usuario){

        window.alert(id_usuario);

    navigator.geolocation.getCurrentPosition(showPosition,showError);

    function showPosition(position){

        mapholder=document.getElementById('mapholder')

        mapholder.style.height='500px';

        mapholder.style.width='900px';

        latlon=new google.maps.LatLng(7.122980000000001, -73.12817999999999);

        var marcadores= <?php echo json_encode($model->ListarUbicacionLider(id_usuario))  ?>;

        

        var myOptions={

        center:latlon,

        zoom:15,

        mapTypeId:google.maps.MapTypeId.ROADMAP,

        mapTypeControl:false,

        disableDoubleClickZoom:false,

        navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL}

        };

        var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

        var marker,i;

        var geocoder = new google.maps.Geocoder();

        var titulo;

        for( i=0;i<marcadores.length;i++)

        {

            

            lat=marcadores[i][0];

            lon=marcadores[i][1];

            latlon=new google.maps.LatLng(lat, lon);

            marker=new google.maps.Marker({position:new google.maps.LatLng(lat,lon),map:map});

            marker.setMap(map);

            var infowindow = new google.maps.InfoWindow({

                content: 'lathola'});

              

var usuario;

usuario= marcadores[i][2];

(function(marker, latlon,usuario){  

    google.maps.event.addListener(marker, 'click', function() {

        geocoder.geocode({'latLng': latlon},  function (results, status) {

            if (status == google.maps.GeocoderStatus.OK) {

                if (results[1]) {

                    infowindow.setContent('Lider: '+usuario+',<p> ' +results[1].formatted_address+'</p>');

                    infowindow.open(map, marker);

                }

            } else {

                alert("Problema al encontrar la dirección: " + status);

            }

        });

    });

})(marker,latlon,usuario);

               /*geocoder.geocode({'latLng': latlon},  function (results, status) {

                

                if (status == google.maps.GeocoderStatus.OK) {

                    

                    if (results[1]) {

                      //  var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

                        marker=new google.maps.Marker({position:new google.maps.LatLng(lat,lon),map:map,title:results[0].formatted_address});

                        marker.setMap(map);

                    }

                } else {

                    alert("Geocoder failed due to: " + status);

                }

                   

            });*/

        }

} 

        function showError(error){

            switch(error.code){

                case error.PERMISSION_DENIED:

                  x.innerHTML="Denegada la peticion de Geolocalización en el navegador."

                  break;

                case error.POSITION_UNAVAILABLE:

                  x.innerHTML="La información de la localización no esta disponible."

                  break;

                case error.TIMEOUT:

                  x.innerHTML="El tiempo de petición ha expirado."

                  break;

                case error.UNKNOWN_ERROR:

                  x.innerHTML="Ha ocurrido un error desconocido."

                  break;

        }

    }   

}  

</script>

este codigo anterior es en donde tengo problema porq no se como mandarle el id_usuario para q me llene

[b] var marcadores= <?php echo json_encode($model->ListarUbicacionLider(id_usuario)) ?>;

[/b] y q me devuelva los registros, gracias y espero haberme hecho entender

alguien q sepa

Sin mirar nada del mapa la funcion:




var marcadores= <?php echo json_encode($model->ListarUbicacionLider(id_usuario)) ?>; //<-$id_usuario



te falta el $ en la variable de php, si pones bien esa variable, yo creo que te devolverá el array de puntos que necesitas.

saludos

si pero el id_usuario viene del javascript o de lo q seleccione en el grid

Cuidado, tienes una variable id_usuario en javascript y una variable $id_usuario en php.

La de php se ejecuta en el servidor y la de javascript en el cliente. La linea:




var marcadores= <?php echo json_encode($model->ListarUbicacionLider(id_usuario)) ?>;



tiene una parte en javascript => var marcadores= … ;

y una parte en php => <?php echo json_encode($model->ListarUbicacionLider(id_usuario)) ?>

la variable id_usuario dentro de la funcion ListarUbicacionLider es de php, debe llevar $.

Lo que buscas es, pulsar en el gridview y que javascript tome el id_usuario (esto creo que lo tienes)

y luego te falta una parte que es un ajax que recarga el array marcadores.

Por ajax se hace una llamada al servidor para que busque los datos, ahí se ejecutará la función:




public function actionXxxxx($id_usuario)

{

	....

	echo json_encode($model->ListarUbicacionLider($id_usuario));

}



Es decir, por cada pulsación para ver los datos de un usuario se genera una petición al servidor y este devuelve el array de puntos.

Esto lo puedes ver con firebug o similares.

De primeras sustituye id_usuario por un valor válido de usuario y mira que se forme una ruta en el mapa y luego ya haces el ajax para que sea dinámico.

saludos