sf1.1 + sfEasyGMapPlugin (Undefined variable: gMap) dans un partial avec admin generator

1 view
Skip to first unread message

eddie

unread,
Oct 3, 2008, 5:47:41 AM10/3/08
to Symfony-fr
Bonjour,

Je suis sous symfony 1.1 et j'utilise l'admin générator pour mon
backoffice.
J'utilise les plugins sfAdvancedAdminGeneratorPlugin et
sfEasyGMapPlugin.
J'ai bien suivi les instructions données sur "http://www.symfony-
project.org/plugins/sfEasyGMapPlugin" mais j'ai l'erreur suivante :
"Undefined variable: gMap" dans mon partial.

En regardant le cache de _show.php j'ai la ligne suivante :

<?php $value = get_partial('map', array('type' => 'list', 'unite' =>
$unite)); echo $value ? $value : '&nbsp;' ?>

cela explique pourquoi j'ai Undefined variable sur $gMap parce que la
variable n'est pas transmise au partial dans le array.

Donc comment je dois procéder pour transmettre une variable à un
partial en gardant l'admin generator ?

Pour information si j'écris l'action dans mon partial en modifiant
bien sur $this->gMap par $gMap etc.. j'ai la carte qui s'affiche
correctement mais bon je suis pas sur que sa soit la meilleure façon
de faire.

J'ai dans mon generator.yml :

generator:
class: sfAdvancedAdminGenerator
param:
model_class: Unite
theme: default

show:
title: Visualisation de « %%nom%% »
display:
"Fiche": [nom, adresse, ville, _map]
actions:
_list:
_edit:

dans mon fichier actions.class.php :

class uniteActions extends autouniteActions
{
public function executeShow()
{
$this->unite = $this->getUniteOrCreate();
if ($this->unite->isNew()) {
return $this->forward('unite', 'create');
}
$this->labels = $this->getLabels();

// google maps
$this->gMap = new GMap();
$address = $this->unite->getAdresse().', '.$this->unite-
>getVille();
$geocoded_address = $this->gMap->geocode($address);
$gMapMarker = new GMapMarker($geocoded_address->getLat(),
$geocoded_address->getLng());
$gMapMarker->addHtmlInfoWindow('<b>'.$this->unite->getNom().'</
b><br />'.$address);
$this->gMap->addMarker($gMapMarker);
$this->gMap->setZoom(14);
$this->gMap->setCenter($lat,$lng);
}
}

et dans le partial _map.php :

use_helper('Javascript','GMap');
include_map($gMap,array('width'=>'100%','height'=>'450px'));
include_map_javascript($gMap);

Fabrice B

unread,
Oct 3, 2008, 5:59:39 AM10/3/08
to Symfony-fr
Salut Eddie,

En fait les variables de l'action ne sont pas accessibles dans les
partials de l'admin generator, un problème que j'ai déjà eu. La
solution c'est de passer par les attributs de la request par exemple.

Dans ton action :
$this->getRequest()->setAttribute('gMap', $this->gMap);

Dans ta template :
$gMap = $sf_request->getAttribute('gMap')

Sinon je te conseille de "cacher" les coordonnées de tes unités. La
fonction geocode utilise un webservice de Google et peut être un peu
lente par moment, donc le mieux c'est de rajouter 3 champs lat, lng,
geo_accuracy dans le modèle de ton unité et de surcharger la
sauvegarde de l'adresse pour recalculer les coordoonées gps qu'à
chaque changement des champs "adresse" et "ville"

J'ai l'intention de faire une extension Doctrine "geocodable" qui
simplifiera tout ça... dès que je me mettrai à Doctrine :-)

A+

Fabrice

eddie

unread,
Oct 3, 2008, 8:39:21 AM10/3/08
to Symfony-fr
Merci de ta réponse rapide sa fonctionne à présent,

J'ai effectivement mis les champs lat, lng dans ma table afin de
permettre lors de l'édition de positionner le point manuellement, mais
cette partie je ne sais pas encore comment je vais la faire. En fait
dans mon action show je check les champs lat et lng si ils ne sont pas
renseigné j'essaye de positionner le point avec l'adresse.

++ et merci encore

Fabrice B

unread,
Oct 3, 2008, 1:10:10 PM10/3/08
to Symfony-fr
> J'ai effectivement mis les champs lat, lng dans ma table afin de
> permettre lors de l'édition de positionner le point manuellement, mais
> cette partie je ne sais pas encore comment je vais la faire.

Un nouveau sample, basé sur le fait que tu peux ajouter des events à
l'objet carte :

Dans l'action:

$this->gMap = new GMap(12,51.245475,6.821373);

// j'attache à la carte l'évènement click que je relie à une
fonction perso get_click_coord
$gMapEvent = new GMapEvent('click',"get_click_coord",false);
$this->gMap->addEvent($gMapEvent);

// jet mets un marker sur la carte qui sera dans la variable
javascript globale 'marker', pour la réutiliser ensuite dans
get_click_coord
$this->gMap->addGlobalVariable('marker','null');
$gMapMarker = new GMapMarker(51.245475,6.821373,'marker');
$this->gMap->addMarker($gMapMarker);

Dans la template:

<?php use_helper('Javascript','GMap') ?>
<?php
include_map($gMap,array('width'=>'512px','height'=>'400px')); ?>

lat: <input type="text" id="lat" name="lat" />
lng: <input type="text" id="lng" name="lng" />

<?php include_map_javascript($gMap); ?>
<?php echo javascript_tag("
var get_click_coord = function(overlay,latlng)
{
marker.setLatLng(latlng);
document.getElementById('lat').value = latlng.lat();
document.getElementById('lng').value = latlng.lng();
}
") ?>

C'est un exemple basique mais qui remplit la fonction cherchée quand
il est couplé avec le helper include_search_location_form() (qui
permet de chercher un endroit sur la carte)

eddie

unread,
Oct 5, 2008, 11:11:15 AM10/5/08
to Symfony-fr
Merci pour le code sa va me faire gagner un temps précieux.
Je n'ai pas encore eu le temps de l'intégrer à mon appli mais sa ne
serait tarder.
++
Reply all
Reply to author
Forward
0 new messages