3.3. Modifikasi Fitur Thd WFS-T
Sampai GeoExt menyediakan writers, kita harus bergantung pada OpenLayers utk menulis modifikasi kembali ke WFS. Hal ini bukanlah hal yang besar karena WFS-T support pada OpenLayers adalah solid. Namun membutuhkan perhatian ekstra utk fiturnya.
3.3.1. Mengatur Keadaan Fitur
Dalam mempertahankan track dari operasi “create”, “update” and “delete”, fitur OpenLayers vector memiliki state property. WFS protocol berdasar pada property ini dalam menentukan fitur mana yang memakai transaksi “Insert”, “Update” atau “Delete”. jadi harus dipastikan state property bekerja dg baik:
- OpenLayers.State.INSERT utk fitur yg baru dibuat. Kita tdk perlu melakukan apapun, karena DrawFeature control handles yang melakukannya.
- OpenLayers.State.UPDATE utk fitur dg atribut termodifikasi, kecuali fitur yang sdh punya OpenLayers.State.INSERT. utk modifikasi geometries, dipakai ModifyFeature control handles.
- OpenLayers.State.DELETE utk fitur yg ingin dihilangkan user, kecuali fitur yg punya OpenLayers.State.INSERT, yg bisa dipindahkan.
Tasks
- buka map.html pada teks editor. Temukan tombol “Delete” handler dan rubah hingga dpt mengeset dg baik fitur state DELETE dan tambahkan kembali fitur ke layer sehingga server tahu kita ingin mendeletenya:
2. handler: function() { 3. app.featureGrid.store.featureFilter = new OpenLayers.Filter({ 4. evaluate: function(feature) { 5. return feature.state != OpenLayers.State.DELETE; 6. } 7. }); 8. app.featureGrid.getSelectionModel().each(function(rec) { 9. var feature = rec.getFeature(); 10. modifyControl.unselectFeature(feature); 11. vectorLayer.removeFeatures([feature]); 12. if (feature.state != OpenLayers.State.INSERT) { 13. feature.state = OpenLayers.State.DELETE; 14. vectorLayer.addFeatures([feature]); 15. } 16. }); 17.}
3.3.1.1. Memahami Kode
Dg mengeset featureFilter pada store kami mencegah fitur ditambahkan kembali ke store. Pada OpenLayers, fitur dg DELETE state tidak akan digunakan, namun pada Ext JS, jika kita tidak ingin fitur yg telah dihapus muncul lagi pada grid, maka harus dipastikan fitur tsb tdk ada pada store. Setelah menghilangkan fitur terdelete dari vectorLayer, kita tambahkan kembali kecuali fitur tsb memiliki INSERT state (namun tdk akan tampak karena OpenLayers state handling dan featureFilter). Hal ini penting karena transaksi saat menyimpan perubahan harus menyertakan informasi mengenai fitur terdelete, shg dpt didelete pada server.
3.3.2. Menambahkan Tombol Save
Cara menyimpan modifikasi fitur pada OpenLayers umumnya membutuhkan vector layer utk dikonfigurasi bersama OpenLayers.Strategy.Save. namun karena kita punya GeoExt store (dan bukan OpenLayers layer) yg terkonfigurasi dg WFS protocol, maka tidak dapat melakukan hal tsb. Namun kita bisa memanggil protocol’s commit() method secara langsung utk menyimpan perubahan.
Tasks
- Temukan definisi tombol grid toolbar’s Delete dan Create pada file map.html file dan tambahkan konfigurasi dan handler tombol “Save” . saat selesai, seluruh definisi tombol seperti di bawah ini:
- Simpan file anda dan reload @workshop_url@/map.html. buat beberapa perubahan dan tekan “Save”. Reload page utk melihat perubahan yg anda buat tidak berubah.
2. bbar.add([{ 3. text: "Delete", 4. handler: function() { 5. app.featureGrid.store.featureFilter = new OpenLayers.Filter({ 6. evaluate: function(feature) { 7. return feature.state != OpenLayers.State.DELETE; 8. } 9. }); 10. app.featureGrid.getSelectionModel().each(function(rec) { 11. var feature = rec.getFeature(); 12. modifyControl.unselectFeature(feature); 13. vectorLayer.removeFeatures([feature]); 14. if (feature.state != OpenLayers.State.INSERT) { 15. feature.state = OpenLayers.State.DELETE; 16. vectorLayer.addFeatures([feature]); 17. } 18. }); 19. } 20.}, new GeoExt.Action({ 21. control: drawControl, 22. text: "Create", 23. enableToggle: true 24.}), { 25. text: "Save", 26. handler: function() { 27. app.featureGrid.store.proxy.protocol.commit( 28. vectorLayer.features, { 29. callback: function() { 30. var layers = app.mapPanel.map.layers; 31. for (var i=layers.length-1; i>=0; --i) { 32. layers[i].redraw(true); 33. } 34. app.featureGrid.store.reload(); 35. } 36. }); 37. } 38.}]);
3.3.2.1. The Commit Callback Explained
Dg memanggil commit() method memakai callback option,kita dpt menampilkan aksi saat operasi commit selesai. Pada kasus ini, kami ingin redraw semua layer utk mencerminkan perubahan pada WMS dan group layers. Kami juga mereload fitur store, utk menghapus semua fitur state dan mengisi semua fitur dg fitur ids yg sesuai.
callback: function() { for (var i=layers.length-1; i>=0; --i) { layers[i].redraw(true); } app.featureGrid.store.reload(); }
Reloading store hanya penting utk GeoServer layers yang memakai shapefile sebagai data store, karena WFS Insert tidak melaporkan inserted feature ids utk itu.