Zurück   Flashforum > Flex und AIR > Flex programmieren

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 05-10-2011, 18:02   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 7
Flex, PHP, MySQL: von ActionScript auf Panel zugreifen

Hallo liebe Leute, ich habe ein Problem...

Ich versuche via PHP und ZendAMF mehrere Produkte aus meiner MySQL Datenbank zu holen und diese mit Flex anzeigen zu lassen.

Ich möchte 10 Produkte, jeweils eines in einem Panel, anzeigen lassen, diese Panels soll es mir dynamisch generieren und jeweils mit den Produktdaten befüllen.

Allerdings scheitere ich gleich mal am Anfang:
Ich schaffe es nicht den Titel des Panels von Actionscript aus umzubenennen:

Wenn ich
Code:
dynamicPanel.title = produkt.titel
eingebe ist der Paneltitle null, wenn ich allerdings die Daten ganz genauso in meine Applikation lade und das Panel so anlege:
HTML-Code:
<s:Panel width="200" height="200" title="{produkt.titel}"
wird der Titel aus der Datenbank geladen und das ganze funktioniert wunderbar, allerdings tue ich mir dann mit dem dynamischen Erstellen/Befüllen der Panels etwas schwer.

Mein ganzer Code sieht nun so aus:
Code:
<?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" 
			   minWidth="955" minHeight="600" 
			   xmlns:produktservice="services.produktservice.*" 
			   xmlns:valueObjects="valueObjects.*" 
			   creationComplete="init()" >
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.events.FlexEvent;
			import spark.components.Panel;
			
			var dynamicPanel:Panel;
			
			protected function init():void
			{
				for (var i:int = 1; i<=10; i++) {
					getProduktByIDResult.token = produktService.getProduktByID(i);
					dynamicPanel = new Panel();
					dynamicPanel.title = produkt.titel;
					dynamicPanel.id = "dynamicPanel"+i;
					dynamicPanel.width = 400;
					dynamicPanel.height = 200;
					
					vGroupMain.addElement(dynamicPanel);
				}
			}
		]]>
	</fx:Script>
	<fx:Declarations>
		<produktservice:ProduktService id="produktService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/>
		<s:CallResponder id="getProduktByIDResult" result="produkt = getProduktByIDResult.lastResult as Produkt"/>
		<valueObjects:Produkt id="produkt"/>
	</fx:Declarations>
	<s:VGroup x="10" y="10" width="432" height="206" id="vGroupMain">
	</s:VGroup>
</s:Application>
Ich bin noch ein ziemlicher Neuling mit Flex, wenn mir irgendwer helfen könnte wäre das wirklich toll!

Liebe Grüße

PS: Die zugehörige Methode im PHP (automatisch generiert von dem Flash Builder Wizard) sieht dann so aus:
Code:
public function getProduktByID($itemID) {
		
		$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename where id=?");
		$this->throwExceptionOnError();
		
		mysqli_stmt_bind_param($stmt, 'i', $itemID);		
		$this->throwExceptionOnError();
		
		mysqli_stmt_execute($stmt);
		$this->throwExceptionOnError();
		
		mysqli_stmt_bind_result($stmt, $row->id, $row->katid, $row->titel, $row->beschreibung, $row->bild, $row->anzeigen, $row->hersteller);
		
		if(mysqli_stmt_fetch($stmt)) {
	      return $row;
		} else {
	      return null;
		}
	}
hacmac001 ist offline   Mit Zitat antworten
Alt 06-10-2011, 09:49   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.358
Naja, du greifst ja nicht auf die Instanzen zurück, die vom Server kommen, sondern nur auf die eine, die du in MXML erzeugst.
Omega Psi ist offline   Mit Zitat antworten
Alt 06-10-2011, 10:07   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 7
Hmm... Wie würde das dann codemäßig richtig aussehen?
Wie komme ich auf die Instanzen vom Server?

Mit dem
Code:
getProduktByIDResult.token
habe ich mich auch schon etwas gespielt, bin leider auf keinen grünen Zweig gekommen. :-/
hacmac001 ist offline   Mit Zitat antworten
Alt 06-10-2011, 10:09   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.358
Hast du mal debuggt, also via Debugger in das Result reingeschaut?
Omega Psi ist offline   Mit Zitat antworten
Alt 06-10-2011, 10:15   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 7
Ja hab ich, ich kenne mich ja wie gesagt nicht so wirklich aus, habe nach diesen Werten, die aus der Datenbank übergeben werden, im Debugger gesucht und sie nicht gefunden.
Für mich sieht das alles etwas nach Zauberei aus, also wie ich eben zum Beispiel den Titel des Panels mit
Code:
<s:Panel width="200" height="200" title="{produkt.titel}"
setze...
hacmac001 ist offline   Mit Zitat antworten
Alt 06-10-2011, 10:23   #6 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 7
Debugergebnis:



das war direkt nach:
Code:
getProduktByIDResult.token = produktService.getProduktByID(i);

Geändert von hacmac001 (06-10-2011 um 10:25 Uhr)
hacmac001 ist offline   Mit Zitat antworten
Alt 07-10-2011, 06:25   #7 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.358
Ne, das ist keine Zauberei, das ist ein Reihenfolge Problem, dass du hast. creationComplete wird dispatcht, bevor der RPC des Service terminiert. Das bedeutet, du musst in Abhängigkeit des Service die Werte setzen, nicht in Abhängigkeit der Applikation.

