[Chameleon] Help on Widget Development...

Nolte, Tim Tim.Nolte at ipcswirelessinc.com
Tue Sep 4 13:09:20 EDT 2007


Norm,

Thanks for the help. I think I'm pretty close to getting there however
when I try to include this widget the whole thing breaks with the
following error:

	Parse error: syntax error, unexpected $end in
/usr/local/chameleon-2.4.1/htdocs/widgets/ZoomToPoint/ZoomToPoint.widget
.php on line 231

I've went through the code and I can't seem to find where the problem
lies. Perhaps someone can see the error?

Here's my code:

/**
 * ZoomToPoint Widget class
 *
 * @project     CWC2
 * @revision    $Id: ZoomToPoint.widget.php,v 1.0 2007/09/04 12:00:00
tnolte Exp $
 * @purpose     Zoom To Point Widget class
 * @author      Tim Nolte (tnolte at ilpcs.com) / Normand Savard
(nsavard at ...)
 * @copyright
 * <b>Copyright (c) 2007, iPCS Wireless Inc.</b>
 */
include_once(dirname(__FILE__)."/../Widget.php");
include_once(dirname(__FILE__)."/../Button.php");
include_once(dirname(__FILE__)."/../Label.php");

/**
 * ZoomToPoint
 *
 * @desc ZoomToPoint widget.
 */
class ZoomToPoint extends CWCWidget {
	var $mnImageWidth=400;
	var $mnImageHeight=300;
	var $mnScaleZoom=2;
	var $mszLabelClass = '';
	var $mszWidgetClass = '';
	
	function ZoomToPoint() {
		parent::CWCWidget();
		
		$this->szWidgetDescription = <<<EOT
The Zoom To Point widget plots a know lat/long coordinate or a geocoded
address.
EOT;
		
		//Create your require attributes
		$this->maAttributes["SCALEZOOM"] = new
StringAttribute("SCALEZOOM", false);
		$this->maAttributes["IMAGEWIDTH"] = new
StringAttribute("IMAGEWIDTH", false);
		$this->maAttributes["IMAGEHEIGHT"] = new
StringAttribute("IMAGEHEIGHT", false);
		$this->maAttributes["LABELCLASS"] = new
StringAttribute("LABELCLASS", false);
		$this->maAttributes["WIDGETCLASS"] = new
StringAttribute("WIDGETCLASS", false);
	}
	
	function InitDefaults() {
		parent::InitDefaults();
		
		//Initialize your parameters here
		if (isset($this->maParams["LABELCLASS"]) &&
$this->maParams["LABELCLASS"] != "") {
			$this->mszLabelClass =
$this->maParams["LABELCLASS"];
		}
		
		if (isset($this->maParams["WIDGETCLASS"]) &&
$this->maParams["WIDGETCLASS"] != "") {
			$this->mszWidgetClass =
$this->maParams["WIDGETCLASS"];
		}
	}
	
	function GetHTMLHiddenVariables() {
		//Create your html variables to pass on your form
variables
		$szVariable = "str_addr";
		$szValue = "<INPUT TYPE=HIDDEN NAME=$szVariable
VALUE=\"\">";
		$aReturn[$szVariable] = $szValue;
		
		$szVariable = "city";
		$szValue = " <INPUT TYPE=HIDDEN NAME=$szVariable
VALUE=\"\">";
		$aReturn[$szVariable] = $szValue;
		
		$szVariable = "state_cd";
		$szValue = " <INPUT TYPE=HIDDEN NAME=$szVariable
VALUE=\"\">";
		$aReturn[$szVariable] = $szValue;
		
		$szVariable = "zip_cd";
		$szValue = " <INPUT TYPE=HIDDEN NAME=$szVariable
VALUE=\"\">";
		$aReturn[$szVariable] = $szValue;
		
		$szVariable = "plot_lat";
		$szValue = " <INPUT TYPE=HIDDEN NAME=$szVariable
VALUE=\"\">";
		$aReturn[$szVariable] = $szValue;
		
		$szVariable = "plot_long";
		$szValue = " <INPUT TYPE=HIDDEN NAME=$szVariable
VALUE=\"\">";
		$aReturn[$szVariable] = $szValue;
		
		return $aReturn;
	}

