Volledige versie bekijken : Flash Remoting: Kan geen waarde in een textField poepen
The_One
%Europe/Berlin %992 %2005, 00:49
yo gasten,
Ik werk pas met Flash Remoting [jaja, heb t werkend gekregen [met veel hulp van Folkert, thnx :)]]. Ik loop steeds vast.
Na 2 dagen googelen zit ik nog steeds vast :(
Ik wil een waarde uit mn db in een dynamicTextField krijgen, maar dit lukt niet.
Ik werk met AMFphp [hopelijk is dit geen rede om mij niet te helpen :p].
php script in mn services map:
class resultset
{
//Constructor and declaration
//methodTable for AMFPHP
function resultset()
{
$this->methodTable = array(
"getNaam" => array(
"description" => "Geeft de gegevens vd DVD weer",
"access" => "remote",
//"returns" => "string"
"arguments" => array ()
),
);
mysql_pconnect( localhost,
'root',
'');
mysql_select_db('flashBlog');
}
function getNaam()
{
$query2 = sprintf("SELECT code_dvd FROM dvd_gegevens WHERE id_dvd = 1");
return mysql_query($query2);
//return "Hello World";
}
}
?>
Ik maak gebruik van de RemotingConnector. OP deze component staat dit script:
on(result)
{
_parent.list_results.dataProvider = this.results;
}
Als ik dit doe dan laat Flash WEL mijn juiste waarde [= 1.01] zien.
Maar als ik dit doe:
on(result)
{
_root.naam_dvd.text = this.results;
}
Dan krijg ik dit te zien in mn dynamicTextField: [object Object]
Voor de duidelijkheid; mn RemotingConnector-component is dus wel goed ingesteld, want anders werkte het 1e maniertje niet.
Dit heb ik al geprobeerd:
_root.naam_dvd.text = this.results[0];
_root.naam_dvd.text = this.results.items[0];
maar dat werkte niet.
Ligt het mss aan mn php-file? Zo ja, wat moet er dan veranderd worden?
BVD :)
Ultim-o
%Europe/Berlin %666 %2005, 17:00
Het is sowieso niet echt 'best practice' om _root te gebruiken en om code op movieclips te zetten...
Probeer eens een for in loop over je results object, dan zie je precies hoe en wat..
En heb je bij amfphp geen netconnection debugger? Een swfje waar je alle communicatie inziet.. Bij gewone flash remoting heb je dit wel namelijk, dat is erg handig.
The_One
%Europe/Berlin %964 %2005, 00:09
Het is sowieso niet echt 'best practice' om _root te gebruiken en om code op movieclips te zetten...
Weet ik :) Maar zo stond t in de tut :)
Probeer eens een for in loop over je results object, dan zie je precies hoe en wat..
Ja, zoiets probeerde Narie me ook te vertellen, maar dat lukte ook niet. Als ik dit doe:
on(result)
{
for (var i in this){
trace(i);
}
}
Krijg ik dit te zien in mn output-scherm:
__result
__f_result
callsInProgress
__fieldCache
__addHighPrioEventListener
__setReadOnly
getBindingMetaData
getFieldFromCache
refreshAndValidate
getField
findSchema
addBinding
createField
createFieldAccessor
validateProperty
refreshDestinations
refreshFromSources
dispatchQueue
dispatchEvent
removeEventListener
addEventListener
serviceName
methodName
gatewayUrl
userId
password
suppressInvalidCalls
shareConnections
multipleSimultaneousAllowed
preview
En als ik dat dit doe:
on(result)
{
for (var i in this.__result){
trace(i);
}
}
zie ik dit:
logger
gateway_conn
serviceName
mRecordsAvailable
mTitles
uniqueID
_items
dispatchQueue
dispatchEvent
removeEventListener
addEventListener
serverInfo
Weer een stapje verder:
on(result)
{
for (var i in this.__result._items){
trace(i);
}
}
zie ik dit:
0
Maar zowel:
trace(this.__result._items);
als
trace(this.__result._items[0]);
Geeft: [object Object]
En heb je bij amfphp geen netconnection debugger? Een swfje waar je alle communicatie inziet.. Bij gewone flash remoting heb je dit wel namelijk, dat is erg handig.
Hmmz, ik heb t wel, maar ik weet niet hoe t werkt :(
meagain
%Europe/Berlin %535 %2005, 13:50
Probeer het gebruik vh RemotingConnector-component te vermijden ;) .
Stel je connectie met as in:
NetServices.setDefaultGatewayUrl(pth);
gateway_conn = NetServices.createGatewayConnection();
myService = gateway_conn.getService("resultset", listener);
Daarna (steeds op de _root) deze code:
my_btn.onPress = function(){
myService.getNaam('naam');
}
listener.getNaam_Result = function(tResult){
my_grid.dataProvider = tResult;
}
...zou voldoende moeten zijn. Een grid is op 1, 2, 3 gevuld met een 'recordset' uit mysql.
Probeer maar eens:
SELECT * FROM dvd_gegevens LIMIT 50;
The_One
%Europe/Berlin %933 %2005, 23:24
Bij mij werkt het niet. Ik heb een zipje toegevoegd met daarin:
FLA
SWF
SQL [db gegevens]
gateway.php
services/resultset.php
hopelijk komt er wat uit :)
bvd :)
Tha Narie
%Europe/Berlin %014 %2005, 01:21
for-ins kan je trouwens beter zo (iets extra) trace:
for(var i in obj) trace(i + " : " + obj[i]);
Jij traced alleen de key, maar niet de value.
The_One
%Europe/Berlin %902 %2005, 22:38
thnx narie :)
Ik had het al zo geprobeerd:
for (item in _parent.haalNaam.__result._items) {
trace(" "+item+": "+_parent.haalNaam.__result._items[item]);
}
Maar dan krijg ik alsnog dit:
3: [object Object]
2: [object Object]
1: [object Object]
0: [object Object]
Kan niemand mij helpen?
The_One
%Europe/Berlin %735 %2005, 18:38
thnx narie voor de hulp over msn :)
Maar het werkt nog steeds niet :(
Narie heeft me al een heel eind opweg geholpen, maar in mn functie getNaam zit een fout volgens mij
services/resultset.php:
<?php
class resultset
{
//Constructor and declaration
//methodTable for AMFPHP
function resultset()
{
$this->methodTable = array(
"listDvds" => array(
"description" => "Geeft de lijst van alle DVDs weer",
"access" => "remote",
"arguments" => array ()
),
"sayHello" => array(
"description" => "TEST: sending hello World back to flash",
"access" => "remote",
"returns" => "string"
),
"getNaam" => array(
"description" => "Geeft de gegevens vd DVD weer",
"access" => "remote",
//"returns" => "string"
"arguments" => array ()
),
);
mysql_pconnect( localhost,
'root',
'');
mysql_select_db('flashBlog');
}
//The actual function
function listDvds()
{
$query = sprintf("SELECT naam_dvd FROM dvd_gegevens ORDER BY naam_dvd asc"/* WHERE age = 55"*/);
return mysql_query($query);
}
function getNaam()
{
$query2 = sprintf("SELECT code_dvd FROM dvd_gegevens"/* WHERE id_dvd = 1"*/);
$result = mysql_query($query2) or die(mysql_error());
$namen_array = array();
while($row = mysql_fetch_assoc($result))
{
array_push ($namen_array, $row);
}
return $namen_array;
}
function sayHello(){
return "Hello World";
}
}
$test = new resultset();
$ret = $test->getNaam();
echo "<pre>";
print_r($ret);
echo "</pre>";
$test2 = new resultset();
$ret2 = $test2->listDvds();
echo "<pre>";
print_r($ret2);
echo "</pre>";
?>
output als ik dit php open in mn browser:
Array
(
[0] => Array
(
[code_dvd] => 1.01
)
[1] => Array
(
[code_dvd] => 1.02
)
[2] => Array
(
[code_dvd] => 1.03
)
[3] => Array
(
[code_dvd] => 1.04
)
)
Resource id #4
Resource id #4 is een fout, maar wat; ik denk zelf dat het in mn functie getNaam is, maar mn php-kennis is te beperkt om te zien wat er fout is...
meagain
%Europe/Berlin %829 %2005, 20:54
"Resource id #4" is geen fout, het is een verwijzing naar het result-set.
function getNaam()
{
$query2 = "SELECT * FROM dvd_gegevens;";
$result = mysql_query($query2) or die(mysql_error());
return $result;
}
Wijzig getNaam in je service eens naar deze code.
Daarna in flash (zet een datagrid op de stage met als instance-naam my_grid):
my_grid.dataProvider = result;
Een sql-resultset wordt in amf gegoten als recordset (d8 ik) en kan wel degelijk door flash worden verwerkt. Vliegensvlug zelfs, much faster dan het item per item ergens in te proppen.
meagain
%Europe/Berlin %847 %2005, 21:20
En wil je het resultaat uitlezen, doe je het op deze manier:
Wel op voorwaarde dat je het mysql_result terug stuurt!!
//Hoeveel rows zitten er in het result ?
for (var row in result){
//Hoeveel velden zitten er in een row ?
for (var field in row){
_root.my_txt.text += field + " : " + row[field] + "<br>";
}
}
my_txt is een textarea oid.
Tha Narie
%Europe/Berlin %872 %2005, 21:56
Een sql-resultset wordt in amf gegoten als recordset (d8 ik) en kan wel degelijk door flash worden verwerkt. Vliegensvlug zelfs, much faster dan het item per item ergens in te proppen.
Daar heb je volgens mij idd gelijk in. Werkte voorheen altijd zonder AMF, en dan heb je natuurlijk niets aan recordsets. Wist dat het met ColdFusion wel kon, maar wist niet zeker of dit met AMFphp ook werkte. Scheelt een hoop gedoe in PHP!
The_One
%Europe/Berlin %984 %2005, 00:37
Wel op voorwaarde dat je het mysql_result terug stuurt!!
Wat?:)
Je for-loops werken niet
my_grid valt ook niet te vullen :(
Jouw getNaam functie werkt wel.
Als ik nu dit doe:
for (var i in this.results.mTitles){
trace(i + " : " + this.results.mTitles[i]);
}
zie ik dit:
[object Object]
7 : date_y_dvd
6 : date_m_dvd
5 : date_d_dvd
4 : uitgeleend_dvd
3 : plaatje_dvd
2 : code_dvd
1 : naam_dvd
0 : id_dvd
De connectie werkt dus wel, maar ik wil de waardes van [bijv.] code_dvd, niet de label\
overigens:
dit:
for (var i in this.results){
trace(i + " : " + this.results[i]);
}
geeft dit als output:
[object Object]
logger : undefined
gateway_conn : [object Object]
serviceName : undefined
mRecordsAvailable : 4
mTitles : id_dvd,naam_dvd,code_dvd,plaatje_dvd,uitgeleend_dv d,date_d_dvd,date_m_dvd,date_y_dvd
uniqueID : 4
_items : [object Object],[object Object],[object Object],[object Object]
dispatchQueue : [type Function]
dispatchEvent : [type Function]
removeEventListener : [type Function]
addEventListener : [type Function]
serverInfo : null
meagain
%Europe/Berlin %395 %2005, 10:28
Heb net je project gedowloaded.
Ga straks, wanneer tijd, eens in neuzen.
AMFPHP bezorgt je heel wat kopbrekens eer je het door hebt, maar het loont echt de moeite! Volhouden is de boodschap!
Tha Narie
%Europe/Berlin %423 %2005, 11:10
//Hoeveel rows zitten er in het result ?
for (var row in result){
//Hoeveel velden zitten er in een row ?
for (var field in row){
_root.my_txt.text += field + " : " + row[field] + "<br>";
}
}
//Hoeveel rows zitten er in het result ?
for (var row in result){
//Hoeveel velden zitten er in een row ?
for (var field in result[row]){
_root.my_txt.text += field + " : " + result[row][field] + "<br>";
}
}
result[row] stond er niet bij, dubbele for klopte dus niet.
meagain
%Europe/Berlin %937 %2005, 23:29
@The_One:
Heb je een klein vb gemaakt van eenvoudige 'handelingen' met amfphp.
Heb geen commentaar bijgevoegd, daarom dit:
sayHello (Query 1) is om te testen of alles marcheert.
'Query 2' vult de datagrid met alle rows uit je db. Zou je met een query een 1000-tal records ophalen, zou je merken hoe snel de combinatie flash + amfphp is.
Een klik op een row in de datagrid haalt de details op (ook weer vliegensvlug).
fillComboBox haalt label + data op uit je table en 'bind' deze aan je combobox via de dataProvider. Ik hoef niet te vermelden dat dit ook weer ongelooflijk snel gebeurt.
Het voordeel van amfphp is dat je heel gestructureerd kan werken; je kan een Object sturen naar je service die deze ontvangt als een 'named array'. Of je laat je service een 'named array' terugsturen' die door as wordt ervaren als een Object.
Kortom, er zit toekomst in, en ik begrijp niet waarom een site die zich volledig op flash concentreert hier geen dankbaar gebruik van maakt.
Indien nog vragen / onduidelijkheden, stuur me maar een pm oid.
The_One
%Europe/Berlin %016 %2005, 01:23
ik krjig een error:
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 3: Error opening include file NetServices.as: File not found.
#include "NetServices.as"
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 4: Error opening include file NetDebug.as: File not found.
#include "NetDebug.as"
Total ActionScript Errors: 2 Reported Errors: 2
Ik heb de AS1 classes-dinges niet geïnstalleerd. Wel de AS2.
Ik heb dit geprobeerd er van te maken:
import mx.remoting.Service;
import mx.remoting.debug.NetDebug;
Maar dat lukt niet.
Narie zegt over GTalk dat ik de compontents moet gebruiken. Dat heb ik gedaan;
gatewayURL: http://localhost/dvdCollectie/gateway.php
methodName: sayHello
serviceName: test
OP de component staat dit:
on(result){
_root.situation_txt = this.result;
}
Maar geen resultaat...
meagain
%Europe/Berlin %565 %2005, 14:33
Begrijp niet wat er fout gaat.
Start de swf eens met het NetConnection Debugger window actief. Heb je een connectie? Welke fout krijg je bij het aanroepen v/e service? ...
Welke versie van Flash gebruik je??
Heb je in db.php alles aangepast?
Volhouden maar, het loont de moeite!
The_One
%Europe/Berlin %033 %2005, 01:48
Begrijp niet wat er fout gaat.
Same here...
Start de swf eens met het NetConnection Debugger window actief. Heb je een connectie? Welke fout krijg je bij het aanroepen v/e service? ...
Ik heb helemaal geen connectie, want ik zie niks [of ik kan niet met de venster omgaan].
Ik denk vooral dat het probleem ligt bij mijn classes, want ik heb die van AS2 gedownload, niet die van AS1. Ik kan wel die van AS1 downen, maar dan ben ik bang dat ik alles verneuk wat nog niet verneukt was. Of maakt dat niet uit?
Welke versie van Flash gebruik je??
Flash MX 2004 Prof
Heb je in db.php alles aangepast?
Jup, en de file staat in de service map
Volhouden maar, het loont de moeite!
Ik hoop het... :) Maar er is blijkbaar nog hoop :rolleyes:
A3D
%Europe/Berlin %505 %2005, 13:07
Als je op een gegeven moment (zoals je aangeeft) een werkend voorbeeld hebt, dan is dat werkende voorbeeld je vertrekpunt voor je volgende testje (of what ever)...lijkt mij.
Bij AMFphp gaat het allemaal om structuur. Als je die structuur eenmaal hebt, is het enige dat je doet de structuur kopiëren...die is gewoon altijd het zelfde. (projectmap en flashservicesmap op de root van server. In je projectmap de simpelGateway.php en de services map met daarin je php classen). Het is dus zaak om het te begrijpen...als je het niet begrijpt, bekijk je nog meer voorbeelden tot je het begrijpt...en dan ben je blij, omdat het eigenlijk zo simpel is. Print eens een paar topics uit...een uurtje lezen op de bank doet soms meer dan 4 weken naar je beeldscherm staren ;)
The_One
%Europe/Berlin %956 %2005, 23:57
Als je op een gegeven moment (zoals je aangeeft) een werkend voorbeeld hebt, dan is dat werkende voorbeeld je vertrekpunt voor je volgende testje (of what ever)...lijkt mij.
Ja, je hebt gelijk:), maar meagain heeft een hele FLA voor me gemaakt, en ik vind het lullig als ik dat negeer [en het zal vast 10x beter zijn dan dat wat ik gemaakt heb, dus probeer ik dat :)]
En ik heb dus al verder geprobeerd, maar als je niet weet hoe je moet proberen, dan lukt het niet :)
Het is dus zaak om het te begrijpen...als je het niet begrijpt, bekijk je nog meer voorbeelden tot je het begrijpt...
Ik probeer[de] zoveel mogelijk tuts en FLAs te bekijken, maar dat wil dus niet lukken :)
meagain
%Europe/Berlin %618 %2005, 15:49
Ga hier (http://www.sephiroth.it/tutorials.php) al eens rondkijken.
We helpen je verder tot het werkt [^] !
Tha Narie
%Europe/Berlin %858 %2005, 21:35
Misschien heb je hier wat aan (zie bijlage).
Is een Test Applicatie die ik aan het maken ben, waarmee je AmfClasses kunt testen.
Hoe hij gebruikt dient te worden staat in de help.
In het kort:
- vul gatewayURL in
- vul servicePath in (path vanuit services-dir gespecificeerd in je gateway, gescheiden door punten natuurlijk)
- vul method in die je wilt aanroepen
- (vul evt argumenten in die wilt meesturen)
- druk op Send
meagain
%Europe/Berlin %822 %2005, 20:43
Het blijft lang stil bij the_one.
Hopelijk voor hem heeft hij het niet opgegeven!
The_One
%Europe/Berlin %893 %2005, 22:26
srry beste helpers, ik was op introductie kamp afgelopen dagen :)
Mn studie begint weer, dus ik ga t een beetje druk krijgen, maar opgeven; Dat nooit!
Thnx narie, ik zal het een dezer dagen uitproberen [zoals ik al zei, kheb niet echt geweldig veel tijd] bedankt dat je me helpt :)
meagain; jij ook erg bedankt! ik geef niet op hoor :)
Jullie horen nog van me!
eerst ff heel wat slaap inhalen :p
The_One
%Europe/Berlin %750 %2005, 19:00
Misschien heb je hier wat aan (zie bijlage)
:)
Bedankt, je programma werk!
als ik dit invul:
gatewayURL: http://localhost/dvdCollectie/gateway.php
AMF Class: resultset
Remote Methode: getNaam
Krijg ik dit:
--== RESULT ==--
logger {
null
}
gateway_conn {
setupRecordSet: [type Function]
isRealTime: [type Function]
getNetDebug: [type Function]
updateConfig: [type Function]
addNetDebugHeader: [type Function]
sendClientEvent: [type Function]
sendServerEvent: [type Function]
sendDebugEvent: [type Function]
attachDebug: [type Function]
realAddHeader: [type Function]
realClose: [type Function]
realCall: [type Function]
realConnect: [type Function]
netDebugProxyFunctions: true
__originalUrl: http://localhost/dvdCollectie/gateway.php
__urlSuffix: ?PHPSESSID=e60ad6d20aa84450ff89d3df6130dfdb
_id: 0
_protocol: http
_config {
m_debug: true
client {
m_debug: true
trace: true
recordset: true
http: true
rtmp: true
}
realtime_server {
m_debug: true
trace: true
}
app_server {
m_debug: true
trace: true
error: true
recordset: true
httpheaders: false
amf: false
amfheaders: false
coldfusion: true
}
}
_configured: true
_headerAdded: true
contentType: application/x-fcs
}
serviceName {
undefined
}
mRecordsAvailable: 4
mTitles [
[7] date_y_dvd
[6] date_m_dvd
[5] date_d_dvd
[4] uitgeleend_dvd
[3] plaatje_dvd
[2] code_dvd
[1] naam_dvd
[0] id_dvd
]
uniqueID: 4
_items [
__ID__: 3
date_y_dvd: 2005
date_m_dvd: 8
date_d_dvd: 13
uitgeleend_dvd: nee
plaatje_dvd:
code_dvd: 1.04
naam_dvd: A Beautiful Mind
id_dvd: 4
__ID__: 2
date_y_dvd: 2005
date_m_dvd: 8
date_d_dvd: 1
uitgeleend_dvd: nee
plaatje_dvd:
code_dvd: 1.03
naam_dvd: The Matrix: Revolutions
id_dvd: 3
__ID__: 1
date_y_dvd: 2005
date_m_dvd: 8
date_d_dvd: 1
uitgeleend_dvd: nee
plaatje_dvd:
code_dvd: 1.02
naam_dvd: The Matrix: Reloaded
id_dvd: 2
__ID__: 0
date_y_dvd: 2005
date_m_dvd: 8
date_d_dvd: 1
uitgeleend_dvd: nee
plaatje_dvd:
code_dvd: 1.01
naam_dvd: The Matrix
id_dvd: 1
]
dispatchQueue: [type Function]
dispatchEvent: [type Function]
removeEventListener: [type Function]
addEventListener: [type Function]
serverInfo {
null
}
Mijn gegevens komen bij jouw FLA wel door! Ik wil nu erg graag weten hoe ik (bijv) code_dvd van __ID__: 0 kan krijgen :). Want met _items werkt het dus niet bij mij, wat ik al geprobeerd heb:)
Ik heb weer hoop gekregen :)!
The_One
%Europe/Berlin %970 %2005, 00:17
okay peeps, ondanks ik het stiekem had opgegeven, heeft narie mij toch geholpen; en het WERKT!
Ik moest gewoon dit neerkwakken:
.result._items[0].naam_dvd
zoo ****ing easy!
1 ding heb ik geleerd van dit hele gekloot: Gebruik NOOIT maar dan ook NOOIT components [iig niet de Remoting Component]! Sander Kessels zei in zijn Flashtival 2004 presentatie het al, en eigenwijs dat ik ben!
Hierbij verklaar ik Narie ook tot heiligste Flasher!
Thnx Narie dat je me uit de brand geholpen hebt! :)
meagain, jij ook mega bedankt, want jij hebt ook veel tijd gestoken in een eigenwijze puber! thnx :)!
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.