PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AMFPHP + Klassenvariablen


cttogo
07.05.2008, 20:10
Hallo Forum,

ich benutze AMFPHP 1.9 mit Flex 3.0.

ich habe eine Klasse item.php.

in der Klasse sind folgende Methoden.

function setID($id, $reload = true){
if(!Tools::isNumberOr0($id)){
$err_msg = 'Die übergebene Variable $id: '.$id.' ist keine Zahl oder 0!';
$GLOBALS['DEBUG_OBJECT']->addDebugMsg(__CLASS__.'->'.__FUNCTION__.'('.')' ,$err_msg,'error',__FILE__,__LINE__);
return false;
}

$this->id = $id;

if($reload){
$this->loadItemObject();
}
return true;
}

und

function loadItemObject(){
if(!Tools::isNumberOr0($this->getID())){
$err_msg = 'Die angeforderte Variable aus dem Aufruf $this->getID() '.$this->getID().' ist keine Zahl oder 0!';
$GLOBALS['DEBUG_OBJECT']->addDebugMsg(__CLASS__.'->'.__FUNCTION__.'('.')' ,$err_msg,'error',__FILE__,__LINE__);
return $err_msg;
}


$sql = 'SELECT * FROM items WHERE(id = %u)';

$sql = sprintf($sql,
$this->getID()
);

if ( (!$this->dbObj->query($sql) ) || ($this->dbObj->getRowCount() <= 0)){
$err_msg = $this->dbObj->getLastError().' <br /> '.$sql;
$GLOBALS['DEBUG_OBJECT']->addDebugMsg(__CLASS__.'->'.__FUNCTION__.'('.')' ,$err_msg,'error',__FILE__,__LINE__);
return $err_msg;
}

$this->dbObj->getData();
$this->setCategoryID($this->dbObj->data['category_id']);
$this->setName($this->dbObj->data['name']);
$this->setDescription($this->dbObj->data['description']);
$this->setOrderNr($this->dbObj->data['order_nr']);
$this->setStateCategoryMaster($this->dbObj->data['state_category_master']);
$this->setFlashMovieID($this->dbObj->data['flash_movie_id']);
$this->setStateActive($this->dbObj->data['state_active']);

$this->item_object['id'] = $this->getID();
return 'true';

}


Die Flex Applikation sieht zur Zeit so aus:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="733" height="400" borderColor="#FFFFFF" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#CFCFCF, #CFCFCF]" applicationComplete="loadData();">
<mx:ViewStack creationPolicy="all" />
<mx:RemoteObject id="classItem" fault="faultHandler(event)" showBusyCursor="true" source="item" destination="amfphp">
<mx:method name="setID" result="setIDHandler(event)" />
<mx:method name="loadItemObject" result="loadItemObjectHandler(event)" />
<mx:method name="getItemObject" result="getItemObjectHandler(event)" />
</mx:RemoteObject>


<mx:Script>
<![CDATA[

import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.controls.Button;
import com.allmediax.DataHandler;

private var bla:Boolean;

[Bindable]
public var item_id:String;

private function loadData():void{
// The FlashVars
var item:String = 'Item ID is ';
var myDate:Date = new Date();

item_id = Application.application.parameters.itemid;
item = item + item_id + ' ' + myDate.toString()+' !';;
info.text = item;
classItem.setID(item_id,false);
}

/* RemoteObject Error Handling */
private function faultHandler(fault:FaultEvent):void{
Alert.show(fault.fault.faultCode.toString());
}


private function setIDHandler(event:ResultEvent):void{
var bool:Boolean
bool = event.result as Boolean;
if(bool == true){
Alert.show('Ergebnis von setID() ist wahr');
classItem.loadItemObject.send();
} else{
Alert.show('Ergebnis von setID() ist falsch');
}
}


private function loadItemObjectHandler(event:ResultEvent):void{
var bool:String;
bool = event.result as String;

if(bool == 'true'){
Alert.show('Ergebnis von loadItemObject() ist wahr');
classItem.getItemObject.send();
} else{
Alert.show('Ergebnis von loadItemObject() ist ' + bool);
}
}


private function getItemObjectHandler(event:ResultEvent):void{
Alert.show('Aufruf von getItemObjectHandler ');
var dataArray:Array;
dataArray = event.result as Array;
Alert.show(dataArray.toString());
}
]]>
</mx:Script>
<mx:Label x="10" y="10" width="411" id="info" text="Toms Test"/>
<mx:Canvas x="581" y="0" width="152" height="46" id="can_title" backgroundColor="#C3BFBF">
<mx:Label x="10" y="10" text="Label" width="132" fontSize="12" fontWeight="bold" textAlign="right" id="lbl_title"/>
</mx:Canvas>
</mx:Application>

Wenn ich jetzt mit setID die item_id übergebe, ist diese nicht mehr vorhanden wenn ich mit loadItemObject das Objekt zur id laden möchte.

Wie kann ich dieses Problem lösen?

Vielen Dank fürs lesen.

Tom

WilliamX
08.05.2008, 08:50
Hallo Tom,

kannst du vielleicht noch deine $this->getID() methode zeigen? Oder im Endeffekt in:

