Return to Snippet

Revision: 24505
at March 2, 2010 17:10 by rccc


Updated Code
class sfWidgetFormGeocoder extends sfWidgetForm
{
	public function configure($options = array(), $attributes = array())
	{
		$this->addOption('address.options', array('style' => 'width:400px'));

		$this->setOption('default', array(
      'address' => '',
      'lon' => '1.913899',
      'lat' => '47.900486'
      ));

      $this->addOption('div.class', 'geocoder-widget');
      $this->addOption('map.height', '300px');
      $this->addOption('map.width', '500px');
      $this->addOption('map.style', "");
      $this->addOption('lookup.name', "");

      $this->addOption('template.html', '
      <div id="{div.id}" class="{div.class}">
        {input.search} <input type="submit" value="{input.lookup.name}"  id="{input.lookup.id}" /> <br />
        {input.lon}
        {input.lat}
        <div id="{map.id}" style="width:{map.width};height:{map.height};{map.style}"></div>
      </div>
    ');

      $this->addOption('template.javascript', '
      <script type="text/javascript">
      	
		    (function() {
				
		    	var $submit = document.getElementById("{input.lookup.id}");
		    	var $address = document.getElementById("{input.address.id}");
		    	var $lat = document.getElementById("{input.lat.id}");
					var $lon = document.getElementById("{input.lon.id}");	   	
					
			    var map = new GMap2(document.getElementById("{map.id}"));
			    var center = new GLatLng( $lat.value||47.900486, $lon.value||1.913899);		
			    var marker = new GMarker(center, {draggable: true}); 
			    var geocoder = new GClientGeocoder();
			    			         				    
			    map.addControl(new GSmallMapControl());
			    map.addControl(new GMapTypeControl());
			    map.setCenter(center, 5);
     			map.addOverlay(marker);     			
					setPosition(center);		
					
			    GEvent.addListener(marker, "dragend", function() {
				  	var point = marker.getPoint();
				 		map.panTo(point);
						setPosition(point);
       		});

			    GEvent.addListener(map, "moveend", function() {
			    	var point = map.getCenter()
						marker.setLatLng(point);
						setPosition(point);
			   	});

			  	$submit.onclick = function(){showAddress($address.value)};
			   
		  	  function showAddress() {
		  	    if(!arguments[0]) return false;
		  	   	  var address = arguments[0];
				      if (geocoder) {
				       	geocoder.getLatLng(address, function(point) {
							    if (!point) {
							      alert(address + " not found");
							    }else{
							      setPosition(point);
										map.setCenter(point, 14);
							    }
							  });
				      }
				    }  
					   
					function setPosition(){					
					  $lat.value = arguments[0].lat();
						$lon.value = arguments[0].lng();		
				 	}
			 	
 				})();
      </script>
    ');
	}

	public function getJavascripts()
	{
		return array('');
	}

	public function render($name, $value = null, $attributes = array(), $errors = array())
	{
		// define main template variables
		$template_vars = array(
      '{div.id}'             => $this->generateId($name),
      '{div.class}'          => $this->getOption('div.class'),
      '{map.id}'             => $this->generateId($name.'[map]'),
      '{map.style}'          => $this->getOption('map.style'),
      '{map.height}'         => $this->getOption('map.height'),
      '{map.width}'          => $this->getOption('map.width'),
      '{input.lookup.id}'    => $this->generateId($name.'[lookup]'),
      '{input.lookup.name}'  => $this->getOption('lookup.name'),
      '{input.address.id}'   => $this->generateId($name.'[address]'),
      '{input.lat.id}'  => $this->generateId($name.'[lat]'),
      '{input.lon.id}' => $this->generateId($name.'[lon]'),
		);

		// v���©rifie si la valeur est valide
		$value = !is_array($value) ? array() : $value;
		$value['address']   = isset($value['address'])   ? $value['address'] : '';
		$value['lon'] = isset($value['long']) ? $value['lon'] : '';
		$value['lat']  = isset($value['lat'])  ? $value['lat'] : '';

		// d���©finit le widget pour le champ adresse
		$address = new sfWidgetFormInputText(array(), $this->getOption('address.options'));
		$template_vars['{input.search}'] = $address->render($name.'[address]', $value['address']);

		// d���©finit les widgets pour les champs : longitude et latitude
		$hidden = new sfWidgetFormInputText;
		$template_vars['{input.lon}'] = $hidden->render($name.'[lon', $value['lon']);
		$template_vars['{input.lat}']  = $hidden->render($name.'[lat]', $value['lat']);

		// assemble le mod���¨le avec les valeurs
		return strtr(
		$this->getOption('template.html').$this->getOption('template.javascript'),
		$template_vars
		);
	}
}


class sfValidatorGeocoder extends sfValidatorBase
{
  protected function doClean($value)
  {
    if (!is_array($value))
    {
      throw new sfValidatorError($this, 'invalid');
    }
 
    try
    {
      $latitude = new sfValidatorNumber(array( 'min' => -90, 'max' => 90, 'required' => true ));
      $value['lat'] = $latitude->clean(isset($value['lat']) ? $value['lat'] : null);
 
      $longitude = new sfValidatorNumber(array( 'min' => -180, 'max' => 180, 'required' => true ));
      $value['lon'] = $longitude->clean(isset($value['lon]) ? $value['lon'] : null);
 
      $address = new sfValidatorString(array( 'min_length' => 10, 'max_length' => 255, 'required' => true ));
      $value['address'] = $address->clean(isset($value['address']) ? $value['address'] : null);
    }
    catch(sfValidatorError $e)
    {
      throw new sfValidatorError($this, 'invalid');
    }
 
    return $value;
  }
}

Revision: 24504
at March 2, 2010 17:07 by rccc


Updated Code
class sfWidgetFormGeocoder extends sfWidgetForm
{
	public function configure($options = array(), $attributes = array())
	{
		$this->addOption('address.options', array('style' => 'width:400px'));

		$this->setOption('default', array(
      'address' => '',
      'lon' => '1.913899',
      'lat' => '47.900486'
      ));

      $this->addOption('div.class', 'geocoder-widget');
      $this->addOption('map.height', '300px');
      $this->addOption('map.width', '500px');
      $this->addOption('map.style', "");
      $this->addOption('lookup.name', "");

      $this->addOption('template.html', '
      <div id="{div.id}" class="{div.class}">
        {input.search} <input type="submit" value="{input.lookup.name}"  id="{input.lookup.id}" /> <br />
        {input.lon}
        {input.lat}
        <div id="{map.id}" style="width:{map.width};height:{map.height};{map.style}"></div>
      </div>
    ');

      $this->addOption('template.javascript', '
      <script type="text/javascript">
      	
		    (function() {
				
		    	var $submit = document.getElementById("{input.lookup.id}");
		    	var $address = document.getElementById("{input.address.id}");
		    	var $lat = document.getElementById("{input.lat.id}");
					var $lon = document.getElementById("{input.lon.id}");	   	
					
			    var map = new GMap2(document.getElementById("{map.id}"));
			    var center = new GLatLng( $lat.value||47.900486, $lon.value||1.913899);		
			    var marker = new GMarker(center, {draggable: true}); 
			    var geocoder = new GClientGeocoder();
			    			         				    
			    map.addControl(new GSmallMapControl());
			    map.addControl(new GMapTypeControl());
			    map.setCenter(center, 5);
     			map.addOverlay(marker);     			
					setPosition(center);		
					
			    GEvent.addListener(marker, "dragend", function() {
				  	var point = marker.getPoint();
				 		map.panTo(point);
						setPosition(point);
       		});

			    GEvent.addListener(map, "moveend", function() {
			    	var point = map.getCenter()
						marker.setLatLng(point);
						setPosition(point);
			   	});

			  	$submit.onclick = function(){showAddress($address.value)};
			   
		  	  function showAddress() {
		  	    if(!arguments[0]) return false;
		  	   	  var address = arguments[0];
				      if (geocoder) {
				       	geocoder.getLatLng(address, function(point) {
							    if (!point) {
							      alert(address + " not found");
							    }else{
							      setPosition(point);
										map.setCenter(point, 14);
							    }
							  });
				      }
				    }  
					   
					function setPosition(){					
					  $lat.value = arguments[0].lat();
						$lon.value = arguments[0].lng();		
				 	}
			 	
 				})();
      </script>
    ');
	}

	public function getJavascripts()
	{
		return array('');
	}

	public function render($name, $value = null, $attributes = array(), $errors = array())
	{
		// define main template variables
		$template_vars = array(
      '{div.id}'             => $this->generateId($name),
      '{div.class}'          => $this->getOption('div.class'),
      '{map.id}'             => $this->generateId($name.'[map]'),
      '{map.style}'          => $this->getOption('map.style'),
      '{map.height}'         => $this->getOption('map.height'),
      '{map.width}'          => $this->getOption('map.width'),
      '{input.lookup.id}'    => $this->generateId($name.'[lookup]'),
      '{input.lookup.name}'  => $this->getOption('lookup.name'),
      '{input.address.id}'   => $this->generateId($name.'[address]'),
      '{input.lat.id}'  => $this->generateId($name.'[lat]'),
      '{input.lon.id}' => $this->generateId($name.'[lon]'),
		);

		// v�©rifie si la valeur est valide
		$value = !is_array($value) ? array() : $value;
		$value['address']   = isset($value['address'])   ? $value['address'] : '';
		$value['lon'] = isset($value['long']) ? $value['lon'] : '';
		$value['lat']  = isset($value['lat'])  ? $value['lat'] : '';

		// d�©finit le widget pour le champ adresse
		$address = new sfWidgetFormInputText(array(), $this->getOption('address.options'));
		$template_vars['{input.search}'] = $address->render($name.'[address]', $value['address']);

		// d�©finit les widgets pour les champs : longitude et latitude
		$hidden = new sfWidgetFormInputText;
		$template_vars['{input.lon}'] = $hidden->render($name.'[lon', $value['lon']);
		$template_vars['{input.lat}']  = $hidden->render($name.'[lat]', $value['lat']);

		// assemble le mod�¨le avec les valeurs
		return strtr(
		$this->getOption('template.html').$this->getOption('template.javascript'),
		$template_vars
		);
	}
}

Revision: 24503
at March 2, 2010 17:07 by rccc


Updated Code
class sfWidgetFormGeocoder extends sfWidgetForm
{
	public function configure($options = array(), $attributes = array())
	{
		$this->addOption('address.options', array('style' => 'width:400px'));

		$this->setOption('default', array(
      'address' => '',
      'lon' => '1.913899',
      'lat' => '47.900486'
      ));

      $this->addOption('div.class', 'geocoder-widget');
      $this->addOption('map.height', '300px');
      $this->addOption('map.width', '500px');
      $this->addOption('map.style', "");
      $this->addOption('lookup.name', "");

      $this->addOption('template.html', '
      <div id="{div.id}" class="{div.class}">
        {input.search} <input type="submit" value="{input.lookup.name}"  id="{input.lookup.id}" /> <br />
        {input.lon}
        {input.lat}
        <div id="{map.id}" style="width:{map.width};height:{map.height};{map.style}"></div>
      </div>
    ');

      $this->addOption('template.javascript', '
      <script type="text/javascript">
      	
		    (function() {
				
		    	var $submit = document.getElementById("{input.lookup.id}");
		    	var $address = document.getElementById("{input.address.id}");
		    	var $lat = document.getElementById("{input.lat.id}");
					var $lon = document.getElementById("{input.lon.id}");	   	
					
			    var map = new GMap2(document.getElementById("{map.id}"));
			    var center = new GLatLng( $lat.value||47.900486, $lon.value||1.913899);		
			    var marker = new GMarker(center, {draggable: true}); 
			    var geocoder = new GClientGeocoder();
			    			         				    
			    map.addControl(new GSmallMapControl());
			    map.addControl(new GMapTypeControl());
			    map.setCenter(center, 5);
     			map.addOverlay(marker);     			
					setPosition(center);		
					
			    GEvent.addListener(marker, "dragend", function() {
				  	var point = marker.getPoint();
				 		map.panTo(point);
						setPosition(point);
       		});

			    GEvent.addListener(map, "moveend", function() {
			    	var point = map.getCenter()
						marker.setLatLng(point);
						setPosition(point);
			   	});

			  	$submit.onclick = function(){showAddress($address.value)};
			   
		  	  function showAddress() {
		  	    if(!arguments[0]) return false;
		  	   	  var address = arguments[0];
				      if (geocoder) {
				       	geocoder.getLatLng(address, function(point) {
							    if (!point) {
							      alert(address + " not found");
							    }else{
							      setPosition(point);
										map.setCenter(point, 14);
							    }
							  });
				      }
				    }  
					   
					function setPosition(){					
					  $lat.value = arguments[0].lat();
						$lon.value = arguments[0].lng();		
				 	}
			 	
 				})();
      </script>
    ');
	}

	public function getJavascripts()
	{
		return array('');
	}

	public function render($name, $value = null, $attributes = array(), $errors = array())
	{
		// define main template variables
		$template_vars = array(
      '{div.id}'             => $this->generateId($name),
      '{div.class}'          => $this->getOption('div.class'),
      '{map.id}'             => $this->generateId($name.'[map]'),
      '{map.style}'          => $this->getOption('map.style'),
      '{map.height}'         => $this->getOption('map.height'),
      '{map.width}'          => $this->getOption('map.width'),
      '{input.lookup.id}'    => $this->generateId($name.'[lookup]'),
      '{input.lookup.name}'  => $this->getOption('lookup.name'),
      '{input.address.id}'   => $this->generateId($name.'[address]'),
      '{input.lat.id}'  => $this->generateId($name.'[lat]'),
      '{input.lon.id}' => $this->generateId($name.'[lon]'),
		);

		// vérifie si la valeur est valide
		$value = !is_array($value) ? array() : $value;
		$value['address']   = isset($value['address'])   ? $value['address'] : '';
		$value['lon'] = isset($value['long']) ? $value['lon'] : '';
		$value['lat']  = isset($value['lat'])  ? $value['lat'] : '';

		// définit le widget pour le champ adresse
		$address = new sfWidgetFormInputText(array(), $this->getOption('address.options'));
		$template_vars['{input.search}'] = $address->render($name.'[address]', $value['address']);

		// définit les widgets pour les champs : longitude et latitude
		$hidden = new sfWidgetFormInputText;
		$template_vars['{input.lon}'] = $hidden->render($name.'[lon', $value['lon']);
		$template_vars['{input.lat}']  = $hidden->render($name.'[lat]', $value['lat']);

		// assemble le modèle avec les valeurs
		return strtr(
		$this->getOption('template.html').$this->getOption('template.javascript'),
		$template_vars
		);
	}
}

Revision: 24502
at March 2, 2010 17:05 by rccc


Updated Code
class sfWidgetFormGeocoder extends sfWidgetForm
{
	public function configure($options = array(), $attributes = array())
	{
		$this->addOption('address.options', array('style' => 'width:400px'));

		$this->setOption('default', array(
      'address' => '',
      'lon' => '1.913899',
      'lat' => '47.900486'
      ));

      $this->addOption('div.class', 'geocoder-widget');
      $this->addOption('map.height', '300px');
      $this->addOption('map.width', '500px');
      $this->addOption('map.style', "");
      $this->addOption('lookup.name', "");

      $this->addOption('template.html', '
      <div id="{div.id}" class="{div.class}">
        {input.search} <input type="submit" value="{input.lookup.name}"  id="{input.lookup.id}" /> <br />
        {input.lon}
        {input.lat}
        <div id="{map.id}" style="width:{map.width};height:{map.height};{map.style}"></div>
      </div>
    ');

      $this->addOption('template.javascript', '
      <script type="text/javascript">
      	
		    (function() {
				
		    	var $submit = document.getElementById("{input.lookup.id}");
		    	var $address = document.getElementById("{input.address.id}");
		    	var $lat = document.getElementById("{input.lat.id}");
					var $lon = document.getElementById("{input.lon.id}");	   	
					
			    var map = new GMap2(document.getElementById("{map.id}"));
			    var center = new GLatLng( $lat.value||47.900486, $lon.value||1.913899);		
			    var marker = new GMarker(center, {draggable: true}); 
			    var geocoder = new GClientGeocoder();
			    			         				    
			    map.addControl(new GSmallMapControl());
			    map.addControl(new GMapTypeControl());
			    map.setCenter(center, 5);
     			map.addOverlay(marker);     			
					setPosition(center);		
					
			    GEvent.addListener(marker, "dragend", function() {
				  	var point = marker.getPoint();
				 		map.panTo(point);
						setPosition(point);
       		});

			    GEvent.addListener(map, "moveend", function() {
			    	var point = map.getCenter()
						marker.setLatLng(point);
						setPosition(point);
			   	});

			  	$submit.onclick = function(){showAddress($address.value)};
			   
		  	  function showAddress() {
		  	    if(!arguments[0]) return false;
		  	   	  var address = arguments[0];
				      if (geocoder) {
				       	geocoder.getLatLng(address, function(point) {
							    if (!point) {
							      alert(address + " not found");
							    }else{
							      setPosition(point);
										map.setCenter(point, 14);
							    }
							  });
				      }
				    }  
					   
					function setPosition(){					
					  $lat.value = arguments[0].lat();
						$lon.value = arguments[0].lng();		
				 	}
			 	
 				})();
      </script>
    ');
	}

	public function getJavascripts()
	{
		return array('');
	}

	public function render($name, $value = null, $attributes = array(), $errors = array())
	{
		// define main template variables
		$template_vars = array(
      '{div.id}'             => $this->generateId($name),
      '{div.class}'          => $this->getOption('div.class'),
      '{map.id}'             => $this->generateId($name.'[map]'),
      '{map.style}'          => $this->getOption('map.style'),
      '{map.height}'         => $this->getOption('map.height'),
      '{map.width}'          => $this->getOption('map.width'),
      '{input.lookup.id}'    => $this->generateId($name.'[lookup]'),
      '{input.lookup.name}'  => $this->getOption('lookup.name'),
      '{input.address.id}'   => $this->generateId($name.'[address]'),
      '{input.lat.id}'  => $this->generateId($name.'[lat]'),
      '{input.lon.id}' => $this->generateId($name.'[lon]'),
		);

		// vérifie si la valeur est valide
		$value = !is_array($value) ? array() : $value;
		$value['address']   = isset($value['address'])   ? $value['address'] : '';
		$value['lon'] = isset($value['long']) ? $value['lon'] : '';
		$value['lat']  = isset($value['lat'])  ? $value['lat'] : '';

		// définit le widget pour le champ adresse
		$address = new sfWidgetFormInputText(array(), $this->getOption('address.options'));
		$template_vars['{input.search}'] = $address->render($name.'[address]', $value['address']);

		// définit les widgets pour les champs : longitude et latitude
		$hidden = new sfWidgetFormInputText;
		$template_vars['{input.lon}'] = $hidden->render($name.'[lon', $value['lon']);
		$template_vars['{input.lat}']  = $hidden->render($name.'[lat]', $value['lat']);

		// assemble le modèle avec les valeurs
		return strtr(
		$this->getOption('template.html').$this->getOption('template.javascript'),
		$template_vars
		);
	}
}

Revision: 24501
at March 2, 2010 17:05 by rccc


Updated Code
class sfWidgetFormGeocoder extends sfWidgetForm
{
public function configure($options = array(), $attributes = array())
{
     $this->addOption('address.options', array('style' => 'width:400px'));

     $this->setOption('default', array(
      'address' => '',
      'lon' => '1.913899',
      'lat' => '47.900486'
      ));

      $this->addOption('div.class', 'geocoder-widget');
      $this->addOption('map.height', '300px');
      $this->addOption('map.width', '500px');
      $this->addOption('map.style', "");
      $this->addOption('lookup.name', "");

      $this->addOption('template.html', '
      <div id="{div.id}" class="{div.class}">
        {input.search} <input type="submit" value="{input.lookup.name}"  id="{input.lookup.id}" /> <br />
        {input.lon}
        {input.lat}
        <div id="{map.id}" style="width:{map.width};height:{map.height};{map.style}"></div>
      </div>
    ');

      $this->addOption('template.javascript', '
      <script type="text/javascript">
      	
          (function() {
				
	    var $submit = document.getElementById("{input.lookup.id}");
	    var $address = document.getElementById("{input.address.id}");
	    var $lat = document.getElementById("{input.lat.id}");
	    var $lon = document.getElementById("{input.lon.id}");	   	
					
            var map = new GMap2(document.getElementById("{map.id}"));
            var center = new GLatLng( $lat.value||47.900486, $lon.value||1.913899);		
	   var marker = new GMarker(center, {draggable: true}); 
	   var geocoder = new GClientGeocoder();
			    			         				    
			    map.addControl(new GSmallMapControl());
			    map.addControl(new GMapTypeControl());
			    map.setCenter(center, 5);
     			map.addOverlay(marker);     			
					setPosition(center);		
					
			    GEvent.addListener(marker, "dragend", function() {
				  	var point = marker.getPoint();
				 		map.panTo(point);
						setPosition(point);
       		});

			    GEvent.addListener(map, "moveend", function() {
			    	var point = map.getCenter()
						marker.setLatLng(point);
						setPosition(point);
			   	});

			  	$submit.onclick = function(){showAddress($address.value)};
			   
		  	  function showAddress() {
		  	    if(!arguments[0]) return false;
		  	   	  var address = arguments[0];
				      if (geocoder) {
				       	geocoder.getLatLng(address, function(point) {
							    if (!point) {
							      alert(address + " not found");
							    }else{
							      setPosition(point);
										map.setCenter(point, 14);
							    }
							  });
				      }
				    }  
					   
					function setPosition(){					
					  $lat.value = arguments[0].lat();
						$lon.value = arguments[0].lng();		
				 	}
			 	
 				})();
      </script>
    ');
	}

	public function getJavascripts()
	{
		return array('');
	}

	public function render($name, $value = null, $attributes = array(), $errors = array())
	{
		// define main template variables
		$template_vars = array(
      '{div.id}'             => $this->generateId($name),
      '{div.class}'          => $this->getOption('div.class'),
      '{map.id}'             => $this->generateId($name.'[map]'),
      '{map.style}'          => $this->getOption('map.style'),
      '{map.height}'         => $this->getOption('map.height'),
      '{map.width}'          => $this->getOption('map.width'),
      '{input.lookup.id}'    => $this->generateId($name.'[lookup]'),
      '{input.lookup.name}'  => $this->getOption('lookup.name'),
      '{input.address.id}'   => $this->generateId($name.'[address]'),
      '{input.lat.id}'  => $this->generateId($name.'[lat]'),
      '{input.lon.id}' => $this->generateId($name.'[lon]'),
		);

		// vérifie si la valeur est valide
		$value = !is_array($value) ? array() : $value;
		$value['address']   = isset($value['address'])   ? $value['address'] : '';
		$value['lon'] = isset($value['long']) ? $value['lon'] : '';
		$value['lat']  = isset($value['lat'])  ? $value['lat'] : '';

		// définit le widget pour le champ adresse
		$address = new sfWidgetFormInputText(array(), $this->getOption('address.options'));
		$template_vars['{input.search}'] = $address->render($name.'[address]', $value['address']);

		// définit les widgets pour les champs : longitude et latitude
		$hidden = new sfWidgetFormInputText;
		$template_vars['{input.lon}'] = $hidden->render($name.'[lon', $value['lon']);
		$template_vars['{input.lat}']  = $hidden->render($name.'[lat]', $value['lat']);

		// assemble le modèle avec les valeurs
		return strtr(
		$this->getOption('template.html').$this->getOption('template.javascript'),
		$template_vars
		);
	}
}

Revision: 24500
at March 2, 2010 17:01 by rccc


Initial Code
class sfWidgetFormGeocoder extends sfWidgetForm
{
	public function configure($options = array(), $attributes = array())
	{
		$this->addOption('address.options', array('style' => 'width:400px'));

		$this->setOption('default', array(
      'address' => '',
      'lon' => '1.913899',
      'lat' => '47.900486'
      ));

      $this->addOption('div.class', 'geocoder-widget');
      $this->addOption('map.height', '300px');
      $this->addOption('map.width', '500px');
      $this->addOption('map.style', "");
      $this->addOption('lookup.name', "");

      $this->addOption('template.html', '
      <div id="{div.id}" class="{div.class}">
        {input.search} <input type="submit" value="{input.lookup.name}"  id="{input.lookup.id}" /> <br />
        {input.lon}
        {input.lat}
        <div id="{map.id}" style="width:{map.width};height:{map.height};{map.style}"></div>
      </div>
    ');

      $this->addOption('template.javascript', '
      <script type="text/javascript">
      	
		    (function() {
				
		    	var $submit = document.getElementById("{input.lookup.id}");
		    	var $address = document.getElementById("{input.address.id}");
		    	var $lat = document.getElementById("{input.lat.id}");
					var $lon = document.getElementById("{input.lon.id}");	   	
					
			    var map = new GMap2(document.getElementById("{map.id}"));
			    var center = new GLatLng( $lat.value||47.900486, $lon.value||1.913899);		
			    var marker = new GMarker(center, {draggable: true}); 
			    var geocoder = new GClientGeocoder();
			    			         				    
			    map.addControl(new GSmallMapControl());
			    map.addControl(new GMapTypeControl());
			    map.setCenter(center, 5);
     			map.addOverlay(marker);     			
					setPosition(center);		
					
			    GEvent.addListener(marker, "dragend", function() {
				  	var point = marker.getPoint();
				 		map.panTo(point);
						setPosition(point);
       		});

			    GEvent.addListener(map, "moveend", function() {
			    	var point = map.getCenter()
						marker.setLatLng(point);
						setPosition(point);
			   	});

			  	$submit.onclick = function(){showAddress($address.value)};
			   
		  	  function showAddress() {
		  	    if(!arguments[0]) return false;
		  	   	  var address = arguments[0];
				      if (geocoder) {
				       	geocoder.getLatLng(address, function(point) {
							    if (!point) {
							      alert(address + " not found");
							    }else{
							      setPosition(point);
										map.setCenter(point, 14);
							    }
							  });
				      }
				    }  
					   
					function setPosition(){					
					  $lat.value = arguments[0].lat();
						$lon.value = arguments[0].lng();		
				 	}
			 	
 				})();
      </script>
    ');
	}

	public function getJavascripts()
	{
		return array('');
	}

	public function render($name, $value = null, $attributes = array(), $errors = array())
	{
		// define main template variables
		$template_vars = array(
      '{div.id}'             => $this->generateId($name),
      '{div.class}'          => $this->getOption('div.class'),
      '{map.id}'             => $this->generateId($name.'[map]'),
      '{map.style}'          => $this->getOption('map.style'),
      '{map.height}'         => $this->getOption('map.height'),
      '{map.width}'          => $this->getOption('map.width'),
      '{input.lookup.id}'    => $this->generateId($name.'[lookup]'),
      '{input.lookup.name}'  => $this->getOption('lookup.name'),
      '{input.address.id}'   => $this->generateId($name.'[address]'),
      '{input.lat.id}'  => $this->generateId($name.'[lat]'),
      '{input.lon.id}' => $this->generateId($name.'[lon]'),
		);

		// vérifie si la valeur est valide
		$value = !is_array($value) ? array() : $value;
		$value['address']   = isset($value['address'])   ? $value['address'] : '';
		$value['lon'] = isset($value['long']) ? $value['lon'] : '';
		$value['lat']  = isset($value['lat'])  ? $value['lat'] : '';

		// définit le widget pour le champ adresse
		$address = new sfWidgetFormInputText(array(), $this->getOption('address.options'));
		$template_vars['{input.search}'] = $address->render($name.'[address]', $value['address']);

		// définit les widgets pour les champs : longitude et latitude
		$hidden = new sfWidgetFormInputText;
		$template_vars['{input.lon}'] = $hidden->render($name.'[lon', $value['lon']);
		$template_vars['{input.lat}']  = $hidden->render($name.'[lat]', $value['lat']);

		// assemble le modèle avec les valeurs
		return strtr(
		$this->getOption('template.html').$this->getOption('template.javascript'),
		$template_vars
		);
	}
}

Initial URL


Initial Description
i use this link : http://www.symfony-project.org/more-with-symfony/1_4/fr/05-Custom-Widgets-and-Validators
, but this one is lighest and don't require jquery

Initial Title
sfWidgetFormGeocoder /  sfValidatorGeocoder

Initial Tags


Initial Language
PHP