Ich würde dir empfehlen, mal gar kein MXML einzusetzen, außer um die Applikation zu definieren und mal schauen, was bei dir an Fragen aufkommen. Die beantworte ich gerne.
Omega Psi ist offline   Mit Zitat antworten
Alt 07-10-2011, 07:51   #8 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 7
Naja ich suche die einfachste und schönste Methode wie ich Daten von Mysql an Flex schicke und dort anzeigen lasse (und zwar nicht mit vorgefertigte Methode in ein Datagrid ziehen, was ja wunderschön funktionieren würde), sondern den Produkttitel in dem Paneltitle, die Produktbeschreibung als Text in dem Panel, den Produktpreis als Text in dem Panel und das dazugehörige Bild (auch aus der Datenbank) anzeigen lassen (wobei Bild jetzt noch unwichtig ist, wäre froh wenn der Rest funktioniert).

Und jetzt soll das Produkt 1 in Panel 1, Produkt 2 in Panel 2, etc. angezeigt werden, und diese untereinander in der VGroup platziert.

Ja, das war die Zusammenfassung, wie mache ich das?

Lg und danke im Voraus!

PS: Das mit dem creationComplete ist mir auch irgendwann gekommen, hab das dann verschoben zur VGroup:

Code:
<s:VGroup x="10" y="10" width="432" height="206" id="vGroupMain" creationComplete="init()">
	</s:VGroup>
Das Ergebnis hat sich dadurch aber nicht verändert.

Geändert von hacmac001 (07-10-2011 um 08:02 Uhr)
hacmac001 ist offline   Mit Zitat antworten
Alt 21-10-2011, 11:16   #9 (permalink)
Neuer User
 
Registriert seit: Oct 2011
Beiträge: 7
Das Problem hat sich jetzt ein wenig verändert.
Das Problem ist jetzt, dass das Programm nicht auf die Antwort vom CallResponder wartet. Ich habe jetzt ein wenig herum probiert, das Ergebnis war, dass entweder nur ein Panel angezeigt wurde wo das letzte Produkt darin enthalten war oder dass 10 Panels angezeigt wurden, die aber ohne Inhalt waren.

Ich denke, dass die Panels angelegt und angezeigt werden, bevor die Antwort vom Callresponder kommt, also eben nur das letzte Panel den richtigen Titel zugewiesen bekommt.

Wie warte ich jetzt also auf diese Antwort bevor ich das nächste Panel erstelle?

Ich habe es jetzt auch auf eine andere Art probiert, nämlich mit einem Button. Bei jedem Klick wird das nächste Panel mit aus der Datenbank geladenem Titel angezeigt. Das funktioniert problemlos, aber einen Button kann ich eigentlich nicht gebrauchen.....

Code:

Code:
<?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" 
    			   minWidth="955" minHeight="600" 
    			   xmlns:produktservice="services.produktservice.*" 
    			   xmlns:valueObjects="valueObjects.*">
    	<fx:Script>
    		<![CDATA[
    			import mx.containers.Panel;
    			import mx.controls.Alert;
    			import mx.rpc.events.ResultEvent;
    			
    			private var zaehler:int = 0;
    			
    			private function getProduktByID(i:int):void
    			{
    				getProduktByIDResult.token = produktService.getProduktByID(i);
    			}
    
    			private function init():void
    			{
    				for(var i:int=0; i<10; i++)
    				{
    					getProduktByID(818+i);
    				}
    			}
    			
    			protected function getProduktByIDResult_resultHandler(event:ResultEvent):void
    			{
    				var dynamicPanel:Panel;
    				dynamicPanel = new Panel();
    				dynamicPanel.id="dynamicPanel"+zaehler;
    				dynamicPanel.width=400;
    				dynamicPanel.height=200;
    				dynamicPanel.title=getProduktByIDResult.lastResult.titel;
    				
    				vPanelGroup.addElement(dynamicPanel);
    			}
    			
    			
    			protected function button1_clickHandler(event:MouseEvent):void
    			{
    				getProduktByID(818+zaehler);
    				zaehler++;
    			}
    			
    		]]>
    	</fx:Script>
    	<fx:Declarations>
    		<produktservice:ProduktService id="produktService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/>
    		<s:CallResponder id="getProduktByIDResult" result="getProduktByIDResult_resultHandler(event)"/>
    		<valueObjects:Produkt id="produkt"/>
    		<!-- Platzieren Sie nichtvisuelle Elemente (z. B. Dienste, Wertobjekte) hier -->
    	</fx:Declarations>
    	<s:VGroup id="vPanelGroup" gap="10" creationComplete="init()">
    	</s:VGroup>
    	<s:Button x="726" y="270" label="Button" click="button1_clickHandler(event)"/>
    </s:Application>
hacmac001 ist offline   Mit Zitat antworten
Alt 21-10-2011, 13:21   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.358
So, dann mal Butter bei dir Fische ...
  1. Die Deklaration für das VO ist in dem Declarations Element fehl am Platz - kein Mehrwert.
  2. Code:
    private function getProduktByID(i:int):void
    {
      getProduktByIDResult.token = produktService.getProduktByID(i);
    }
    Damit hast du in token immer genau den letzten Token stehen. Warum ist für mich nicht ersichtlich.
  3. Wieso nutzt du keine VOs?
Am einfachsten:
  1. Datenmodell erstellen
  2. Service implementieren
  3. Factory bauen, die für ein neues geladenes VO eine View erzeugt
So könnte man das machen.
Omega Psi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Flex 4 Panel Skinning | Elemente ansprechen aDoubleSo Flex programmieren 9 29-06-2011 12:08
Flex: Custom Panel - Mehrfachauswahl anlegen Wild Orange Flex allgemein 11 04-05-2010 11:13
"Visual Designer" für ActionScript/Flex/PHP/MySql ??? Sören Am Rande 5 14-08-2009 18:29
Flex Panel oder Navigationsbar vince1969 Flex programmieren 1 22-05-2008 19:17
Admin Panel für MySQL freakgesicht Flash und Datenbanken 6 09-02-2003 21:02


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele