[Cartoweb-users] query tools with different icons
Valerio Noti
valerionoti at yahoo.it
Wed Feb 7 09:19:39 EST 2007
Oliver,
I want make a query and pass query results to different php files which depend on a previous user choice.
I think your suggestions will be very useful, i'm trying to implement a part of them.
thank you again
Valerio
/*
Valerio Noti
valerionoti at yahoo.it
*/
----- Original Message -----
From: "Oliver Christen" <oliver.christen at camptocamp.com>
To: "Valerio Noti" <valerionoti at yahoo.it>; <cartoweb-users at lists.maptools.org>
Sent: Monday, February 05, 2007 10:55 AM
Subject: Re: [Cartoweb-users] query tools with different icons
> Im no sure I understand exactly what you want to do.
>
> You want, after a query, that it doesnt make any query, but instead open
> some php file of your own?
>
> Thats certainly possible.
> You need to handle a new parameter received from the formular (radio,
> checkbox or select input element, which will be used to select what action
> you want) in the query plugin.
>
> You will still need to extend the query plugin, but the modification are
> certainly less complicated than before, as you dont have to handle any new
> tool.
>
> Dont worry, this may sound complicated, but it is in fact fairly easy.
> I will attache some kind of exemple of extended query plugin so you can
> understand better the explanation below.
>
> First, in handleStandardParameters, recover the new parameter value with
> $this->querySpecial = $this->getHttpValue($request,
> 'my_new_parameter_name');
> (dont forget to declare $querySpecial at the beginning of the class)
>
> since you wont use the normal query result, there is no point of triggering
> the server part of the query plugin, so you can bypass the whole
> buildRequest() content if your triggered your special query:
>
> public function buildRequest() {
> if (!$this->querySpecial) { // <- new!
> // in other words, if you didnt pass any special parameter, you need
> to process the query normally
> if (!is_null($this->shape) || (!is_null($this->queryState)
> ...
> }
> }
> This way you wont have a query done and not used.
>
> Then, in the initializeResult function, you need to change:
>
> if (empty($queryResult))
> return;
>
> nothing will happens if you triggered the query with your special parameter.
> Then we will trick the query to react even if nothing was returned from the
> server side.
>
> if (empty($queryResult) && !$this->querySpecial)
> return;
>
> if (!$this->querySpecial) {
> // here process the rest of the original function content
> }
>
> then, the last part, modify the drawQuery:
>
> simply add somthing like:
>
> if ($this->querySpecial) {
> $smarty->assign('specialQueryWhatever', true); // this is to activate a
> template part
> }
>
> and finally, in the query.tpl (NOT the table.tpl ! as we dont have any
> normal result to handle)
> add the part of the code that will open a new window, pointing on your
> external php file.
> {if $specialQueryWhatever}
> <script ....
> ....
> </script>
> {/if}
>
> You could avoid the popup part, if you call your php file direcly from
> within the extended query part.
> For exemple, from the drawQuery,
>
> if ($this->querySpecial) {
> $smarty->assign('specialQueryWhatever', true); // this is to activate a
> template part
> $smarty->assign('specialQueryResult', $this->getSpecialQueryResult());
> }
>
> and a new function
>
> private function getSpecialQueryResult() {
> require_once(path/to/your/special/query/phpfile.php');
> $specialQuery = new specialQuery(); // defined in your external php file
> $result =
> $specialQuery->callSomeFunctionInSpecialQuery($this->querySpecial) // call a
> function, passing the spacial query parameter
> return $result;
> }
>
> this way, the result would be displayed in Cartoweb template, below the map,
> as usual and this would be transparent to the user.
>
> Oh, dont forget to activate this new plugin in your client.ini
>
> regards
> Oliver
>
>> Oliver,
>> thank you for your reply.
>> I think this solution is too much complicated for me.
>> I can modify tables.tpl in order to open a certain php file instead of
>> display query results in the same map window.
>> My goal is to open a different php file (or the same with different
>> parameters) from tables.tpl depending on a previous choice.
>> I thought about a gif map and an hidden input form to retry in tables.tpl
>> but I haven't tried yet and maybe it's not possible.
>> What do you think about this? and is tables.tpl the right file to modify?
>> thanks
>>
>> Valerio
>>
>>
>> ----- Original Message -----
>> From: "Oliver Christen" <oliver.christen at camptocamp.com>
>> To: "Valerio Noti" <valerionoti at yahoo.it>;
>> <cartoweb-users at lists.maptools.org>
>> Sent: Friday, February 02, 2007 3:33 PM
>> Subject: Re: [Cartoweb-users] query tools with different icons
>>
>>
>>> Hi valerio
>>> this is certainly possible but also delicate.
>>>
>>> you will need to touch php client side and server side and also some
>>> javascript.
>>>
>>> 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 them.
>>>
>>> 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,
>>> fortunately.
>>> 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 selected.
>>>
>>> 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 idea...
>>>
>>> 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 activation)
>>>
>>> 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
>>> activated!');
>>> }
>>> // update layer
>>> $mapOverlay->updateMap($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
>>> Oliver
>>>
>>> ----- 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
>>>>
>>>
>>>
>>>
>>> --
>>> No virus found in this incoming message.
>>> Checked by AVG Free Edition.
>>> Version: 7.5.432 / Virus Database: 268.17.19/663 - Release Date: 01/02/07
>>> 14.28
>>>
>>>
>>
>>
>
--------------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.432 / Virus Database: 268.17.27/671 - Release Date: 05/02/07 16.48
More information about the Cartoweb-users
mailing list