	function ParseURL() {
		//Your processing should be placed here
		if ($this->isVarSet('plot_lat') &&
$this->getVar('plot_lat') != "" &&
		    $this->isVarSet('plot_long') &&
$this->getVar('plot_long') != "") {
			$nPointX = $this->getVar('plot_long');
			$nPointY = $this->getVar('plot_lat');
			
			// new geocoded point layer name
			$layer_name = "Lat/Long Point";
		} elseif ( ( ($this->isVarSet('city') &&
$this->getVar('city') != "") &&
				($this->isVarSet('state_cd') &&
$this->getVar('state_cd') != "") ) ||
			($this->isVarSet('zip_cd') &&
$this->getVar('zip_cd') != "") ) {
			
			// geocode address information
			$googleAPIKey = "...";
			$googleAPIUrl =
"http://maps.google.com/maps/geo?output=xml&key=".$googleAPIKey;
			
			# Instantiate a new SOAP object, pointing to the
Perl Web service
			$client = new SoapClient(null,
				array('location' =>
"http://mapserver.ilpcs.com/cgi-bin/geocode.pl",
				'uri' =>
"http://mapserver.ilpcs.co/geocode"));
			
			# address to geocode
			$data =
explode(",",$this->getVar('str_addr').",".$this->getVar('city').",".$thi
s->getVar('state_cd').",".$this->getVar('zip_cd'));
			foreach ($data as $element) {
				if ($element != NULL && $element != '')
{
					$address .= $element.", ";
				}
			}
			
			# Execute the remote call
			$result = $client->geocode($address);
			
			# Remove the latitudinal value from the returned
array
			$lat = array_shift($result);
			
			# Remove the longitudinal value from the
returned array
			$long = array_shift($result);
			
			if ($lat == '' || $long == '') {
				$address = "q=".str_replace('
','+',$address);
				$url = $googleAPIUrl."&".$address;
				
				// Retrieve the URL contents
				$page = file_get_contents($url);
				
				// Parse the returned XML file
				$xml = new SimpleXMLElement($page);
				
				// Parse the coordinate string
				list($long, $lat, $altitude) =
explode(",", $xml->Response->Placemark->Point->coordinates);
			}

			$nPointX = $long;
			$nPointY = $lat;
			
			// new geocoded point layer name
			$layer_name = "Address";
		} else {
			return;
		}
		
		$oMap = $this->moMapObject->oMap;
		$margin = .025;
	
$oMap->setExtent($long-$margin,$lat-$margin,$long+$margin,$lat+$margin);
		
		//create your layer (add your php script code to create
a layer)
		$line = ms_newLineObj();
		$line->addXY($long,$lat);
		
		$shape = ms_newShapeObj(MS_SHAPE_POINT);
		$shape->add($line);
		
		//plot address lat/lon
		$gpoint_layer = $oMap->getLayerByName("Geocoded Point");
		$point_layer = ms_newLayerObj($oMap, $gpoint_layer);
		$point_layer->addFeature($shape);
		$point_layer->set("group", "Geocoded Points");
		$point_layer->set("name", $layer_name);
		$point_layer->set("status",MS_ON);
		
		$oPixelPos = ms_newPointObj();
		$oPixelPos->setXY($nPointX, $nPointY);
		
		$oMap->zoomscale($this->mnScaleZoom, $oPixelPos,
$this->mnImageWidth, $this->mnImageHeight);
	}
	
	function GetJavascriptFunctions() {
		parent::GetJavascriptFunctions();
		
		$aReturn = array();
		$szJsFunctionName = "ZoomToPointQuery";
		$szFunction = <<<EOT
		/**
		* {$szJsFunctionName}
		* called to submit the form when a user click the go
button.
		*/
		function {$szJsFunctionName}(obj) {
			{$this->mszHTMLForm}.submit();
			return;
		}
		EOT;
		$aReturn[$szJsFunctionName] = $szFunction;
		return $aReturn;
	}
	
	function DrawPublish() {
		//This function will create and display your text fields
		if (!$this->mbVisible)
			return;
		
		$szLabelClass = '';
		$szWidgetClass = '';
		if ($this->mszLabelClass != '') {
			$szLabelClass = "
class='".$this->mszLabelClass."'";
		}
		
		if ($this->mszWidgetClass != '') {
			$szWidgetClass = "
class='".$this->mszWidgetClass."'";
		}
		
		$szResult = <<<EOT
<div style="margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid
#CCCCCC;">
	<span{$szLabelClass}>Address:</span><br>
	<input{$szWidgetClass} type="text" name="str_addr"><br>
	<span{$szLabelClass}>City</span><br>
	<input{$szWidgetClass} type="text" name="city"><br>
	<span{$szLabelClass}>State:</span><br>
	<input{$szWidgetClass} type="text" name="state_cd" size="2"
maxlength="2"><br>
	<span{$szLabelClass}>Zip:</span><br>
	<input{$szWidgetClass} type="text" name="zip_cd" maxlength="5">
</div>
<div style="margin-bottom:8px;">
	<span{$szLabelClass}>Lat:</span><br>
	<input{$szWidgetClass} type="text" name="plot_lat"><br>
	<span{$szLabelClass}>Long:</span><br>
	<input{$szWidgetClass} type="text" name="plot_long">
</div>
<input type="button" name="ZoomToPointQuery" value="Submit Query"
onClick="ZoomToPointQuery();">
		EOT;
		
		return $szResult;
	}
}


----
Timothy J Nolte - tnolte at ilpcs.com
Associate Network Planning Engineer

iPCS Wireless, Inc.
4717 Broadmoor Ave, Suite G
Kentwood, MI 49512

Office: 616-656-5163
PCS:    616-706-2438
Fax:    616-554-6484
Web: www.ipcswirelessinc.com



More information about the Chameleon mailing list