konto usunięte

Temat: Formularz ExtJs (kilka pól), problem z WFS

Witam,
zbudowałem wyszukiwarkę atrybutów (formularz), który wysyła zapytania do serwera WFS.
Gdy jest tylko jedno pole, to formularz wysyła poprawnie zapytanie o dany atrybut lub gdy dodam kolejne pole i wypełnię obydwa to serwer WFS zwraca poprawnie wyniki.
Problem pojawia się w momencie gdy stworzę formularz, który ma 11 pól tekstowych. Gdy wypełnię wszystkie pola, serwer również zwraca wyniki zapytania. Natomiast gdy wypełnię tylko kilka pól, a resztę pozostawię pustą to po naciśnięciu przycisku wyszukaj, wysyłane są również te puste pola:

Poniżej jest fragment zapytania WFS i widać, że puste pola są wysyłane jako puste wartości do serwera WFS.

<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<wfs:Query typeName="feature:transakcje_punkty" srsName="EPSG:900913" xmlns:feature="http://geoserver.org/transakcje">
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:And>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>trans_id</ogc:PropertyName>
<ogc:Literal>22</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>dokument</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>data_transakcji</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>typ_nier</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>cena_tran</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>cena_1m2_dlk</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>pow_m2</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>sprzedawca</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>nabywca</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>wspx</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="true">
<ogc:PropertyName>wspy</ogc:PropertyName>
<ogc:Literal></ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:And>
</ogc:Filter>
</wfs:Query>
</wfs:GetFeature>


Serwer zwraca odpowiedź:
<?xml version="1.0" encoding="UTF-8"?>
<ows:ExceptionReport version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/ows http://localhost:8080/geoserver/schemas/ows/1.0.0/owsExceptionReport.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows">
<ows:Exception exceptionCode="NoApplicableCode">
<ows:ExceptionText>java.lang.RuntimeException: java.io.IOException
java.io.IOException
null
BŁĄD: nieprawidłowa składnia wejścia dla typu numerycznego: ""
Pozycja: 161</ows:ExceptionText>
</ows:Exception>
</ows:ExceptionReport>


Chciałbym, żeby użytkownik mógł wpisać te atrybuty do wyszukiwania które go interesują. Natomiast gdy nie uzupełni on żadnego pola to, żeby pojawiała się informacja w stylu "Proszę uzupełnić co najmniej jedno pole"

Poniżej zamieszczam kod ExtJS formularza:
formPanel = new GeoExt.form.FormPanel({
ref: "formPanel",
title:"Wyszukiwarka",

collapsible: true,
width: 150,

region: "west",
protocol: protocol,
buttons:[
{text: 'Czyść',
width: 60,
handler: function(){
formPanel.getForm().reset();
}},
{
text: "Szukaj",
width: 70,
handler: function() {
formPanel.getForm().search();
},
//scope: formPanel
}],
items: [{
xtype: "textfield",
name: "trans_id__eq",
cls : 'myCls',
emptyText:"ID Transakcji",
value: "",
//fieldLabel: "ID",
//disabled: true,

},

{
xtype: "textfield",
name: "dokument__eq",
// emptyText:"Dokument",
cls : 'myCls',
value: "",
//disabled: true,
// fieldLabel: "nabywca",
//allowBlank: false

},
{
xtype: "textfield",
name: "data_transakcji__eq",
cls : 'myCls',
//emptyText:"Data Transakcji",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "typ_nier__eq",
cls : 'myCls',
// emptyText:"Typ nieruchomości",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "cena_tran__eq",
cls : 'myCls',
// emptyText:"Cena transakcji",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "cena_1m2_dlk__eq",
cls : 'myCls',
//emptyText:"Cena 1m2",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "pow_m2__eq",
cls : 'myCls',
//emptyText:"Powierzchnia",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "sprzedawca__eq",
cls : 'myCls',
// emptyText:"Sprzedawca",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "nabywca__eq",
cls : 'myCls',
// emptyText:"Nabywca",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "wspx__eq",
cls : 'myCls',
// emptyText:"WspX",
value: "",
//fieldLabel: "ID",
//disabled: true,

},
{
xtype: "textfield",
name: "wspy__eq",
cls : 'myCls',
// emptyText:"WspY",
value: "",
//fieldLabel: "ID",
//disabled: true,

}

],
listeners: {
actioncomplete: function(form, action) {
// this listener triggers when the search request
// is complete, the OpenLayers.Protocol.Response
// resulting from the request is available
// through "action.response"
features = action.response.features;
app.featureGrid.store.loadData(features); //załadowanie zwróconego wyniku wyszukiwania do "app.featureGrid.store"
vm=app.mapPanel.map.getLayersByName("Wynik wyszukiwania");
if(vm.length==0){
vecLayer = new OpenLayers.Layer.Vector("Wynik wyszukiwania");
app.mapPanel.map.addLayer(vecLayer);
app.featureGrid.store.bind(vecLayer);
app.featureGrid.getSelectionModel().bind(vecLayer);
//app.featureGrid.getSelectionModel().bind(vectorLayer);
}
}
}




})


