root/core/trunk/geoext/lib/GeoExt/widgets/form/SearchAction.js

Revision 1956, 5.1 kB (checked in by tschaub, 6 months ago)

Copyright update.

Line 
1 /**
2  * Copyright (c) 2008-2010 The Open Source Geospatial Foundation
3  *
4  * Published under the BSD license.
5  * See http://svn.geoext.org/core/trunk/geoext/license.txt for the full text
6  * of the license.
7  */
8
9 /** api: (define)
10  *  module = GeoExt.form
11  *  class = SearchAction
12  *  base_link = `Ext.form.Action <http://extjs.com/deploy/dev/docs/?class=Ext.form.Action>`_
13  */
14
15 /**
16  * @include GeoExt/widgets/form.js
17  */
18
19 Ext.namespace("GeoExt.form");
20  
21 /** api: example
22  *  Sample code showing how to use a GeoExt SearchAction with an Ext form panel:
23  * 
24  *  .. code-block:: javascript
25  *
26  *      var formPanel = new Ext.form.Panel({
27  *          renderTo: "formpanel",
28  *          items: [{
29  *              xtype: "textfield",
30  *              name: "name__like",
31  *              value: "mont"
32  *          }, {
33  *              xtype: "textfield",
34  *              name: "elevation__ge",
35  *              value: "2000"
36  *          }]
37  *      });
38  *
39  *      var searchAction = new GeoExt.form.SearchAction(formPanel.getForm(), {
40  *          protocol: new OpenLayers.Protocol.WFS({
41  *              url: "http://publicus.opengeo.org/geoserver/wfs",
42  *              featureType: "tasmania_roads",
43  *              featureNS: "http://www.openplans.org/topp"
44  *          }),
45  *          abortPrevious: true
46  *      });
47  *
48  *      formPanel.getForm().doAction(searchAction, {
49  *          callback: function(response) {
50  *              // response.features includes the features read
51  *              // from the server through the protocol
52  *          }
53  *      });
54  */
55
56 /** api: constructor
57  *  .. class:: SearchAction(form, options)
58  *
59  *      A specific ``Ext.form.Action`` to be used when using a form to do
60  *      trigger search requests througn an ``OpenLayers.Protocol``.
61  *
62  *      Arguments:
63  *
64  *      * form ``Ext.form.BasicForm`` A basic form instance.
65  *      * options ``Object`` Options passed to the protocol'read method
66  *            One can add an abortPrevious property to these options, if set
67  *            to true, the abort method will be called on the protocol if
68  *            there's a pending request.
69  *
70  *      When run this action builds an ``OpenLayers.Filter`` from the form
71  *      and passes this filter to its protocol's read method. The form fields
72  *      must be named after a specific convention, so that an appropriate
73  *      ``OpenLayers.Filter.Comparison`` filter is created for each
74  *      field.
75  *
76  *      For example a field with the name ``foo__like`` would result in an
77  *      ``OpenLayers.Filter.Comparison`` of type
78  *      ``OpenLayers.Filter.Comparison.LIKE`` being created.
79  *
80  *      Here is the convention:
81  *
82  *      * ``<name>__eq: OpenLayers.Filter.Comparison.EQUAL_TO``
83  *      * ``<name>__ne: OpenLayers.Filter.Comparison.NOT_EQUAL_TO``
84  *      * ``<name>__lt: OpenLayers.Filter.Comparison.LESS_THAN``
85  *      * ``<name>__le: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO``
86  *      * ``<name>__gt: OpenLayers.Filter.Comparison.GREATER_THAN``
87  *      * ``<name>__ge: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO``
88  *      * ``<name>__like: OpenLayers.Filter.Comparison.LIKE``
89  *
90  *      In most cases your would not directly create ``GeoExt.form.SearchAction``
91  *      objects, but use :class:`GeoExt.form.FormPanel` instead.
92  */
93 GeoExt.form.SearchAction = Ext.extend(Ext.form.Action, {
94     /** private: property[type]
95      *  ``String`` The action type string.
96      */
97     type: "search",
98
99     /** api: property[response]
100      *  ``OpenLayers.Protocol.Response`` A reference to the response
101      *  resulting from the search request. Read-only.
102      */
103     response: null,
104
105     /** private */
106     constructor: function(form, options) {
107         GeoExt.form.SearchAction.superclass.constructor.call(this, form, options);
108     },
109
110     /** private: method[run]
111      *  Run the action.
112      */
113     run: function() {
114         var o = this.options;
115         var f = GeoExt.form.toFilter(this.form);
116         if(o.clientValidation === false || this.form.isValid()){
117
118             if (o.abortPrevious && this.form.prevResponse) {
119                 o.protocol.abort(this.form.prevResponse);
120             }
121
122             this.form.prevResponse = o.protocol.read(
123                 Ext.applyIf({
124                     filter: f,
125                     callback: this.handleResponse,
126                     scope: this
127                 }, o)
128             );
129
130         } else if(o.clientValidation !== false){
131             // client validation failed
132             this.failureType = Ext.form.Action.CLIENT_INVALID;
133             this.form.afterAction(this, false);
134         }
135     },
136
137     /** private: method[handleResponse]
138      *  :param response: ``OpenLayers.Protocol.Response`` The response
139      *  object.
140      *
141      *  Handle the response to the search query.
142      */
143     handleResponse: function(response) {
144         this.form.prevResponse = null;
145         this.response = response;
146         if(response.success()) {
147             this.form.afterAction(this, true);
148         } else {
149             this.form.afterAction(this, false);
150         }
151         var o = this.options;
152         if(o.callback) {
153             o.callback.call(o.scope, response);
154         }
155     }
156 });
Note: See TracBrowser for help on using the browser.