Comunidad de diseño web y desarrollo en internet online

ArrayCollection y XML generado por PHP

Citar            
MensajeEscrito el 17 Dic 2009 10:23 pm
Hola,
Tengo un xml que es generado por un PHP, el XML me devuelve un xml similar al siguiente:

Código :

<WSResult>
<secciones>
   <seccion>A</seccion>
   <Id>3</Id>
   <disponible>si</disponible>
   <aula>103</aula>
   <capacidad>20</capacidad>
   <detalles>segundo Piso</detalles>
</secciones>
<secciones>
   <seccion>B</seccion>
   <Id>7</Id>
   <disponible>si</disponible>
   <aula>108</aula>
   <capacidad>20</capacidad>
   <detalles>primer piso</detalles>
</secciones>

</WSResult>


Este xml lo recupeero con un HTTPService y un ArrayCollection de la siguiente forma:

Código ActionScript :

//El HTTPService

<mx:HTTPService id="seccionRequest" url="xmllistasecciongrado.php" result="getSecciones(event)"
      useProxy="false" method="POST">  
      <mx:request xmlns="">
         <idgrado>{grado}</idgrado>
         <anio>{anio}</anio>
      </mx:request>  
</mx:HTTPService>

//El objeto ArrayCollection

 [Bindable]
 private var lista_seccion:ArrayCollection=new ArrayCollection();

//Paso el XML al ArrayCollection

private function getSecciones(event:ResultEvent):void{
            lista_seccion=new ArrayCollection([event.result.WSResult.secciones]);       
         }
         
//Asigno el ArrayCollection un ComboBox como origen de datos:

<mx:ComboBox id="seccion_cbo" width="100" dataProvider="{lista_seccion}" labelField="seccion"></mx:ComboBox>




Lo cierto es que todo el código me funciona bien solo cuando el xml devuelve un registro, en caso contrario en el comboBox se muestra:
[Object] [Object],

¿Se me pasó por alto algo?
¿Hay alguna otra manera de trabajar con un xml dinamico(php), ArrayCollection y un Combobox?

Por escenariovirtual

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2009 01:57 pm
Chequea que el ArrayCollection que creas de event.result.WSResult.secciones tenga un length mayor a cero, sino no lo pongas como dataProvider

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Dic 2009 02:15 pm
Jorge, Gracias por responder, creí que este post lo habían eliminado porque lo cree ayer y hoy día al no verlo cree otro planteando mi problema de otro modo.

Ahora, sucede que cuando pongo: event.result.WSResult.secciones.length me devuelve undefinied si sólo tiene un sólo registro y si se supone que tiene más de dos recien me devuelve la cantidad correcta :S

Tambien cuando trato de imprimir el contenido de un campo determinado con el siguiente código:

event.result.WSResult.secciones.Id

cuando tiene un registro me lo reconoce, pero cuando tiene mas de uno me sale el siguiente error
Error: Unknown Property: 'Id'.

Por escenariovirtual

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2009 02:40 pm
Nop, primero creas, luego mides:

lista_seccion=new ArrayCollection([event.result.WSResult.secciones]);
if(lista_seccion.length>0) seccion_cbo.dataProvider = lista_seccion

Quítale el bindable a lista_seccion y el dataprovider en el MXML al combo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Dic 2009 03:02 pm
Hice lo que me propusiste, pero sigo igual, si el tamaño es 0, me muestra [object Object] y si el tamaño por decir es mayor que uno, ejemplo 3, me muestra [object Object],[object Object],[object Object]

Por escenariovirtual

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2009 04:22 pm
Ponle label al nodo que quieres que haga de label y data al que quieres que haga de data (en el XML), sino setea la propiedad labelField de tu combobox

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Dic 2009 08:31 pm
He estado investigando y he modificado toda mi aplicación,
1. en primer lugar obligo a que mi XML generado, siempre me devuelva un valor por defecto que es
<WSResult><secciones><seccion>seleccione seccion </seccion><Id>0</Id></secciones></WSResult>
2. luego al HTTPService le añadí la propiedad resultFormat="object".
3. y recibo el xml obtenido por el HTTPService con un Objeto.
4. despues, paso el contenido del Objeto a un ArrayCollection y finalmente el ArrayCollection lo asigno como dataProvider de mi Combobox tal y como me lo mensionaste, Jorge.

Código :

<mx:HTTPService id="seccionRequest" url="xmllistasecciongrado.php" result="getSecciones(event)"
      useProxy="false" method="POST" resultFormat="object">  
      <mx:request xmlns="">
         <idgrado>{grado}</idgrado>
         <anio>{anio}</anio>
      </mx:request>  
</mx:HTTPService>

private function getSecciones(event:ResultEvent):void{
            var resultObj:Object = event.result;

            var i:int=0;
            for(i;i<resultObj['WSResult'].secciones.length; i++){ 
            var oItem:Object = new Object();   
             if(i==0)
             {
                oItem.label= resultObj['WSResult'].secciones[i].seccion;
               oItem.data= resultObj['WSResult'].secciones[i].Id;
             }else{
               
               oItem.label= resultObj['WSResult'].secciones[i].seccion;
               oItem.data= resultObj['WSResult'].secciones[i].Id;
               oItem.disponible= resultObj['WSResult'].secciones[i].disponible;
               oItem.aula= resultObj['WSResult'].secciones[i].aula;
               oItem.capacidad= resultObj['WSResult'].secciones[i].capacidad;
               oItem.detalles= resultObj['WSResult'].secciones[i].detalles;
               
               }   
               lista_seccion.addItem(oItem);
            }
      
          
          if(lista_seccion.length>0) {
                 seccion_cbo.dataProvider = lista_seccion
             seccion_cbo.labelField="label";
            }


Ahora, el problema es que el ArrayCollection lista_seccion tiene que variar de datos y no unicamente recibir nuevos valores, para que unicamente se muestren los datos actuales del ComboBox y no los datos actuales más los anteriores...

Por escenariovirtual

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2009 08:42 pm
Problema resuelto, sólo tengo que colocar esto antes de agregarle nuevamente datos al ArrayCollection

Código :

lista_seccion.removeAll();


Jorge, muchas gracias por tus respuestas y tu tiempo :lol:

Por escenariovirtual

11 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.