[76] | 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://dev.sencha.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, o.logicalOp, o.wildcard); |
---|
| 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 | }); |
---|