hello guyz i am having a problem with the login form. i am using the example of bruce phillps which can be found at this url "Login-System-For-A-Flex-Application-With-ColdFusion-Backend-Part-3--Custom-Login-Form-Component.htm". here is where am confused: my custom login form is called as a pop-up window from the main application while bruce's example it is called through another custom component(hope you understand what am saying), anyhow my question is "HOW CAN I HANDLE LOGIN SUCCESS THROUGH A POPUP LOGIN FORM" here is my code
"upload_form.as" // ActionScript file import mx.managers.PopUpManager; import mx.controls.Alert; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; import flash.events.Event; private var fileRef:FileReference; import mx.utils.ObjectUtil; import mx.events.ValidationResultEvent; // Define private variable to hold the Member //object returned by the CFC method private var __member:Member; // Define a getter method for the private variable. public function get member():Member { return __member; }//end get member /*Called automatically when the result is returned by the CFC method getMemberByUserNameAndPassword */ public function resultGetMemberByUserNameAndPassword(event:ResultEvent):void { //used for debugging - shows details about result //returned by the CFC method //Alert.show( ObjectUtil.toString(event.result) ); /*result returned is a Member object cast the result returned to a Member class and assign it to our Member object*/ __member = event.result as Member ; //remove text in the login input fields memUserName.text=""; memPassword.text=""; // Define event object, initialize it, then dispatch it. dispatchEvent(new Event("loginSuccess")); } //end function getMemberByUserNameAndPassword /* automatically called if the CFC method call causes an error */ private function faultGetMemberByUserNameAndPassword(event:FaultEvent):void{ //Alert.show( ObjectUtil.toString(event.fault) ); //Alert.show(event.fault.faultString ); currentState = 'loginError'; }//end function faultGetMemberByUserNameAndPassword /*Function is called automatically when the user makes changes to any of the registration input fields if all input fields are valid, the register btn is enabled */ private function validateRegistration():void { var usernameResult:ValidationResultEvent = userNameValidator.validate(); var passwordResult:ValidationResultEvent = passwordValidator.validate(); var firstnameResult:ValidationResultEvent = firstNameValidator.validate(); var lastnameResult:ValidationResultEvent = lastNameValidator.validate(); var emailResult:ValidationResultEvent = emV.validate(); var phoneResult:ValidationResultEvent = phV.validate(); var photoResult:ValidationResultEvent = photoValidator.validate(); var zipResult:ValidationResultEvent = zipValidator.validate(); var confirmResult:ValidationResultEvent = confirmPsV.validate(); if (usernameResult.type == ValidationResultEvent.VALID && passwordResult.type == ValidationResultEvent.VALID ) { loginButton.enabled = true; } else if(usernameResult.type == ValidationResultEvent.VALID && passwordResult.type == ValidationResultEvent.VALID && firstnameResult.type == ValidationResultEvent.VALID && lastnameResult.type == ValidationResultEvent.VALID && emailResult.type == ValidationResultEvent.VALID && phoneResult.type == ValidationResultEvent.VALID && photoResult.type == ValidationResultEvent.VALID && zipResult.type == ValidationResultEvent.VALID && confirmResult.type == ValidationResultEvent.VALID){ loginButton.enabled = true; } else { loginButton.enabled = false; }//end if (firstNameResult.type.. }//end function handleValid /* Called when loginBtn is clicked */ private function processLogin():void { //change state back to the default so the errorLogin state doesn't appear again currentState = ''; //Alert.show("Processing Login..."); MemberService.getMemberByUserNameAndPassword(memUserName.text, memPassword.text); }//end function processLogin /* automatically called if the CFC method call causes an error */ private function faultCreateMemberService(event:FaultEvent):void{ Alert.show( ObjectUtil.toString(event.fault) ); //TODO: handle the faults and provide instructions to the user }//end function faultGetMemberByUserNameAndPassword "login_reg.mxml" <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="PopUpManager.centerPopUp(this);init()" title="LogIn Form" titleStyleName="panelTitle" backgroundAlpha="0.8" backgroundColor="#000000" borderColor="#000000" borderAlpha=".8"> <!-- Define the transition to animate the change of view state. --> <mx:transitions> <mx:Transition> <mx:Parallel targets="{[this, form1, registerLink, loginButton]}"> <mx:Resize duration="500" easingFunction="myEasingFunction"/> <mx:Sequence target="{form1}"> <mx:Blur duration="200" blurYFrom="1.0" blurYTo="20.0"/> <mx:Blur duration="200" blurYFrom="20.0" blurYTo="1"/> </mx:Sequence> </mx:Parallel> </mx:Transition> </mx:transitions> <mx:states> <mx:State name="reg"> <mx:SetProperty target="{loginButton}" name="label" value="Register"/> <mx:SetProperty target="{registerLink}" name="label" value="Back to Login Form"/> <mx:SetEventHandler target="{registerLink}" name="click" handler="currentState=''"/> <mx:SetProperty target="{controlbar1}" name="y" value="238"/> <mx:SetProperty target="{formitem2}" name="y" value="150"/> <mx:SetProperty target="{formitem1}" name="y" value="150"/> <mx:AddChild relativeTo="{form1}"> <mx:FormItem x="0" y="0" label="First Name:"> <mx:TextInput id="memFirstName"/> </mx:FormItem> </mx:AddChild> <mx:AddChild relativeTo="{form1}"> <mx:FormItem x="251" y="0" label="Last Name:"> <mx:TextInput id="memLastName"/> </mx:FormItem> </mx:AddChild> <mx:AddChild relativeTo="{form1}"> <mx:HRule x="0" y="30" width="100%" height="22"/> </mx:AddChild> <mx:AddChild relativeTo="{form1}"> <mx:FormItem x="29" y="60" label="Email:"> <mx:TextInput id="memEmail"/> </mx:FormItem> </mx:AddChild> <mx:AddChild relativeTo="{form1}"> <mx:FormItem x="251" y="60" label="Cell Phone:"> <mx:TextInput id="memPhone"/> </mx:FormItem> </mx:AddChild> <mx:AddChild relativeTo="{form1}" position="lastChild"> <mx:FormItem x="9" y="90" label="Zip Code:"> <mx:TextInput id="memZip"/> </mx:FormItem> </mx:AddChild> <mx:AddChild relativeTo="{form1}" position="lastChild"> <mx:FormItem x="268" y="90" label="Country:"> <mx:ComboBox id="memCountry"> <mx:ArrayCollection> <mx:String>Ug</mx:String> <mx:String>Ke</mx:String> <mx:String>Rw</mx:String> <mx:String>Bj</mx:String> <mx:String>Tz</mx:String> </mx:ArrayCollection> </mx:ComboBox> </mx:FormItem> </mx:AddChild> <mx:AddChild relativeTo="{formitem1}" position="before"> <mx:HRule x="0" y="120" width="100%" height="22"/> </mx:AddChild> <mx:SetProperty target="{formitem1}" name="x" value="-3"/> <mx:SetProperty target="{formitem2}" name="x" value="261"/> <mx:AddChild relativeTo="{form1}" position="lastChild"> <mx:FormItem x="14" y="180" label="Confirm:"> <mx:TextInput id="memConfirm" displayAsPassword="true"/> </mx:FormItem> </mx:AddChild> <mx:AddChild relativeTo="{form1}" position="lastChild"> <mx:FormItem x="280" y="180" label="Photo:"> <mx:TextInput id="memPhoto"/> <mx:HBox width="100%"> <mx:Label id="message"/> <mx:Spacer width="100%"/> <mx:Button label="Upload" click="browseAndUpload();"/> </mx:HBox> </mx:FormItem> </mx:AddChild> <mx:SetProperty name="title" value="Registration Information"/> <mx:SetEventHandler target="{loginButton}" name="click" handler="insertHandler()"/> <mx:SetProperty target="{memPassword}" name="displayAsPassword" value="true"/> </mx:State> </mx:states> <mx:Metadata> [Event(name="loginSuccess", type="flash.events.Event")] </mx:Metadata> <mx:Script source="../logic/upload_form.as"/> <mx:RemoteObject id="agent" destination="ColdFusion" source="realestate portal.cfcs.MemberDAO"> <mx:method name="create" fault="mx.controls.Alert.show(event.fault.faultString)" /> </mx:RemoteObject> <mx:RemoteObject id="MemberService" destination="ColdFusion" source="realestate portal.cfcs.MemberService" showBusyCursor="true" > <mx:method name="getMemberByUserNameAndPassword" result="resultGetMemberByUserNameAndPassword(event)" fault="faultGetMemberByUserNameAndPassword(event)"/> </mx:RemoteObject> <!--These validators are called automatically anytime input changes on the registration form --> <mx:StringValidator id="userNameValidator" source="{memUserName}" property="text" required="true" maxLength="40" requiredFieldError="You must enter a user name."/> <mx:StringValidator id="passwordValidator" source="{memPassword}" property="text" required="true" maxLength="40" requiredFieldError="You must enter a password."/> <mx:StringValidator id="firstNameValidator" source="{memFirstName}" property="text" required="true" maxLength="40" requiredFieldError="You must enter your First Name."/> <mx:StringValidator id="lastNameValidator" source="{memLastName}" property="text" required="true" maxLength="40" requiredFieldError="You must enter your Last Name."/> <mx:EmailValidator id="emV" source="{memEmail}" property="text" required="true" requiredFieldError="You must enter an email address."/> <mx:PhoneNumberValidator id="phV" source="{memPhone}" property="text" required="true" requiredFieldError="You must enter a Phone Number."/> <mx:StringValidator id="photoValidator" source="{memPhoto}" property="text" required="true" maxLength="40" requiredFieldError="You must enter your Photo."/> <mx:ZipCodeValidator id="zipValidator" source="{memZip}" property="text" required="true" requiredFieldError="You must enter a Zip Code."/> <mx:StringValidator id="confirmPsV" source="{memConfirm}" property="text" required="true" maxLength="40" requiredFieldError="You must Confirm your Password."/> <!--End of Validators--> <mx:NumberFormatter id="numberFormatter" /> <mx:Zoom id="zoom" /> <mx:Canvas id="form1" width="100%" height="100%" backgroundAlpha="0"> <mx:FormItem x="0" y="0" label="User Name:" id="formitem1"> <mx:TextInput id="memUserName"/> </mx:FormItem> <mx:ControlBar id="controlbar1" y="62" width="100%"> <mx:LinkButton id="registerLink" label="Need to Register?" click="currentState='reg'" color="#ffffff"/> <mx:Spacer width="100%" id="spacer1"/> <mx:Button label="Login" id="loginButton" click="processLogin()" enabled="{(memUserName.text.length == 0 || memPassword.text.length == 0) ? false : true}" toolTip="{loginButton.enabled == true ? 'Click to submit' : 'Enter username and password'}"/> </mx:ControlBar> <mx:FormItem x="10" y="30" label="Password:" id="formitem2"> <mx:TextInput id="memPassword" displayAsPassword="true"/> </mx:FormItem> </mx:Canvas> </mx:TitleWindow> "MemberService.cfc" <cfcomponent displayname="MemberService" output="false" hint="Member Service"> <!---document each instance variable---> <cfproperty name="dsn" displayname="Datasource Name" hint="Datasource name used to connect CF to the database" type="string"> <!---initilization area - acts like a constructor as its called automatically---> <cfscript> variables.dsn = 'info'; </cfscript> <cffunction name="init" access="public" output="false" returntype="MemberService" hint="Constructor for this CFC"> <!--- take in the datasource name as an argument and set it to the variables scope so it's available throughout the CFC ---> <cfargument name="dsn" type="string" required="true" /> <cfset variables.dsn = arguments.dsn /> <!--- return the object itself ---> <cfreturn this /> </cffunction> <cffunction name="getMemberByUserNameAndPassword" access="public" output="false" returntype="Member" hint="Tries to find a record with a matching username and password. If only 1 record is found creates a Member object using the record's column values."> <cfargument name="aUserName" type="string" required="true" /> <cfargument name="aPassword" type="string" required="true" /> <cfset var getMember = "" /> <cfscript> var aMember = createObject("Component","Member").init(); </cfscript> <cftry> <cfquery name="getMember" datasource="#variables.dsn#"> select memID, memUserName, memPassword, memFirstName, memLastName, memEmail, memPhone, memPhoto, memZip, memCountry, memConfirm from member where memUsername = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.aUserName#"> and memPassword = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.aPassword#"> </cfquery> <!---throw error if no records were found---> <cfif getMember.recordCount EQ 0> <cfthrow type="Member.NoRecordsFound" message="No members with with username of #arguments.aUserName# and password of #arguments.aPassword# were found"> </cfif> <!---throw error if more than one record was found, violates business rule---> <cfif getMember.recordCount GT 1> <cfthrow type="Member.TooManyFound" message="Too many members with username of #arguments.aUserName# and password of #arguments.aPassword# were found" /> </cfif> <cfcatch type="database"> <!---there was a problem with a query---> <cfthrow type="Member.select" message="#cfcatch.detail#" /> </cfcatch> </cftry> <!---update the aMember object with values found in the record's columns---> <cfscript> aMember.setMemberID( getMember.memID); aMember.setUsername( getMember.memUserName); aMember.setPassword( getMember.memPassword); aMember.setFirstName( getMember.memFirstName); aMember.setLastName( getMember.memLastName); aMember.setEmail( getMember.memEmail); aMember.setPhone( getPhone.memPhone ); aMember.setPhoto( getPhoto.memPhoto ); aMember.setZip( getZip.memZip ); aMember.setCountry( getCountry.memCountry ); aMember.setConfirm( getConfirm.memConfirm ); </cfscript> <cfreturn aMember /> </cffunction><!---end function getMemberByUserNameAndPassword---> <cffunction name="createMemberService" access="public" output="false" returntype="void" hint="Pass Member object onto MemderDAO create function"> <cfargument name="aMember" type="Member" required="yes" /> <cfset var aMemberDAO = "" /> <cftry> <cfscript> aMemberDAO = createObject("component", "MemberDAO").init('info'); aMemberDAO.create(aMember); </cfscript> <cfcatch type="Member"> <cfthrow type="Member.create" message="#cfcatch.message#" /> </cfcatch> </cftry> </cffunction> </cfcomponent>