Prosiłbym o informację w jaki sposób zrobić, żeby puste pola nie były wysyłane do serwera WFS oraz o podpowiedź jak zrobić ostrzeżenie, w momencie gdy nie zostanie wypełnione co najmniej jedno pole w formularzu.

Z góry dziękuję
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Formularz ExtJs (kilka pól), problem z WFS

pytanie bardziej na forum geoext niż extjs ;-)

obadaj sobie to: http://www.geoext.org/lib/GeoExt/widgets/form/SearchAc...

powinieneś znaleźć wskazówki jak customizować zapytanie.

Swoją drogą serwis, który wołasz upiera się, że nie lubi stringów udających typ numeryczny. Więc może w Twoim wypadku wystarczy zmienić textfield na numberfield i nie będzie już rzucał błędami.

konto usunięte

Temat: Formularz ExtJs (kilka pól), problem z WFS

Zmieniłem textfield na numberfield i nadal to samo. Zapoznałem się z tamtym przykładem. Wszystko mi działa
gdy mam wypełnione wszystkie pola w formularzu ( WFS zwraca wynik wyszukiwania poprawnie) . Chciałem zrobić wyszukiwarkę po wielu atrybutach na raz :) Dlatego zadałem to pytanie tutaj, bo chodzi mi bardziej o to czy jest sposób aby w momencie naciśnięcia przycisku wyszukaj, pola które są puste zostały ustawione na "disabled", żeby nie były brane pod uwagę przy wysyłaniu. Ponieważ gdy pole jest puste i aktywne wysyła mi "empty string" do serwisu WFS.Ten post został edytowany przez Autora dnia 26.06.13 o godzinie 18:00
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Formularz ExtJs (kilka pól), problem z WFS

Przecież możesz nadpisać metodę search, czy cokolwiek tam jest. Obadaj źródło, zobacz, co jest grane - w szczególności skup się na wychwyceniu i zignorowaniu pól, które są według Twoich założeń puste i po prostu nie wkładaj ich do filtra wfs.

Masz źródło na gh.
W obiekcie BasicForm masz metodę search, która dalej dziabie GeoExt.form.SearchAction, a ta z kolei ma metodę run, która buduje filtr GeoExt.form.toFilter(this.form, o.logicalOp, o.wildcard);

nadpisz ją, albo cokolwiek wyżej (bo pewnie mniej zabawy) w kolejności wykonywania i daj własną funkcjonalność.
Zasadniczo obadaj co zwraca toFilter - bo najpewniej wystarczy z tego obiektu wyrzucić puste stringi i nulle i będzie gites

możesz również pobawić się z ustawieniami fieldów - typu default value, allow empty (or something), etc.

Następna dyskusja:

Przesiadka na ExtJS 4 i pro...




Wyślij zaproszenie do