Bom pessoal?
Estou apanhando um pouco com o GMap do RichFaces.
Gostaria de salvar a Latitude e a Longitude selecionada em uma instancia do Rich:GMap.
O meu mapa está assim:
<rich:gmap gmapVar="map" style="width:500px; height:500px"
gmapKey="#{gmapBean.gmap_key}" zoom="#{gmapBean.zoom}" id="gmap"
mapType="G_NORMAL_MAP" lat="#{anuncioBean.anuncio.latitude}"
lng="#{anuncioBean.anuncio.longitude}" showGScaleControl="false"
showGLargeMapControl="false" showGMapTypeControl="false"
oninit="InitEventHandler()" />
E logo abaixo dele tenho, por exemplo, dois campos:
<h:outputText value="Latitude: " id="txtLatitude" />
<h:outputText value="--" id="txtInputLatitude" />
<br />
<h:outputText value="Longitude: " id="txtLongitude" />
<h:outputText value="--" id="txtInputLongitude" />
Para a minha página em questão, eu tenho um ManagedBean chamado AnuncioBean.java.
No AnuncioBean, eu possuo o seguinte construtor:
public AnuncioBean()
{
this.anuncio = new Anuncio();
this.anuncio.setLatitude(-21.193935);
this.anuncio.setLongitude(-47.810655);
}
E também nele eu tenho o meu método Cadastrar:
public String cadastrar() {
try {
System.out.println("Latitude : " + this.getAnuncio().getLatitude() + "\nLongitude : " + this.getAnuncio().getLongitude());
this.getAnuncioService().salvar(this.getAnuncio());
} catch (Exception e) {
FacesUtils.adicionarMensagem("base_message", e, "Ocorreu uma falha ao tentar efetuar o cadastro do anuncio.");
return null;
}
FacesUtils.adicionarMensagem("base_message", GenericExceptionMessageType.INFO, "O cadastro do anuncio foi realizado com sucesso!");
this.limpar();
return "sucesso";
}
No construtor eu tenho definido a minha localização Default na qual o Rich:GMap será renderizado:
Construtor do Bean:
…
this.anuncio.setLatitude(-21.193935);
this.anuncio.setLongitude(-47.810655);
…
Página:
<rich:gmap … lat="#{anuncioBean.anuncio.latitude}" lng="#{anuncioBean.anuncio.longitude}" … />
O problema é que ao chamar o meu método Cadastrar do AnuncioBean, ele não está com a Latitude e Longitude atualizada, caso eu altere esses valores andando pelo Rich:GMap. Eu sei que o GMap está com novos valores de Latitude e Longitude, pois através do javascript, eu consigo visualizar esses valores nos campos que eu coloquei abaixo do GMap:
<h:outputText value="--" id="txtInputLatitude" />
e
<h:outputText value="--" id="txtInputLongitude" />
Só que no método Cadastrar do Bean, esses valores (latitude e longitude) ainda estão com os valores Default, -21.193935 e -47.810655 (respectivamente).
Alguém tem alguma idéia de como eu posso atualizar os valores do BEAN???
Pois o valor está sendo atualizado do lado do cliente (javascript). Será que tem como eu atualizar o valor do lado servidor (bean). Até onde eu conheço, só pelo fato dos valores latitude e longitude do meu rich:gmap já estarem vinculados a um atributo no meu Bean, isso deveria funcionar.
<rich:gmap … lat="#{anuncioBean.anuncio.latitude}" lng="#{anuncioBean.anuncio.longitude}" … />
Se for necessário, abaixo está o meu Javascript onde trabalho com o GMap:
<script>
var geocoder;
var address;
function InitEventHandler() {
GEvent.addListener(map, "dblclick", getAddress);
//map.setCenter(new GLatLng(-21.193935, -47.810655), 5);
geocoder = new GClientGeocoder();
}
function getAddress(overlay, latlng) {
if (latlng != null) {
address = latlng;
geocoder.getLocations(latlng, showAddress);
}
}
function showAddress(response) {
map.clearOverlays();
if (!response || response.Status.code != 200) {
alert("Erro ao processar a localizacao escolhida.\nStatus Code:" + response.Status.code);
} else {
place = response.Placemark[0];
point = new GLatLng(place.Point.coordinates[1],
place.Point.coordinates[0]);
var cifraoIcon = new GIcon(G_DEFAULT_ICON);
cifraoIcon.image = "#{facesContext.externalContext.request.contextPath}/img/icones/cifrao_20.png";
markerOptions = { icon:cifraoIcon };
marker = new GMarker(point, markerOptions);
map.addOverlay(marker);
marker.openInfoWindowHtml('<b>orig latlng: </b>' + response.name
+ '<br/>' + '<b>Latitude: </b>' + place.Point.coordinates[1]
+ '<br/>' + '<b>Longitude: </b>' + place.Point.coordinates[0]
+ '<br/>' + '<b>Status Code: </b>' + response.Status.code
+ '<br/>' + '<b>Status Request: </b>' + response.Status.request
+ '<br/>' + '<b>Endereco: </b>' + place.address
+ '<br/>' + '<b>Precisao: </b>' + place.AddressDetails.Accuracy
+ '<br/>' + '<b>Codigo do pais: </b>' + place.AddressDetails.Country.CountryNameCode);
map.setCenter(point);
var obj1 = document.getElementById("form_anuncio_cadastro:txtInputLatitude");
var obj2 = document.getElementById("form_anuncio_cadastro:txtInputLongitude");
obj1.innerHTML = point.x; //poderia ser place.Point.coordinates[1];
obj2.innerHTML = point.y; //poderia ser place.Point.coordinates[0];
}
}
</script>