Bruke AMFPHP med AS3 og CodeIgniter

Using AMFPHP med AS3 og CodeIgniter
Del
Del
Del
Del

Dette Cyber ​​mandag Envato Tuts + Kursene vil bli redusert til bare $ 3. Ikke gå glipp av.

Det virker som om AMFPHP prosjektet har nå blitt stedt til hvile, dessverre er det aldri gjort det forbi 1.9 beta versjonen og heller ikke de tutorials. Men gjorde Adobe ikke gi opp på det som enkelt og med de nye Flex kompilatorer de har tatt med AMF3 objektet encoding!

Gode nyheter for alle dere kurvepunktene, men det er en annen historie for alt du AS3 ' ers. Flex kan du raskt og enkelt bygge en tjeneste som vil samhandle med AMFPHP kode, men du må få hendene skitne med AS3. Så, jeg har bestemt at det er på tide det er en anstendig sett av klasser der ute som hjelper Bob bygge et nettsted med AS3 bruker AMFPHP gateway.

Og for å kaste litt mer skitt inn i miksen, vi vil være integrere AMFPHP med CodeIgniter slik at vi har en fantastisk PHP rammeverk for backend.

Som du ser er det ikke mye å se på, men faktisk er det grunnlag for vår Flash kommunikasjonsklasser; Vi kan enkelt og greit å sende og motta data objekter mellom klientsiden og serversiden uten serialisering.

Før vi begynner ...

Det er en logisk ideen om at du har hatt en god dybden med Actionscript og PHP. Du trenger ikke nødvendigvis å vite hvordan du skal bruke CodeIgniter som du bare kunne bruke en PHP klasse som en tjeneste, men det er verdt å vite PHP

Trinn 1:.? Hvorfor bruke AMFPHP

Dette Spørsmålet blir kastet rundt mye. Vi vet at flash kan få data fra XML, JSON, osv ... Men AMFPHP bruker en annen form for koding kalles "Handling Message Format". Det er ganske enkelt å sende binære data heller enn ASCII. Nå er det mange blogginnlegg rundt sammenligne XML, JSON og AMF, men på slutten av dagen AMF har disse store fordeler:

Du trenger ikke å serienummererer noen data! For eksempel, hvis du sender noen objekter fra PHP til Flash, må du serienummererer dem som, si, JSON. Flash vil da ha å analysere dem for å få dem til å være brukbare, dette tar tid og hukommelse.

Det er lettere enn XML fordi du aldri duplisere selv. For eksempel i XML du må starte med en rot tag, da flere koder, deretter lukker koder, slik at du ser deg selv duplisere kodenavn og dette tar opp båndbredde. Videre mer, XML, akkurat som JSON, må analyseres i E4X og dette tar tid.

kan AMF være fullt integrert med PHP-kode som betyr at du kan skrive mindre kode. Jeg skal vise deg dette ved hjelp CodeIgniter samt AMF standardtjenester.

Husk, AMF er ikke en erstatning for XML eller JSON, det er rett og slett et annet verktøy i arsenalet ditt når det gjelder å utvikle skalerbare dynamiske applikasjoner

Trinn 2:. Set Up

Fyr opp din favoritt IDE, enten det er Flex Builder, FDT, FlashDevelop eller Textmate og opprette en ny Action prosjekt. I tillegg til dette, vil vi være å gjøre noen PHP koding også, så får din PHP IDE klar (jeg anbefaler Aptana)

I tillegg skal vi bruke GreenSock sin TweenLite klassen bare for å gi programmet en litt magi

For de av dere som har lest mine siste artiklene:. Vi kommer ikke til å bli hulene i PureMVC denne gangen som jeg ønsket utfallet av denne artikkelen for å være et sett med klasser som du kan gjenbruke igjen, med eller uten PureMVC

Trinn 3:. Opprette Base App

