IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

Amfphp et Spark Datagrid [Flex4]


Sujet :

Flex

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Amfphp et Spark Datagrid
    Bonjour,

    Via Flash Builder 4.6 je te tente de récupérer dans un spark datagrid les données du base mysql (amfphp 2.1 étant le connecteur PHP).

    Ci joint le code flex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
    			   xmlns:s="library://ns.adobe.com/flex/spark"
    			   xmlns:mx="library://ns.adobe.com/flex/mx"
    			   xmlns:contactservice="services.contactservice.*"
    			   xmlns:valueObjects="valueObjects.*"
    			   minWidth="750" 
    			   			   >
     
    	<fx:Script> 
    		<![CDATA[ 
    			import mx.controls.Alert;
    			import mx.events.FlexEvent;
    			import mx.rpc.events.FaultEvent;
    			import mx.rpc.events.ResultEvent;
    			import vo.ContactVO;
     
    			private function onFaultHandler(event:FaultEvent):void
    			{
    				trace(event.fault.faultDetail);
    			}
     
    			protected function myGrid_creationCompleteHandler(event:FlexEvent):void
    			{
    				myGrid.dataProvider = myRemote.getContacts() ;
     
    			}
     
    		]]> 
    	</fx:Script> 
     
    	<fx:Declarations>
    		<s:RemoteObject id="myRemote" destination="ContactService" source="ContactService"
    						 endpoint="http://localhost/Contacts-debug/Amfphp/" showBusyCursor="true"
    						 fault="onFaultHandler(event)" />
     
    	</fx:Declarations>
     
    		<s:DataGrid id="myGrid" 
    					dataProvider="{ myRemote.getContacts.lastResult }"
    					creationComplete="myGrid_creationCompleteHandler(event)"
    					editable="true" 
    					requestedRowCount="8" >
    			<s:columns> 
    				<s:ArrayList> 
    					<s:GridColumn width="100" dataField="nomaffiche" headerText="Nom à afficher" ></s:GridColumn> 
    					<s:GridColumn width="100" dataField="nom" headerText="Nom" ></s:GridColumn> 
    					<s:GridColumn width="90" dataField="prenom" headerText="Prénom" ></s:GridColumn> 
    					<s:GridColumn width="150" dataField="societe" headerText="Société" ></s:GridColumn> 
    					<s:GridColumn width="90" dataField="portable" headerText="Portable" ></s:GridColumn> 
    					<s:GridColumn width="100" dataField="email" headerText="Email" ></s:GridColumn> 
    				</s:ArrayList> 
    			</s:columns> 
    		</s:DataGrid>
     
    </s:Application>
    Rien ne s'affiche dans le datagrid malheureusement. Mais quand je remplace le contenu du s:datagrid par le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <mx:DataGrid id="myGrid" 
    		dataProvider="{myRemote.getContacts.lastResult}"
    		creationComplete="myGrid_creationCompleteHandler(event)"
    		editable="true"
    		rowCount="{ myRemote.getContacts.lastResult.length > 8 ? 8 : myRemote.getContacts.lastResult.length }"
    					   >
    			<mx:columns>
    				<mx:DataGridColumn dataField="nomaffiche" editable="false"/>
    				<mx:DataGridColumn dataField="nom" headerText="Nom"/>
    				<mx:DataGridColumn dataField="prenom" headerText="Prénom"/>
    				<mx:DataGridColumn dataField="societe" headerText="Société"/>
    				<mx:DataGridColumn dataField="portable" headerText="Portable"/>
    				<mx:DataGridColumn dataField="email" headerText="Email"/>
    			</mx:columns>
    </mx:DataGrid>
    Le tableau se remplit bien des données mysql. Pourquoi cette différence de comportement entre un s:datagrid et un mx:datagrid ?

    Cordialement.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Après recherche intensive sur le net depuis 2 semaines, autant sur les sites anglais que français, je n'ai trouvé aucun exemple qui montrait que amfphp fonctionnait avec un composant spark.

    J'en déduis que ce n'est pas possible !!!

    J'ai le même problème entre un s:List et mx:List

    Il ne me reste plus qu'à utiliser zend pour mes projets. En plus l'affichage des données mysql parait plus rapide.

    Dommage, amfphp semblait plus simple à implémenter.

  3. #3
    Membre expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Points : 3 189
    Points
    3 189
    Par défaut
    Bonjour,

    il est tout a fait possible d'utiliser amfphp avec tous les composants flex. Amfphp n'est qu'un pont/tunnel pour faire passer les données et n'a rien a voir avec les composants graphiques que tu peux utiliser.

    Je te conseille tout d'abord d'éviter de binder le dataprovider sur la propriété lastResult mais plutot d'écouter les event d'erreur de result que propose le RemoteObject, ensuite dans le result tu affectes tes resultats au dataprovider de ta datagrid (sous réserve que le résultat implemente IList).

    Passe en mode debug avec un point d'arret dans le handler de result pour voir ce que te retournes ton serveur, surement un probleme de donnée.

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  4. #4
    Membre habitué Avatar de vedder
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2003
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 166
    Points : 128
    Points
    128
    Par défaut
    les composants n'ont rien a voir avec Amfphp qui n'est effectivement qu'une passerelle entre un web service PHP et flash .

    la ou se situe ton probleme est que tu pense pouvoir recuperer le result de ton remoteobject en synchrone alors que le resultat te sera renvoye en asynchrone.
    ne binde pas ton dataprovider, rajoute l'ecouteur eventresult.result et affecte à ce moment la , pas avant

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci vous me rassurez.

    Reste à savoir maintenant comment faire ça.

    Je ne maitrise pas le concept des events. Et ce n'est pas faute d'avoir lu.

    Si vous avez une documentation ou un exemple de code qui me permet de faire ce que vous me préconisez, je suis tout ouïe.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    J'ai suivi vos pistes et tenté le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
    			   xmlns:s="library://ns.adobe.com/flex/spark"
    			   xmlns:mx="library://ns.adobe.com/flex/mx"
    			  	   minWidth="750" 
    			   			   >
     
     
     
    	<fx:Script> 
    		<![CDATA[ 
     
    			import mx.events.FlexEvent;
    			import mx.rpc.events.FaultEvent;
    			import mx.rpc.events.ResultEvent;
     
    			import vo.ContactVO;
     
     
    			private function onFaultHandler(event:FaultEvent):void
    			{
    				trace(event.fault.faultDetail);
    			}
     
     
    			protected function myGrid_creationCompleteHandler(event:FlexEvent):void
    			{
     
    				myRemote.getContacts(); 
     
    			}
     
    			private function onResultHandler(event:ResultEvent):void
    			{
    				myGrid.dataProvider = event.result as ArrayList;
     
    			}
     
     
    		]]> 
    	</fx:Script> 
     
    	<fx:Declarations>
    		<s:RemoteObject id="myRemote" destination="ContactService" source="ContactService"
    						 endpoint="http://localhost/Contacts-debug/Amfphp/" showBusyCursor="true"
    						 fault="onFaultHandler(event)" result="onResultHandler(event)" />
     
    	</fx:Declarations>
     
     
    		<s:DataGrid id="myGrid" width="50%" bottom="10"
    					creationComplete="myGrid_creationCompleteHandler(event)"
    					editable="false" horizontalCenter="0" verticalCenter="0"
    					requestedRowCount="8" selectionMode="multipleRows" visible="true" >
    			<s:columns> 
    				<s:ArrayList> 
    					<s:GridColumn width="50" dataField="id_contact" headerText="ID" editable="false"></s:GridColumn> 
    					<s:GridColumn width="100" dataField="nomaffiche" headerText="Nom à afficher" ></s:GridColumn> 
    					<s:GridColumn width="100" dataField="nom" headerText="Nom" ></s:GridColumn> 
    					<s:GridColumn width="90" dataField="prenom" headerText="Prénom" ></s:GridColumn> 
    					<s:GridColumn width="150" dataField="societe" headerText="Société" ></s:GridColumn> 
    					<s:GridColumn width="90" dataField="portable" headerText="Portable" ></s:GridColumn> 
    					<s:GridColumn            dataField="email" headerText="Email" ></s:GridColumn> 
    				</s:ArrayList> 
    			</s:columns> 
    		</s:DataGrid>
     
    </s:Application>
    Cependant en mode debug, myGrid.dataProvider = null alors que event.result contient bien les données mysql que je veux afficher.
    Qu'est-ce qui peut bien clocher ?

  7. #7
    Membre expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Points : 3 189
    Points
    3 189
    Par défaut
    Le cast que tu fais sur ton result provoque probablement le probleme... quel type renvoi tu depuis java (la méthode java getContacts retourne quel type ?) ?

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  8. #8
    Membre habitué Avatar de vedder
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2003
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 166
    Points : 128
    Points
    128
    Par défaut
    Au lieu d'un arraylist tu devrais essayer de mettre un ArrayCollection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grid.dataProvider = new ArrayCollection(provider);
    provider étant un tableau d'object.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Jim_Nastiq Voir le message
    quel type renvoi tu depuis java (la méthode java getContacts retourne quel type ?) ?
    En fait je n'utilise pas java, mais php. Le contactService du remoteobject pointe sur le code PHP suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
     
    class Contact
    {
    	public $id_contact = null;
    	public $nom = null;
    	public $prenom = null;
    	public $societe = null;
    	public $adresse = null;
    	public $complement = null;
    	public $cp = null;
    	public $ville = null;
    	public $tel_bureau = null;
    	public $portable = null;
    	public $tel_domicile = null;
    	public $tel_autre = null;
    	public $fax_domicile = null;
    	public $fax_bureau = null;
    	public $email = null;
    	public $note = null;
    	public $nomaffiche = null;
     
    	public $_explicitType = 'ContactVO';
     
    }
      public function getContacts() 
      {
    	  $sql= "SELECT
                  ".$this->table.".id_contact,
                  ".$this->table.".nom,
                  ".$this->table.".prenom,
                  ".$this->table.".societe,
                  ".$this->table.".adresse,
                  ".$this->table.".complement,
                  ".$this->table.".cp,
                  ".$this->table.".ville,
                  ".$this->table.".tel_bureau,
                  ".$this->table.".portable,
                  ".$this->table.".tel_domicile,
                  ".$this->table.".tel_autre,
                  ".$this->table.".fax_domicile,
                  ".$this->table.".fax_bureau,
    			  ".$this->table.".email,
    			  ".$this->table.".note,
    			  ".$this->table.".categorie,
    			  ".$this->table.".nomaffiche
             FROM ".$this->table;
     
    	//echo $sql;
     
         $stmt = mysqli_prepare($this->connection, $sql);
     
    	  $this->throwExceptionOnError();
     
          mysqli_stmt_execute($stmt);
          $this->throwExceptionOnError();
     
          $rows = array();
          mysqli_stmt_bind_result($stmt, 
    					$row->id_contact, $row->nom,
                        $row->prenom, $row->societe, $row->adresse,
                        $row->complement, $row->cp, $row->ville,  
                        $row->tel_bureau, $row->portable, $row->tel_domicile, $row->tel_autre, 
                        $row->fax_domicile, $row->fax_bureau, $row->email,
    					$row->note, $row->categorie, $row->nomaffiche
    					);
     
          while (mysqli_stmt_fetch($stmt)) 
    	  {
              $rows[] = $row;
              $row = new Contact();
              mysqli_stmt_bind_result($stmt, 
    					$row->id_contact, $row->nom,
                        $row->prenom, $row->societe, $row->adresse,
                        $row->complement, $row->cp, $row->ville,  
                        $row->tel_bureau, $row->portable, $row->tel_domicile, $row->tel_autre, 
                        $row->fax_domicile, $row->fax_bureau, $row->email,
    					$row->note, $row->categorie, $row->nomaffiche
    					);
          }
     
          mysqli_stmt_free_result($stmt);
          mysqli_close($this->connection);
     
          return $rows;
      }
    Dans le moniteur réseau de Flash Builder, dans le corps de la réponse j'ai bien le résultat de la requête de type AMF, et des objets de valeur ContactVO.
    Il y a un class mapping fait en actionscript pour ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    package vo
    {
     
    	[RemoteClass(alias="Contact")]
     
    	[Bindable]	
    	public class ContactVO
    	{
    		public var nom:String ;
    		public var prenom:String ;
    		public var societe:String ;
    		public var adresse:String ;
    		public var complement:String ;
    		public var cp:String ;
    		public var ville:String ;
    		public var tel_bureau:String ;
    		public var portable:String ;
    		public var tel_domicile:String ;
    		public var tel_autre:String ;
    		public var fax_domicile:String ;
    		public var fax_bureau:String ;
    		public var email:String ;
    		public var note:String ;
    		public var nomaffiche:String ;
     
    		public function ContactVO()
    		{
    		}
     
    	}
    }
    Je ne sais pas si ça te parle tout ce code.
    Il me semble bien avoir respecté toutes les étapes des tutoriaux qui traitaient cette situation.

  10. #10
    Membre expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Points : 3 189
    Points
    3 189
    Par défaut
    le souci vient du cast, je crois me rappeler que AmfPHP retourne un Array qd php renvoi un array.

    Donc tu tente ceci dans ton handler de result:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myGrid.dataProvider = new ArrayCollection(event.result as Array);

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 15
    Points
    15
    Par défaut [résolu]
    Ok super ça marche enfin. Je n'y croyais plus.

    J'avais bien sur essayé la technique de vedder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    myGrid.dataProvider = new ArrayCollection(event.result as Object)
    myGrid.dataProvider = new ArrayCollection(event.result as ArrayCollect)
    myGrid.dataProvider = new ArrayCollection(event.result as ArrayList)
    myGrid.dataProvider = new ArrayCollection(event.result as ContactVO)
    J'avais même essayé myGrid.dataProvider = event.result as ArrayCollection.

    Le seul que je n'avais pas essayé était "as Array". C'est le problème quand on ne comprend pas toujours ce que l'on fait. On tâtonne et on tombe à coté de la solution.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SPARK] DataGrid columns
    Par gunsailor dans le forum MXML
    Réponses: 2
    Dernier message: 27/07/2012, 20h33
  2. [Spark] datagrid checkbox
    Par Tan dans le forum Flex
    Réponses: 2
    Dernier message: 09/02/2012, 09h41
  3. flex amfphp datagrid
    Par G4uthier dans le forum Flex
    Réponses: 2
    Dernier message: 03/07/2009, 15h25
  4. [VB6] Datagrid afficher ou cacher des colonnes par code
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 06/02/2003, 17h19
  5. [] Datagrid vide après modification des propriétés
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/09/2002, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo