[Chameleon] retrieving postgis data programmatically

Normand Savard nsavard at mapgears.com
Tue May 22 11:35:59 EDT 2007


Anand Akmanchi wrote:

> Hi friends
>
> i am trying to develop a widget which displays a popup containing combos
> where one provides inputs for retrieving a layer from postgis database
>
> so far i have been able  to display the popup with the required combos
> and when i click on OK,
> the popup submits the form to itself
> the combo selections are read and an SQL query is built correctly
>
> in the mapfile i have a layer which looks like this
> LAYER
> DATA the_geom from (%SQL%) AS foo USING UNIQUE gid USING SRID=32643
>
> my question is how do i send the built SQL query to the mapfile and
> update the map?
>
> im stuck here
> please help
>
>
Anand,

I'm not a Chameleon expert but you can modify the map programatically 
with php mapscript within the ParseURL function.  If you look in some 
widgets the map is often modified this way.  For instance in your case 
you can use the Locate widget to create your own one and do the following:

 -Create a button that will open a popup (see onClickLocate in 
GetJavascriptFunctions()) with a callback function that will be executed 
when you click on the "Ok" button in your popup (see the Locate 
constructor in Locate.widget.php on how to create the link to the 
popup,  InitDefaults() and DrawPublish() on how to create the button).

-Create an HTML variable (MY_SQL_VAR)in GetHTMLHiddenVariables()  to 
pass on the SQL query string from your popup.

-Set this HTML variable in your callback function and submit the page 
(see LocateCB).
        $szJsFunctionName = "LocateCB";
        $szFunction = <<<EOF
        function {$szJsFunctionName}(actionID, mysql)
        {
            if (actionID == 1)
            {
                // Here we should handle the load mapcontext
                {$this->mszHTMLForm}.MY_SQL_VAR.value = mysql;

                {$this->mszHTMLForm}.NAV_CMD.value = "";
                {$this->mszHTMLForm}.submit ();
            }
            else if (actionID == 2) // close window
                wh.close ();

            return;
        }

EOF;

-Set the "Data" member of the layer with the set() method.  The code 
will look like this:

        $oMap = $this->moMapObject->oMap;
        $oLayer = @$oMap->getlayerbyname($this->mszLayerName);

        if ($this->isVarSet( "MY_SQL_VAR" ))
            $szSql = trim( $this->getVar( "MY_SQL_VAR" ));

        $oLayer->set("data", $szSql);


That's it.  I hope that'll help a little bit.

Norm





















More information about the Chameleon mailing list