Akkurat som med en hvilken som helst Action app, vi trenger å sette opp vår base app. Jeg bare kommer til å starte med bare å lage en enkel bakgrunn for programmet, så vi kommer til å se på å skape tekstområdet for responsen og knappene for å sende en streng, array og objekt til PHP; så lage en ny fil som heter "App.as" innenfor "src /":
pakke {import flash.display.GradientType; import flash.display.Sprite; import flash.geom.Matrix; import flash.text.Font; [SWF (width = "600", height = "400", framerate = '30 ', bakgrunnsfarge =' # 000000 ')] public class App strekker Sprite {[Bygg (systemFont =' Arial ', skriftnavn =' Arial ', mimetype = 'application /x-font')] private Var arialFont: Klasse; offentlig funksjon App () {init (); } Private funksjon init (): void {var matte: Matrix = new Matrix (); Var bg: Sprite = new Sprite (); mat.createGradientBox (stage.stageWidth, stage.stageHeight, Math.PI * 0,5); bg.graphics.beginGradientFill (GradientType.LINEAR, [0x333333, 0x000000], [1, 1], [0, 255], matte); bg.graphics.drawRect (0, 0, stage.stageWidth, stage.stageHeight); bg.graphics.endFill (); addChild (bg); Font.registerFont (arialFont); }}}
Trinn 4: Opprette UI

Siden vi kommer til å trenge en slags UI for brukeren å kunne samhandle med vår app, er vi nødt til å kode én ! Nå er det opp til deg om du ønsker å opprette din UI i Flash IDE (eller den nye Flash Catalyst IDE, ser fin), men jeg kommer til å være hardcore og kode det ..

Når det gjelder UI komponenter, er vi etter:

En input tekstboksen

En knapp

En tekstområde

Det er bare starten til UI klasser, men disse er alt vi kommer til å trenge i øyeblikket

Trinn 5:. Opprette en Input tekstboks

Siden jeg tror at omskrivninger kode er akkurat lenge og unødvendig, la oss lage en gjenbrukbar UI knapp komponent. Opprett en ny fil som heter "InputTextField.as" innenfor "src /com /flashtuts /lib /display /ui" og bruke følgende kode innen det:
pakke com.flashtuts.lib.display.ui {import flash.display .Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFieldType; import flash.text.TextFormat; public class InputTextField strekker Sprite {private Var minWidth: Nummer = 200; private Var bg: Sprite; private Var felt: Textfield; offentlig funksjon InputTextField () {bg = new Sprite (); addChild (bg); felt = new Textfield (); addChild (felt); } Offentlig funksjon init (format: tekstformat, bredde: Antall = 0, høyde: Antall = 0, backgroundColour: uint = 0, strokeThickness: Antall = 0, strokeColour: uint = 0, cornerRadius: Antall = 0, padding: Number = 4 ): void {field.autoSize = TextFieldAutoSize.LEFT; field.defaultTextFormat = format; field.embedFonts = true; field.type = TextFieldType.INPUT; field.width = (? bredde > 0 bredde - (padding * 2): minWidth); field.x = padding; field.y = padding; bg.graphics.clear (); bg.graphics.lineStyle (strokeThickness, strokeColour); bg.graphics.beginFill (backgroundColour); bg.graphics.drawRoundRect (? 0, 0, (bredde > 0 bredde: field.width + (padding * 2)), (høyde > 0 høyde:? field.height + (padding * 2)), cornerRadius); bg.graphics.endFill (); } Offentlig funksjon sett tekst (tekst: String): void {field.text = tekst; } Offentlig funksjon få tekst (): String {return field.text; }}}

Nå, la oss gå raskt gjennom det. Vi starter med vår konstruktør, vi konstruerer våre to hovedvariabler: bakgrunnen "bg" og tekstfeltet 'feltet' så vi kan legge dem til scenen:
offentlig funksjon InputTextField () {bg = new Sprite (); addChild (bg); felt = new Textfield (); addChild (felt); }

Vår klasse er avhengig av brukeren ved hjelp av offentlig funksjon "init ()" som vil trekke bakgrunnen samt sette opp tekstfeltet:
offentlig funksjon init (format: tekstformat, bredde: Antall = 0, Høyde: Antall = 0, backgroundColour: uint = 0, strokeThickness: Antall = 0, strokeColour: uint = 0, cornerRadius: Antall = 0, padding: Number = 4): void {field.autoSize = TextFieldAutoSize.LEFT; field.defaultTextFormat = format; field.embedFonts = true; field.type = TextFieldType.INPUT; field.width = (? bredde > 0 bredde - (padding * 2): minWidth); field.x = padding; field.y = padding; bg.graphics.clear (); bg.graphics.lineStyle (strokeThickness, strokeColour); bg.graphics.beginFill (backgroundColour); bg.graphics.drawRoundRect (? 0, 0, (bredde > 0 bredde: field.width + (padding * 2)), (høyde > 0 høyde:? field.height + (padding * 2)), cornerRadius); bg.graphics.endFill (); }

Så endelig vi ønsker å være i stand til å sette litt tekst (hvis vi trenger det) og for å få tekst som brukeren har skrevet inn, så vi bruker get /set-funksjoner:
offentlig funksjon satt tekst (tekst: String): void {field.text = tekst; } Offentlig funksjon få tekst (): String {return field.text; }

Du kan se at du er i stand til å sette et stort antall variabler. Du kan alltid komme tilbake og endre dette, men for tiden er det fungerer for denne opplæringen, så la oss fortsette.

Vi ønsker nå å legge dette feltet på søknaden vår, så jeg har laget en ny funksjon kalt "addTextField ()", og kalte det innen "init ()", så vår app koden ser slik ut:
pakke {import com.flashtuts.lib.display.ui.InputTextField; import flash.display.GradientType; import flash.display.Sprite; import flash.geom.Matrix; import flash.text.Font; import flash.text.TextFormat; [SWF (width = "600", height = "400", framerate = '30 ', bakgrunnsfarge =' # 000000 ')] public class App strekker Sprite {[Bygg (systemFont =' Arial ', skriftnavn =' Arial ', mimetype = 'application /x-font')] private Var arialFont: Klasse; offentlig funksjon App () {init (); } Private funksjon init (): void {var matte: Matrix = new Matrix (); Var bg: Sprite = new Sprite (); mat.createGradientBox (stage.stageWidth, stage.stageHeight, Math.PI * 0,5); bg.graphics.beginGradientFill (GradientType.LINEAR, [0x333333, 0x000000], [1, 1], [0, 255], matte); bg.graphics.drawRect (0, 0, stage.stageWidth, stage.stageHeight); bg.graphics.endFill (); addChild (bg); Font.registerFont (arialFont); addTextField (); } Private funksjon addTextField (): void {var Textfield: InputTextField = new InputTextField (); textField.init (ny tekstformat ('Arial', 12, 0x000000), 200, 25, 0xFFFFFF, 1, 0x333333, 5); textField.text = 'Hello'; addChild (tekstfeltet); }}}

Du kan se at i funksjonen har jeg laget en ny tekstformat og bestått det, med andre parametere også, til vår "InputTextField ()" class. Fyr opp en forhåndsvisning, og du vil se teksten feltet øverst i venstre hjørne. Før vi plassere noe, la oss bli ferdig med andre UI komponenter

Trinn 6:. Opprette en knapp

Nå som vi har våre innspill tekstområdet ned, la oss lage en knapp som vil tillate oss å skyve data vi inn til AMFPHP. Så lage fil som heter "Button.as" innsiden "src /com /flashtuts /lib /display /ui /" og bruke følgende kode:
pakke com.flashtuts.lib.display.ui {import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; public class Button strekker Sprite {private Var bg: Sprite; private Var felt: Textfield; offentlig funksjon Button () {this.buttonMode = true; this.mouseChildren = false; bg = new Sprite (); addChild (bg); felt = new Textfield (); addChild (felt); } Offentlig funksjon init (tekst: String, format: tekstformat, backgroundColour: uint = 0, strokeThickness: Antall = 0, strokeColour: uint = 0, cornerRadius: Antall = 0, padding: Number = 4): void {field.autoSize = TextFieldAutoSize.LEFT; field.defaultTextFormat = format; field.embedFonts = true; field.mouseEnabled = false; field.text = tekst; field.x = padding; field.y = padding; bg.graphics.clear (); bg.graphics.lineStyle (strokeThickness, strokeColour); bg.graphics.beginFill (backgroundColour); bg.graphics.drawRoundRect (0, 0, field.width + (padding * 2), field.height + (padding * 2), cornerRadius); bg.graphics.endFill (); }}}

En rask gjennomgang: mye som vår "InputTextField ()" class, konstruerer vi våre to variabler 'bg "og" felt ", og også angi egenskaper slik at denne klassen fungerer som en knapp:
offentlig funksjonstasten () {this.buttonMode = true; this.mouseChildren = false; bg = new Sprite (); addChild (bg); felt = new Textfield (); addChild (felt); }

Igjen, akkurat som vår "InputTextField ()" class, setter vi opp visningen av klassen:
offentlig funksjon init (tekst: String, format: tekstformat, backgroundColour: uint = 0, strokeThickness: Number = 0, strokeColour: uint = 0, cornerRadius: Antall = 0, padding: Number = 4): void {field.autoSize = TextFieldAutoSize.LEFT; field.defaultTextFormat = format; field.embedFonts = true; field.mouseEnabled = false; field.text = tekst; field.x = padding; field.y = padding; bg.graphics.clear (); bg.graphics.lineStyle (strokeThickness, strokeColour); bg.graphics.beginFill (backgroundColour); bg.graphics.drawRoundRect (0, 0, field.width + (padding * 2), field.height + (padding * 2), cornerRadius); bg.graphics.endFill (); }

Til slutt må vi justere vår app basisklassen som så:
pakke {import com.flashtuts.lib.display.ui.Button; import com.flashtuts.lib.display.ui.InputTextField; import flash.display.GradientType; import flash.display.Sprite; import flash.geom.Matrix; import flash.text.Font; import flash.text.TextFormat; [SWF (width = "600", height = "400", framerate = '30 ', bakgrunnsfarge =' # 000000 ')] public class App strekker Sprite {[Bygg (systemFont =' Arial ', skriftnavn =' Arial ', mimetype = 'application /x-font')] private Var arialFont: Klasse; offentlig funksjon App () {init (); } Private funksjon init (): void {var matte: Matrix = new Matrix (); Var bg: Sprite = new Sprite (); mat.createGradientBox (stage.stageWidth, stage.stageHeight, Math.PI * 0,5); bg.graphics.beginGradientFill (GradientType.LINEAR, [0x333333, 0x000000], [1, 1], [0, 255], matte); bg.graphics.drawRect (0, 0, stage.stageWidth, stage.stageHeight); bg.graphics.endFill (); addChild (bg); Font.registerFont (arialFont); addTextField (); } Private funksjon addTextField (): void {var format: tekstformat = new tekstformat ('Arial', 12, 0x000000); Var Textfield: InputTextField = new InputTextField (); Var knapp: Knapp = new Button (); textField.init (format, 200, 25, 0xFFFFFF, 1, 0x333333, 5); textField.text = 'Hello'; addChild (tekstfeltet); button.init ('Klikk på meg! ", format, 0xCCCCCC, 1, 0x333333, 5); addChild (knapp); }}}

Hvis du kjørte dette i debug du ville se en knapp over et tekstfelt, så nesten der

Trinn 7: Opprett et tekstområde

Denne vant ' t være så hardt som vi har gjort det harde arbeidet i "InputTextField ()" class allerede, så alt vi trenger å gjøre er å sette høyden og bredden av vår textarea, en enkel nok kopiere og lime jobb. Så lage en ny fil som heter "InputTextArea.as" inne "src /com /flashtuts /lib /display /ui /" og bruke følgende kode:
pakke com.flashtuts.lib.display.ui {import flash.display .Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; public class InputTextArea strekker Sprite {private Var minHeight: Nummer = 200; private Var minWidth: Nummer = 200; private Var bg: Sprite; private Var felt: Textfield; offentlig funksjon InputTextArea () {bg = new Sprite (); addChild (bg); felt = new Textfield (); addChild (felt); } Offentlig funksjon init (format: tekstformat, bredde: Antall = 0, høyde: Antall = 0, backgroundColour: uint = 0, strokeThickness: Antall = 0, strokeColour: uint = 0, cornerRadius: Antall = 0, padding: Number = 4 ): void {field.autoSize = TextFieldAutoSize.LEFT; field.defaultTextFormat = format; field.embedFonts = true; field.multiline = true; field.wordWrap = true; field.height = (høyde > 0 høyde - (padding * 2):? minHeight); field.width = (? bredde > 0 bredde - (padding * 2): minWidth); field.x = padding; field.y = padding; bg.graphics.clear (); bg.graphics.lineStyle (strokeThickness, strokeColour); bg.graphics.beginFill (backgroundColour); bg.graphics.drawRoundRect (? 0, 0, (bredde > 0 bredde: field.width + (padding * 2)), (høyde > 0 høyde:? field.height + (padding * 2)), cornerRadius); bg.graphics.endFill (); } Offentlig funksjon sett tekst (tekst: String): void {field.text = tekst; } Offentlig funksjon få tekst (): String {return field.text; }}}

Jeg tror på dette punktet er det ingen grunn til å forklare hele klassen, men det er verdt å nevne konfigurasjonen av feltet som gjør at den kan bli et tekstområde. Vi bare lagt to flere eiendommer og sett dem til stede: "linjer" og "wordwrap '. Disse dukker input-boksen inn i et tekstområde

Så til slutt, la oss legge den siste komponenten til app-klasse:.
Pakke {import com.flashtuts.lib.display.ui.Button; import com.flashtuts.lib.display.ui.InputTextArea; import com.flashtuts.lib.display.ui.InputTextField; import flash.display.GradientType; import flash.display.Sprite; import flash.geom.Matrix; import flash.text.Font; import flash.text.TextFormat; [SWF (width = "600", height = "400", framerate = '30 ', bakgrunnsfarge =' # 000000 ')] public class App strekker Sprite {[Bygg (systemFont =' Arial ', skriftnavn =' Arial ', mimetype = 'application /x-font')] private Var arialFont: Klasse; offentlig funksjon App () {init (); } Private funksjon init (): void {var matte: Matrix = new Matrix (); Var bg: Sprite = new Sprite (); mat.createGradientBox (stage.stageWidth, stage.stageHeight, Math.PI * 0,5); bg.graphics.beginGradientFill (GradientType.LINEAR, [0x333333, 0x000000], [1, 1], [0, 255], matte); bg.graphics.drawRect (0, 0, stage.stageWidth, stage.stageHeight); bg.graphics.endFill (); addChild (bg); Font.registerFont (arialFont); addTextField (); } Private funksjon addTextField (): void {var format: tekstformat = new tekstformat ('Arial', 12, 0x000000); Var Textfield: InputTextField = new InputTextField (); Var textarea: InputTextArea = new InputTextArea (); Var knapp: Knapp = new Button (); textField.init (format, 200, 25, 0xFFFFFF, 1, 0x333333, 5); textField.text = 'Hello'; addChild (tekstfeltet); textArea.init (format, 200, 200, 0xFFFFFF, 1, 0x333333, 5); textArea.text = 'Tekst vises her som er returnert fra serveren!'; addChild (textarea); button.init ('Klikk på meg! ", format, 0xCCCCCC, 1, 0x333333, 5); addChild (knapp); }}}

Til slutt, la oss bare justere vår UI, så det er brukbart og sette 'tekstfeltet' og 'textInput "slik at de er klasse bredt funksjoner snarere enn innenfor" addTextField () "-funksjon:
pakken { import com.flashtuts.lib.display.ui.Button; import com.flashtuts.lib.display.ui.InputTextArea; import com.flashtuts.lib.display.ui.InputTextField; import flash.display.GradientType; import flash.display.Sprite; import flash.geom.Matrix; import flash.text.Font; import flash.text.TextFormat; [SWF (width = "600", height = "400", framerate = '30 ', bakgrunnsfarge =' # 000000 ')] public class App strekker Sprite {private Var Textfield: InputTextField = new InputTextField (); private Var textarea: InputTextArea = new InputTextArea (); [Bygg (systemFont = 'Arial', skriftnavn = 'Arial', mimetype = 'application /x-font')] private Var arialFont: Klasse; offentlig funksjon App () {init (); } Private funksjon init (): void {var matte: Matrix = new Matrix (); Var bg: Sprite = new Sprite (); mat.createGradientBox (stage.stageWidth, stage.stageHeight, Math.PI * 0,5); bg.graphics.beginGradientFill (GradientType.LINEAR, [0x333333, 0x000000], [1, 1], [0, 255], matte); bg.graphics.drawRect (0, 0, stage.stageWidth, stage.stageHeight); bg.graphics.endFill (); addChild (bg); Font.registerFont (arialFont); addTextField (); } Private funksjon addTextField (): void {var format: tekstformat = new tekstformat ('Arial', 12, 0x000000); Var knapp: Knapp = new Button (); textField.init (format, 200, 25, 0xFFFFFF, 1, 0x333333, 10); textField.text = 'Hello'; addChild (tekstfeltet); textArea.init (format, 300, 200, 0xFFFFFF, 1, 0x333333, 10); textArea.text = 'Tekst vises her at \\' s returnert fra serveren '; addChild (textarea); button.init ('Klikk på meg! ", format, 0xCCCCCC, 1, 0x333333, 10); addChild (knapp); textField.x = (stage.stageWidth /2) - ((textField.width button.width + + 20) /2); textField.y = 20; button.x = textField.x + textField.width + 20; button.y = 20; textArea.x = (stage.stageWidth /2) - (textArea.width /2); textArea.y = 60; }}}

Så det er vår base klasse ganske mye ferdig. Nå skal vi gå over til å skrive klassene for AMFPHP kommunikasjon

Trinn 8:. Fra og med det grunnleggende

Jeg antar at du har jobbet med lasting av data inn i Flash player før. Når du arbeider med statiske data som er normalt lastet rett ved starten av søknaden din blir lastet, ved hjelp av XML eller JSON er fine. Det er også fint med dynamiske data, men AMF gir deg fordelen av en konstant gateway, god ytelse og, viktigst, mindre kode å skrive så det er ikke nødvendig kode eller dekode dataene.

Hva vanligvis skjer når man jobber med data og Flash er du vanligvis enten laste en statisk fil eller har XML eller JSON dynamisk opprettet, for eksempel:

En statisk fil: ./assets/xml/data.xml

En dynamisk fil: http://mydomain.com/data.php?someId=1234

Det er alt rettferdig og godt lasting av data, men hva om du ønsker å sende data? Jepp du kan selvfølgelig sette opp et par klasser for å sende data til nettstedets dynamiske skript, men da vil du allerede har satt opp en klasse for å hente data og deretter må du endre det slik at det vil tillate deg å sende data. Pluss selvfølgelig, må du oppdatere dine dynamiske skript på servere stedets. Nå er dette hvor AMFPHP er så stor, trenger du bare å lage ett sett med klasser for Actionscript og deretter all din PHP-kode kan finnes én enkel kodebase. Jeg vil også utvide den til å vise deg hvordan du kan bruke et rammeverk, i dette tilfellet CodeIgniter

Trinn 9:. Opprette Action Classes

Siden AMFPHP er en ekstern tilkobling service, kan du ønsker å skape andre klasser i fremtiden, i tillegg til hva er poenget med å kopiere koden? Hva vi skal gjøre er å lage tre klasser:

"RemoteConnectionService.as": dette vil fungere som vår base klasse og vil ha nyttige funksjoner som vi kan bruke i fremtiden for andre fjerntilkoblingstjenester

"RemoteConnectionServiceEvent.as": dette vil fungere som den hendelser klasse som base klassen vil bruke

"AMFPHPService.as", og dette vil være vår AMFPHP forbindelse klasse

På denne måten vil vi være i stand til å skape en hyggelig sett med klasser, men også ha dem rene og skalerbar bør vi trenger å skrive noen nye i fremtiden

Trinn 10:. Opprette Base Class

Første vi vil gjøre er å starte med base klassen. Så lager du en fil som heter "RemoteConnectionService.as" innenfor "src /com /flashtuts /lib /data /" og det vil forlenge "NetConnection" class:
pakke com.flashtuts.lib.data {import flash.net .NetConnection; public class RemoteConnectionService strekker NetConnection {offentlig funksjon RemoteConnectionService () {super (); }}}

Nå har vi fått vår klasse, må vi skrive noen kode, så vi er nødt til å tenke på hva funksjoner kan plasseres innenfor base i stedet for dupliseres. Jeg vil foreslå å bruke konstruktøren å sette opp forbindelsen, deretter bruke basen til å håndtere eventuelle hendelser i forbindelse sender og til slutt lager vi en standard funksjon som vi vil bruke til å sende våre data.

Det første du må gjøre er å skrive vår konstruktøren:
pakke com.flashtuts.lib.data {import flash.events.NetStatusEvent; import flash.net.NetConnection; import flash.net.Responder; public class RemoteConnectionService strekker NetConnection {public Var handleReady: Boolean = true; offentlig Var data: Object; offentlig Var gatewayURL: String; offentlig Var responder: Responder; private Var loadedEvent: String; private Var readyEvent: String; private Var faultEvent: String; offentlig funksjon RemoteConnectionService (gatewayURL: String, loadedEvent: String = '', readyEvent: String = '', faultEvent: String = '', koding: uint = 3) {this.gatewayURL = gatewayURL; this.loadedEvent = loadedEvent; this.readyEvent = readyEvent; this.faultEvent = faultEvent; objectEncoding = koding; if (gatewayURL) {responder = new Responder (handleResponseResult, handleResponseFault); addEventListener (NetStatusEvent.NET_STATUS, handleNetEvent); koble (gatewayURL); }}}}

Nå lurer du kanskje på hva i all verden alt som er, ikke å frykte, her er en rask kjøre ned:

De offentlige vars:
Siden denne klassen kommer å opptre som en tjeneste vi trenger å fortelle det hvor AMFPHP gateway er derfor vi sette 'gatewayURL', dessuten for å få resultat og feil lyttere må vi lage en ny "Responder ()" (du kan lure på hvorfor dette er ikke gjennom arrangementer, kanskje Adobe var hungover den dagen), og vi vil binde denne responder på våre samtaler. Endelig er det alltid nyttig å ha muligheten til å lagre dataene vi får fra våre transaksjoner i en tilgjengelig offentlig var, i dette tilfellet kalt 'data'

De private vars og 'handleReady' var:.
Nå siden dette er base klassen for vår ekstern tilkobling service, kan det hende at du får lyst til å manipulere data før den sendes tilbake til søknaden din. Derfor stedet for bare å ha en "klar" hendelse sparken, har jeg satt en "lastet" event også. Dette vil tillate deg å koble inn i tjenesten, manipulere data og deretter sende den "klar" hendelse. Som standard, vil eventuelle underklasser definere disse hendelsene som en del av "RemoteConnectionServiceEvent () 'klasse, men vi har muligheten, når super-ing, å si noe annet, noe som åpner for større fleksibilitet.

Når vi konstruere klassen, husk dette er en base klasse, så det vil alltid være super-ed i stedet konstruert selv, vi passerer i 'gatewayURL', hendelsene, og kodingen verdi (dette er standard '3' som er AMF3 style koding, perfekt for oss)

Trinn 11:. Håndtering av Responses og hendelses

Nå må vi opprette forbindelse med arrangementet, responder handlers for denne klassen, så la oss legge dem:
Pakken com.flashtuts.lib.data {import com.flashtuts.lib.events.RemoteConnectionServiceEvent; import flash.events.NetStatusEvent; import flash.net.NetConnection; import flash.net.Responder; public class RemoteConnectionService strekker NetConnection {public Var handleReady: Boolean = true; offentlig Var data: Object; offentlig Var gatewayURL: String; offentlig Var responder: Responder; private Var loadedEvent: String; private Var readyEvent: String; private Var faultEvent: String; offentlig funksjon RemoteConnectionService (gatewayURL: String, loadedEvent: String = '', readyEvent: String = '', faultEvent: String = '', koding: uint = 3) {this.gatewayURL = gatewayURL; this.loadedEvent = loadedEvent; this.readyEvent = readyEvent; this.faultEvent = faultEvent; objectEncoding = koding; if (gatewayURL) {responder = new Responder (handleResponseResult, handleResponseFault); addEventListener (NetStatusEvent.NET_STATUS, handleNetEvent); koble (gatewayURL); }} Privat funksjon handleNetEvent (e: NetStatusEvent): void {dispatchEvent (ny RemoteConnectionServiceEvent (faultEvent, e.info.code)); } Private funksjon handleResponseResult (data: Object): void {dispatchEvent (ny RemoteConnectionServiceEvent (loadedEvent, data)); if (handleReady) {handleLoaderDataReady (data); }} Offentlig funksjon handleLoaderDataReady (data: Object): void {this.data = data; dispatchEvent (ny RemoteConnectionServiceEvent (readyEvent, data)); } Private funksjon handleResponseFault (data: Object): void {dispatchEvent (ny RemoteConnectionServiceEvent (faultEvent, data)); }}}

Her ser du at vi har lagt til responder funksjoner "handleResponseResult ()" og "handleResponseFault ()". Også har vi "handleNetEvent ()" bare incase noe faller på sin ansiktet og til slutt har vi "handleLoaderDataReady ()" som vil bli kalt når data er klar -. I stedet for noen kroker kan være lurt å bruke Anmeldelser

Du kan se at det alltid utsending hendelsene som du er i stand til å definere. Dette vil gi rom for større fleksibilitet og skalerbarhet i det lange løp

Trinn 12:. Opprette Hendelser Class

Siden vi utsending hendelser fra vår servicebase klasse, er det fornuftig å ha en standard hendelser klasse. Hvis du føler deg lat og gidder ikke å lage din egen hendelser klasse, kan du bare bruke dette som vi vil spesifisere klassen til å bruke disse hendelsene som standard, så oppretter du en fil som heter "RemoteConnectionServiceEvent.as" innsiden " src /no /flashtuts /lib /events /":
pakken com.flashtuts.lib.events {import flash.events.Event; public class RemoteConnectionServiceEvent strekker Hendelses {public static konst NAVN: String = 'RemoteConnectionServiceEvent'; public static konst LASTET: String = NAVN + 'Loaded'; public static konst KLAR: String = NAVN + 'Ready'; public static konst FEIL: String = NAVN + 'feil'; offentlig Var data: Object; offentlig funksjon RemoteConnectionServiceEvent (type: String, data: Object = null, bobler: Boolean = sant, cancelable: Boolean = false) {super (type, bobler, cancelable); this.data = data; }}}

Det er en ganske grunnleggende hendelser klasse, vi utvider standard "Event ()" class og legge vår egen offentlige Var kalt "data", slik at vi kan sende data med arrangementet og enkelt hente det gjennom vår lyttere

Trinn 13:. Opprette AMFPHP Class

Nå er vår base klasse, og det er hendelser klassen er klar, er alt vi trenger å gjøre utvide basen slik at vi kan bruke det til vår AMFPHP serviceklasse. Opprett en ny fil som heter "AMFPHPService.as" inne "src /com /flashtuts /lib /data /":
pakke com.flashtuts.lib.data {import com.flashtuts.lib.events.RemoteConnectionServiceEvent; import flash.net.ObjectEncoding; public class AMFPHPService strekker RemoteConnectionService {offentlig funksjon AMFPHPService (url: String) {super (url, RemoteConnectionServiceEvent.LOADED, RemoteConnectionServiceEvent.READY, RemoteConnectionServiceEvent.FAULT, ObjectEncoding.AMF3); }}}

Ikke bli forvirret, det vil alle være fornuftig i et par avsnitt tid, la oss starte med konstruktøren: som jeg har sagt lenger opp, vil vår base klasse alltid være super-ed, så innen konstruktøren vi passerer 'url' variabel gitt til denne klassen når det er konstruert samt hendelsene og til slutt standard koding. Grunnen til at jeg velger å skille "AMFPHPService ()" class fra "RemoteConnectionService ()" class er fordi det vil gi rom for større fleksibilitet og skalerbarhet, som du kan skrive andre tjenester som vil dra nytte av basen, men har ulike hendelser og funksjoner

Før vi fortsetter, er det verdt å snakke disse spesielle variabler kalt ... (hvile) som i utgangspunktet betyr at en funksjon kan akseptere en rekke kommaseparert argumenter, for eksempel.

Tradisjonelt du trenger å erklære en funksjons argumenter som dette:
funksjonstest (arg1, arg2, arg3, ARG4): void {...}

Men med ... (hvile) argumenter du kan gjøre dette:
funksjonstest (... args): void {...}

Og kalle det slik:
test ('var1', 'var2', 'var3', ' var4 ',' var5 ',' varn ',' varn + 1 ');

Så du kan bruke så mange variabler. Disse er deretter tilgjengelig i funksjonen som en matrise, for eksempel:
funksjonstest (... args): void {trace (args.length); } Test ('var1', 'var2'); //Spor to test ('var1', 'var2', 'var3', 'var4', 'var5'); //Spor 5

"NetConnection.call ()" tar nytte av disse ... (resten) argumenter slik at du kan sende en rekke argumenter til gatewayen. Men funksjonen krever at du også å gi den "responder", noe som vi opprettet i vår "RemoteConnectionService ()" class. Så siden vi alltid kommer til å trenge å bruke denne "samtalen ()" funksjon, men ikke ønsker å skrive 'responder "variabel hver gang vi bruker den, skal vi sette det innenfor vår base klasse. Gå videre og åpne opp "RemoteConnectionService ()" class deretter oppdatere den med denne:
pakken com.flashtuts.lib.data {import com.flashtuts.lib.events.RemoteConnectionServiceEvent; import flash.events.NetStatusEvent; import flash.net.NetConnection; import flash.net.Responder; import flash.display.GradientType; import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Matrix; import flash.text.Font; import flash.text.TextFormat; bg.graphics.endFill (); import flash.display.GradientType; import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Matrix; import flash.text.Font; import flash.text.TextFormat; bg.graphics.endFill (); import flash.display.GradientType; import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Matrix; import flash.text.Font; import flash.text.TextFormat; bg.graphics.endFill (); returnere $ verdi;



Previous:
Next Page: