I finally solved my problem, using faked nodes. Quite ugly, but it's  
working!

For those interested, you will find the code below, with more commentaries  
this time:

// Fake node that loads the WMS layers
var wfs_child = new Ext.tree.AsyncTreeNode({
        expanded: true, //allow layers autoload
        text: 'Couches en WMS', 
        hidden: true, //hide the node after layers loading
        loader: wms_loader
});

// Fake node that loads the WFS layers
var wfs_child = new Ext.tree.AsyncTreeNode({
        expanded: true, //allow layers autoload
        text: 'Couches en WFS', 
        hidden: true, //hide the node after layers loading
        loader: wfs_loader
});
        
// TreePanel root node, which will contains the future nodes (keywords  
folders, and layers inside these folders)
var root = new Ext.tree.TreeNode({
         expanded: true, // allow children autoload, and thus layers  
autoload
        text: 'Toutes les couches'
});
        
root.appendChild(wms_child); //add the WMS child
root.appendChild(wfs_child); //add the WFS child
                        
//TreePanel which contains all the nodes
var tree_catalog = new Ext.tree.TreePanel({
        title: "Couches Disponibles",
        anchor: '100% 50%',
        collapsible: true,
        collapsed: false,
        titleCollapse: true,
        autoScroll: true,
        split: true,
        lines: false,
        rootVisible: false, //hide the root node, but not its children
        root: root,

I hope this thread is not too confused. Maybe it could be interesting to  
create a right GeoExt object called WFSCapabilitiesLoader, like the  
WMSCapabilities Loader?

My code is specific to my application, but it probably could be adapted  
for a general use?

Geoffrey




On Fri, 15 Jul 2011 13:59:46 +0200, gbrun <gb...@myopera.com> wrote:

> It took me some time to clean my code, as it was a rough code! ;)
>
> Here is my WMS TreeLoader, inspired by the
> GeoExt.tree.WMSCapabilitiesLoader.js file:
>
> wms_loader = new Ext.tree.TreeLoader({
>              url:
> 'http://192.168.168.199:81/geoserver/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities&namespace=wms',
>              layerOptions: {buffer: 0, singleTile: true, ratio: 1},
>              layerParams: {'TRANSPARENT': 'TRUE'},
>           requestMethod: 'GET',
>           getParams: function(node) {
>                 return {'service': 'WMS', 'request': 'GetCapabilities'};
>           },
>                       
>           processResponse : function(response, node, callback, scope){
>                       var capabilities = new
> OpenLayers.Format.WMSCapabilities().read(response.responseXML ||
> response.responseText);
>                       this.processWMSlayer(capabilities.capability,
> capabilities.capability.request.getmap.href, node);
>                       if (typeof callback == "function") {
>                               callback.apply(scope || node, [node]);
>                       }
>           },
>                       
>           createWMSLayer: function(layer, url) {
>                       if (layer.name){
>                               return new OpenLayers.Layer.WMS(layer.title, 
> url,
>                                       OpenLayers.Util.extend(
>                                               {formats: layer.formats[0],
>                                               layers: layer.name},
>                                       this.layerParams),
>                                       OpenLayers.Util.extend(
>                                               {minScale: layer.minScale,
>                                               queryable: layer.queryable,
>                                               maxScale: layer.maxScale,
>                                               metadata: layer},
>                                       this.layerOptions)
>                               );
>                       } else {
>                               return null;
>                       }
>            },
>                       
>            processWMSlayer: function(layer, url, node){
>                          Ext.each(layer.layers, function(layers){
>                           Ext.each(layers.keywords, function(keywords) {
>                                               var k = this.createNode(
>                                                       {text: keywords.value,
>                                                       nodeType: 'node',
>                                                       leaf: false}
>                                               );
>                                               var test = true;
>                                               for (var i = 0, l = 
> root.childNodes.length; i < l; i++){
>                                                       var currentNode = 
> root.childNodes[i];
>                                                       if (k.text == 
> currentNode.text){
>                                                               test = false;
>                                                       };
>                                               };
>                                               var n = this.createNode(
>                                                       {text: layers.title,
>                                                       // use nodeType 'node' 
> so no AsyncTreeNodes are created
>                                                       nodeType: 'node',
>                                                       layer: 
> this.createWMSLayer(layers, url),
>                                                       leaf:true
>                                               });
>                                               if(test == true){
>                                                       root.appendChild(k);
>                                                       k.appendChild(n);
>                                               }else{
>                                                       
> currentNode.appendChild(n);
>                                               }
>                               }, this);
>                   }, this);
>           },
>                               
>              // customize the createNode method to add a checkbox to  
> nodes
>              createNode: function(attr) {
>                  attr.checked = attr.leaf ? false : undefined;
>                  return
> GeoExt.tree.WMSCapabilitiesLoader.prototype.createNode.apply(this,  
> [attr]);
>              }
> });
>
>
> Here is my WFS TreeLoader, inspired by the precedent code and the
> GeoExt.data.WMSReader.js file
>
>
> wfs_loader = new Ext.tree.TreeLoader({
>              url:
> 'http://192.168.168.199:81/geoserver/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetCapabilities&namespace=wfs',
>           requestMethod: 'GET',
>           getParams: function(node) {
>                 return {'service': 'WFS', 'request': 'GetCapabilities'};
>           },                  
>
>           processResponse : function(response, node, callback, scope){
>                       var data = new
> OpenLayers.Format.WFSCapabilities().read(response.responseXML ||
> response.responseText);
>                       this.processWFSlayer(data, node);
>                       if (typeof callback == "function") {
>                               callback.apply(scope || node, [node]);
>                       }
>           },
>                       
>           createWFSLayer: function(data, featureType) {
>                               var layerOptions, protocolOptions;
>                               protocolOptions = {
>                                       url: 
> data.capability.request.getfeature.href.post,
>                                       featureType: featureType.name,
>                                       featureNS: featureType.featureNS,
>                                       outputFormat: "json",
>                                       readFormat: new 
> OpenLayers.Format.GeoJSON()
>                               };
>                               layerOptions = {
>                                       protocol: new 
> OpenLayers.Protocol.WFS(protocolOptions),
>                                       strategies: [new 
> OpenLayers.Strategy.Fixed()]
>                               };
>                               return  new OpenLayers.Layer.Vector(
>                                       featureType.title || featureType.name,
>                                       layerOptions
>                               );
>           },
>                       
>           processWFSlayer: function(data, node){
>                               var featureTypes = 
> data.featureTypeList.featureTypes;
>                               var featureType;
>
>                               for(var i=0, lenI=featureTypes.length; i<lenI; 
> i++) {
>                                       featureType = featureTypes[i];
>                                       Ext.each(featureType.keywords, 
> function(keywords) {
>                                               var k = this.createNode({text: 
> keywords,
>                                                       nodeType: 'node',
>                                                       leaf: false
>                                               });
>                                               var test = true;
>                                               for (var i = 0, l = 
> root.childNodes.length; i < l; i++){
>                                                       var currentNode = 
> root.childNodes[i];
>                                                       if (k.text == 
> currentNode.text){
>                                                               test = false;
>                                                       };
>                                               };
>                                               var n = this.createNode({text: 
> featureType.title,
>                                                       // use nodeType 'node' 
> so no AsyncTreeNodes are created
>                                                       nodeType: 'node',
>                                                       layer: 
> this.createWFSLayer(data, featureType),
>                                                       leaf:true
>                                               });
>                                               if(test == true){
>                                                       root.appendChild(k);
>                                                       k.appendChild(n);
>                                               }else{
>                                                       
> currentNode.appendChild(n);
>                                               }
>                                       }, this);
>                                 }
>           }
>       
>              // customize the createNode method to add a checkbox to  
> nodes
>              ,createNode: function(attr) {
>                  attr.checked = attr.leaf ? false : undefined;
>                  return
> GeoExt.tree.WMSCapabilitiesLoader.prototype.createNode.apply(this,  
> [attr]);
>              }
> });
>
>
> Here is my TreePanel's RootNode which contains the WMS TreeLoader:
>
>       var root = new Ext.tree.AsyncTreeNode({
>                       expanded: true,
>                       text: 'Couches en WFS',
>                       loader: wms_loader
>       });
>
> Here is an AsyncNode which contains the WFS TreeLoader. At this moment,  
> it
> is not implemented in my current code:
>
>       var root2 = new Ext.tree.AsyncTreeNode({
>                       expanded: true,
>                       text: 'Couches en WMS',
>                       loader: wfs_loader
>       });
>
> Here is my general TreePanel:
>
>       var tree_catalog = new Ext.tree.TreePanel({
>               title: "Couches Disponibles",
>               anchor: '100% 50%',
>               collapsible: true,
>               collapsed: false,
>               titleCollapse: true,
>               autoScroll: true,
>               split: true,
>               //enableDD: true,
>               lines: false,
>               rootVisible: true,
>               root: root,
>               listeners: {
>              // Add layers to the map when ckecked, remove when  
> unchecked.
>              // Note that this does not take care of maintaining the  
> layer
>              // order on the map.
>              'checkchange': function(node, checked) {
>                  if (checked === true) {
>                      mapPanel.map.addLayer(node.attributes.layer);
>                  } else {
>                      mapPanel.map.removeLayer(node.attributes.layer);
>                  }
>              }
>          };
>
>
> So, at this moment, there are few commentaries. If you need some
> precisions, please ask me. What I think to do now: I will create a quite
> normal root node in my TreePanel, but nothing will be loaded trough this
> one. Then, I will create children, which will load new nodes on the root
> node (and not on themselves). These children will be "phantom" nodes:  
> they
> will be empty. It's not fine to do like this, but I'm looking for
> something that works! ;)
>
> Best regards,
>
> Geoffrey
>
>
>
> On Fri, 15 Jul 2011 12:47:43 +0200, Robert Buckley
> <robertdbuck...@yahoo.com> wrote:
>
>> Could you send some code please,
>>
>> cheers,
>>
>> Robert
>>
>>
>>
>>
>>
>> ________________________________
>> Von: gbrun <gb...@myopera.com>
>> An: users@geoext.org
>> Gesendet: Freitag, den 15. Juli 2011, 11:04:53 Uhr
>> Betreff: [Users] Two TreeLoader for the same TreePanel?
>>
>> Hi!
>>
>> I'm a little bit confused. I want to mix WMS and WFS layers in the same
>> TreePanel. To request these layers, I personalized a kind of
>> WMSCapabilitiesLoader in my web application and created a similar
>> function
>> to load WFS layers in a three. But now, my problem is to load these both
>> TreeLoader in the same TreePanel. In fact, it's possible to load them in
>> two separate AsyncNodes, but it's not what I want to do: I want an only
>> root node, which contains multiple nodes loaded by my both WMS and WFS
>> loaders. So I need to specify two loaders in my TreePanel, or two  
>> loaders
>> in the root AsyncNode from my TreePanel, or combine my two TreeLoader in
>> only one TreeLoader! But none of these solutions are working...
>>
>> Does anyone has an idea?
>>
>> Geoffrey
>> _______________________________________________
>> Users mailing list
>> Users@geoext.org
>> http://www.geoext.org/cgi-bin/mailman/listinfo/users
>
>


-- 
Using Opera's revolutionary email client: http://www.opera.com/mail/
_______________________________________________
Users mailing list
Users@geoext.org
http://www.geoext.org/cgi-bin/mailman/listinfo/users

Reply via email to