function loadItemObject(){

die "id" Variable direkt benutzen (nur Testweise).

$this->id

Gruß

roberto

cttogo
08.05.2008, 11:29
Hallo Roberto,hallo Forum,

die getID() in der PHP-Klasse:

function getID(){
return $this->id;
}

Wenn ich die Variable mit an die Methode loadItemObject übergebe,

dann geht es. Was mich wundert, wenn ich nur php benutze gehen meine
Methoden einwandfrei. Hält amfphp die Variablen nicht? oder muss ich zusätzlich zu meiner PHP-Klasse noch eine andere Datei erstellen, so als Zwischenspeicher?

thx

Tom

WilliamX
08.05.2008, 12:12
Hallo Tom,

moment mal, vielleicht bin ich etwas ungeupdatet, aber kannst du mir vielleicht sagen, was das ist :


classItem.loadItemObject.send();
classItem.getItemObject.send();


reicht das nicht so zu schreiben:


classItem.loadItemObject();
classItem.getItemObject();



gruß

roberto

cttogo
08.05.2008, 12:20
Hallo Roberto,


reicht das nicht so zu schreiben:


classItem.loadItemObject();
classItem.getItemObject();




Jepp, das Tut welches ich hatte zeigte es mit dem .send() läuft aber auch / besser ohne. Das habe ich in meinem Quellcode auch schon geändert.

Ich war der Meinung, das Remote Object verhält sich wie eine normale Klasse und speichert den Inhalt der Klassenvariablen zwischen.

Wenn ich jetzt das Item mit loadItemObjectByID($id) lade und es in die Variable $this->item_object (Array) schreibe, wird mir in flex mit

var dataArray:Array;
dataArray = event.result as Array;
Alert.show(dataArray.toString());

eine leere Ausgabe gegeben.

Bin momentan am :confused: :confused: :confused:

thx
tom

WilliamX
08.05.2008, 12:34
hast du irgenein Debugger für die PHP remote Anfragen?

vielleicht kannst du erst mal wissen was passiert, erstens, ob die Anfrage geklappt hat, und zweitens ob Überhaupt ein Array zurrückgeschikt wird.

Da würde ich anfangen.

Du kannst auch checken, was event.result hat, oder wenn es null ist, ist was falsch in der PHP-Funktion gelaufen.

viel Glück

roberto

cttogo
08.05.2008, 16:23
hast du irgenein Debugger für die PHP remote Anfragen?


Nein, trotz suche bei Google. Kannst Du mir einen empfehlen?

thx
Tom

WilliamX
08.05.2008, 16:43
Mmnnhhh...

im Moment nicht, und fellt mir nicht grade ein, aber du kannst dir mit dem Debug Modus von Flex Builder helfen. Die Remote Anfrage monitorieren oder mindestens mit Server-Side Logs.

gruß

roberto

bort
09.05.2008, 07:57
Hier zwei Tools, um AMF Traffic zu monitoren:

ServiceCapture - sehr zu empfehlen ($34.99)
http://kevinlangdon.com/serviceCapture/

Charles (30 Tage Shareware, danach $50)
http://www.charlesproxy.com/

Du kannst natürlich auch mit low-level Tools wie z.B. wireshark (http://www.wireshark.org/) den Traffic monitoren, allerdings siehst Du dann nur die "Rohdaten", reicht aber evtl. fürs Debuggen aus.

Gruß,
Dirk.

cttogo
09.05.2008, 16:34
@bort Danke werde mich mal informieren.

@ALL

Versuche es jetzt mal ganz klein. Das mxml-File:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="733" height="400" borderColor="#FFFFFF" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#CFCFCF, #CFCFCF]" applicationComplete="loadData()">
<mx:ViewStack creationPolicy="all" />
<mx:RemoteObject id="aaa" fault="faultHandler(event)" showBusyCursor="true" source="test" destination="amfphp">
<mx:method name="say" result="sayHandler(event)" />
<mx:method name="setID" result="setIDHandler(event)" />
</mx:RemoteObject>


<mx:Script>
<![CDATA[
import mx.managers.CursorManager;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;

[Bindable]
private var item_id:Number;

private function loadData():void{
//item_id = Application.application.parameters.itemid;
item_id = 15; //local
debug.text = debug.text + 'ITEM-ID is ' + item_id +'\n';
aaa.setID(item_id);
debug.text = debug.text + 'Call aaa.setID('+item_id+')\n';
}

/* RemoteObject Error Handling */
private function faultHandler(fault:FaultEvent):void{
CursorManager.removeBusyCursor();
debug.text = debug.text + 'Error ' +'\n'+fault.fault.faultCode.toString();
}


private function setIDHandler(event:ResultEvent):void{
debug.text = debug.text + 'Result of aaa.setID() ' + event.result.toString()+'\n';
aaa.say;
debug.text = debug.text + 'Call aaa.say\n';
}

private function sayHandler(event:ResultEvent):void{
Alert.show('sayHandler');
debug.text = debug.text + 'Result of aaa.say ' + event.result.toString()+'\n';
info.text = 'Say ' + event.result.toString();
}



]]>
</mx:Script>
<mx:Label x="10" y="10" width="411" id="info" text="Toms Test"/>
<mx:Canvas x="581" y="0" width="152" height="46" id="can_title" backgroundColor="#C3BFBF">
<mx:Label x="10" y="10" text="Label" width="132" fontSize="12" fontWeight="bold" textAlign="right" id="lbl_title"/>
</mx:Canvas>
<mx:TextArea x="340" y="65" width="351" height="313" id="debug"/>
</mx:Application>


test.php
<?php

class test{

var $id = 12;
function say(){

$var = 399;
return $var;
}

function setID($id){
$this->id = $id;
return true;
}


function test(){

}
}
?>

Ich bekomme als Fehler:Client.Error.DeliveryInDoubt was eigendlich ein Syntaxfehler in der php-Datei ist. Ich glaube ich sehe den Wald vor lauter Bäumen nicht mehr:confused: :rolleyes: :confused: .

Mit der Bitte um Hilfe.

Tom

cttogo
21.05.2008, 11:09
Ich muss die übergebenen Variablen zwischenspeichern.