[Cartoweb-users] query tools with different icons

Oliver Christen oliver.christen at camptocamp.com
Fri Feb 2 09:33:35 EST 2007

Hi valerio
this is certainly possible but also delicate.

you will need to touch php client side and server side and also some 

concerning the tool itself:

for the php, you will probably need to extend the query plugin and add new 
tools definition to the getTools() function.

to help you a bit, new ToolDescription(self::TOOL_QUERY_BY_BBOX, true, 41) 
this will define a new tool, whose name will be defined by 
self::TOOL_QUERY_BY_BBOX (you can use a string like 'mynewquerytool' , the 
notation used here allow us to change the name without changing the code, 
but you dont need to use it).
The name is important as it is the identifiant for that tool which will be 
used in the web interface and also in the javascript. The second parameter 
say if the tool has an icon or not. This is usually true. third is the 
weight, in other words, the place of the tool in the toolbar. There are 
other parameters (see client/ClientPlugin.php) but you probably dont need 

Now the javascript part. All tools action are handled by the dhtmlAPI.js, 
dhtmlFeatures.js and dhtmlInit.js.
This is probably the less userfriendly part of cartoweb.

What you need to do is, in a new javascript file, copy the existing 
properties and methodes of the existing query tool that meet the beahaviour 
you need (for exemple query_by_bbox).

Since the behaviour is the same, you wont have to duplicate this, 
You will have something like :
Map.prototype.mynewquerytool = function(aDisplay) {
  this.selectionBox(aDisplay, 'Query.Perform');
  this.getDisplay(aDisplay).docObj.style.cursor = "help";

then include that javascript in your main template header, like the other 
javascript files.

Thats only for "duplicating" a query tool.

Now, for the database switch.... I will do some wild guess as I never had 
such problem before.

If the database connection is set in the layers connection parameter, it 
means :
either you have two layers and activate one or the other depending of the 
query tool selected,
or you need to change the connection on-the-fly depending of the query tool 

I must say i dont really see how to change the layer on which the query is 
done. Maybe with a filterPostRequest but I think the query plugin use the 
list of activated layers before the query, obtained from the layer plugin. 
And I wouldnt mess with that personally. Maybe someone else has a better 

To change a layer parameter on-the-fly, you can do that on the server side, 
in the function handlepreDrawing with some use of mapOverlay plugin.
This is done on the server side part of the query plugin, so you will need 
to extend this too.
For that, first, enable the mapOverlay plugin in the server side 
yourproject.ini file (where the other plugins for server side are listed for 

below is an exemple on how to change some layer properties:

public function handlePreDrawing($request) {
        if (isset($this->selectid) && !empty($this->selectid)) {
         $layer = new LayerOverlay();
         $layer->name = "vue_recenter";
         $layer->data = "position FROM (SELECT * FROM vue_recenter WHERE 
filtre_id = ".$this->selectid.") as foo USING UNIQUE bien_id USING SRID=-1";

         $mapOverlay = $this->serverContext->getPluginManager()->mapOverlay;
         if ($mapOverlay == NULL) {
            throw new CartoserverException('Plugin MapOverlay must be 
         // update layer


in this case we changed the DATA value from the layer vue_recenter, but you 
can probably do the same with the CONNECTION value.
the important part is you need to pass some parameter from client side to 
server side to activate the change (in the "if" condition). So you need to 
modify a bit the buildRequest() function (client side) to pass that 
parameter (for exemple the name of the tool used) on the server side. on the 
server side, the paramter will be in $request, which directly is available 
in handlePreDrawing.

This is certainly not easy but it is possible ;)

Good luck

----- Original Message ----- 
From: "Valerio Noti" <valerionoti at yahoo.it>
To: <cartoweb-users at lists.maptools.org>
Sent: Friday, February 02, 2007 10:37 AM
Subject: [Cartoweb-users] query tools with different icons

> Hello,
> I'd like to duplicate a query tool in cartoweb interface in order to have
> two buttons (different icons) with query functionality but with separate 
> tasks.
> These separate tasks are not cartoweb-dependant (i.e. a different database 
> to connect).
> So perhaps my problem it how to assign two different icons to the same 
> tool.
> Any help appreciated
> thanks in advance
> Valerio
> /*
> Valerio Noti
> valerionoti at yahoo.it
> */
> _______________________________________________
> Cartoweb-users mailing list
> Cartoweb-users at lists.maptools.org
> http://lists.maptools.org/mailman/listinfo/cartoweb-users

More information about the Cartoweb-users mailing list