[as3] formularz kontaktowy w as3

Technologia Flash, czyli animacja na potrzeby stron WWW to świat daleko odbiegły od zwykłego programowania i kodu. Zapytaj o pomoc i podziel się z nami Twoimi problemami z zakresu Flasha.
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

[as3] formularz kontaktowy w as3

Post autor: argik »

Mam textInputa o nazwie "od", TextInputa o nazwie "temat", TextArea o nazwie "wiadomosc", button o nazwie "reset", button o nazwie "wyslij", pole tekst dynamiczny o nazwie "komunikat1" (do wyswietlania, ze np. wpisano za krotki adres email), pole tekst dynamiczny o nazwie "komunikat2" (do wyswietlania komunikatow bledu).

Kod: Zaznacz cały


stop(); 


reset.addEventListener (MouseEvent.CLICK, resetnasluchiwacz);

function resetnasluchiwacz(event:MouseEvent):void
{
    od.text="";
	temat.text="";
    wiadomosc.text="";
	komunikat1.text="";
}




// IndexOf - szuka danego znaku, jesli go nie znajdzie to zwraca "-1"
wyslij.addEventListener (MouseEvent.CLICK, wyslijnasluchiwacz);

function wyslijnasluchiwacz(event:MouseEvent):void
{
if (od.text.length<5 || od.text.indexOf("@")==-1 || od.text.indexOf(".")==-1) {komunikat1.text = "Proszę wpisać poprawny email.";} 
else if (temat.text.length<5) {komunikat1.text = "Proszę wpisać dłuższy temat wiadomości.";} 
else if (wiadomosc.text.length<10) {komunikat1.text = "Proszę wpisać dłuższą treść wiadomości.";} 


else 
{
	jeden.visible=false;
	od.visible=false;
	dwa.visible=false;
	temat.visible=false;
	trzy.visible=false;
	wiadomosc.visible=false;
	reset.visible=false;
	wyslij.visible=false;
	komunikat1.text="Wysyłanie wiadomości...";
	
	
	//obiekt klasy LoadVars komunikujący się z PHP:
	var aa:LoadVars=new LoadVars(); //zmienna do wysyłania danych z formularza do skryptu PHP
	var bb:LoadVars=new LoadVars(); //zmienna do sprawdzenia odpowiedzi ze skryptu PHP
	
	//zmienne do wysłania:
	aa.p1=od.text;
	aa.p2=temat.text;
	aa.p3=wiadomosc.text;
	
	
	
	
	
	//wykonaj gdy otrzymasz dane od skryptu php:
	bb.onLoad=function()
	{
		if(this.sent=="ok") {komunikat2.text="Wysłano wiadomość."; gotoAndStop(2);}
		else if(this.sent=="zle1" || this.sent=="zle2" || this.sent=="zle3") 
		{
			jeden.visible=true;
			od.visible=true;
			dwa.visible=true;
			temat.visible=true;
			trzy.visible=true;
			wiadomosc.visible=true;
			reset.visible=true;
			wyslij.visible=true;
			if(this.sent=="zle1")
			{
				komunikat1.text="Proszę wpisać poprawny email.";
			}
			else if(this.sent=="zle2")
			{
				komunikat1.text="Proszę wpisać dłuższy temat wiadomości.";
			}
			else if(this.sent=="zle3")
			{
				komunikat1.text="Proszę wpisać dłuższą treść wiadomości.";
			}
		}
		else {komunikat2.text="Nie udało się wysłać wiadomości, spróbuj później."; gotoAndStop(2);}
	}

	
aa.sendAndLoad ("mail.php", bb, "POST"); //wyślij i pobierz dane
}
}
Klasa LoadVars została zastąpiona w AS3 przez URLLoader i URLRequest no i pare innych klas. Więc próbowałem przerobić kod na AS3, ale nie udało się więc wróciłem do początkowej wersji i zamieściłem powyżej kod - możecie mi pomóc ?
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

as3 send load

Post autor: Marek_bf »

Przykład przesłania dwóch zmiennych z pól tekstowych (myInputTxt1, myInputTxt2) do PHP, w dodanie ich do siebie i odczytwnie wyniku we Flashu w polu myTxt

Kod: Zaznacz cały

mc.addEventListener(MouseEvent.MOUSE_DOWN, sendData);
//
function sendData(event:MouseEvent) {
	var myData:URLRequest = new URLRequest("plik.php");
	myData.method = URLRequestMethod.POST;
	//
	var variables:URLVariables = new URLVariables();
	variables.zmienna1 = myInputTxt1.text;
	variables.zmienna2 = myInputTxt2.text;
	myData.data = variables;
	//
	var loader:URLLoader = new URLLoader();
	loader.dataFormat = URLLoaderDataFormat.VARIABLES;
	loader.addEventListener(Event.COMPLETE, loadData);
	loader.load(myData);
}
//
function loadData(event:Event) {
	myTxt.text = event.target.data.wynik;
}
[php]<?php
$wynik = $_POST['zmienna1'] + $_POST['zmienna2'];
echo 'wynik='.$wynik;
?>[/php]
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

Re: [as3] formularz kontaktowy w as3

Post autor: argik »

Najpierw pojawiał mi się dziwny błąd że niby trzeba coś tam zdekodować - znalazłem rozwiązanie w Internecie, że w pliku PHP już nie piszemy jak w AS2: np.echo "&sent=ok&"; tylko teraz w AS3 piszemy w pliku php: echo "sent=ok"; czyli bez "&". Jednak mam kolejny kłopot, na który nie znalazłem w Internecie rozwiązania - wyświetla się komunikat:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at kontakt_fla::formularz_2/zaladowano()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()



Mój kod:

Kod: Zaznacz cały

wyslij.addEventListener (MouseEvent.CLICK, wyslijnasluchiwacz);

function wyslijnasluchiwacz(event:MouseEvent):void
{
if (od.text.length<5 || od.text.indexOf("@")==-1 || od.text.indexOf(".")==-1) {komunikat1.text = "Proszę wpisać poprawny email.";} 
else if (temat.text.length<5) {komunikat1.text = "Proszę wpisać dłuższy temat wiadomości.";} 
else if (wiadomosc.text.length<10) {komunikat1.text = "Proszę wpisać dłuższą treść wiadomości.";} 


else 
{

	jeden.visible=false;
	od.visible=false;
	dwa.visible=false;
	temat.visible=false;
	trzy.visible=false;
	wiadomosc.visible=false;
	reset.visible=false;
	wyslij.visible=false;
	komunikat1.text="Wysyłanie wiadomości...";
	
	
	
	var zadanie:URLRequest = new URLRequest("mail.php");
    zadanie.method = URLRequestMethod.POST; 
	
	var zmienne:URLVariables = new URLVariables();
    zmienne.p1 = od.text;
    zmienne.p2 = temat.text;
	zmienne.p3 = wiadomosc.text;
    zadanie.data = zmienne; 

   
    var loader:URLLoader = new URLLoader();
    loader.dataFormat = URLLoaderDataFormat.VARIABLES;
    loader.addEventListener(Event.COMPLETE, zaladowano);
    loader.load(zadanie); 
}
}


   function zaladowano(event:Event) 
   {

		if(this.sent=="ok") {komunikat2.text="Wysłano wiadomość."; gotoAndStop(2);}
		else if(this.sent=="zle1" || this.sent=="zle2" || this.sent=="zle3") 
		{
			jeden.visible=true;
			od.visible=true;
			dwa.visible=true;
			temat.visible=true;
			trzy.visible=true;
			wiadomosc.visible=true;
			reset.visible=true;
			wyslij.visible=true;
			if(this.sent=="zle1")
			{
				komunikat1.text="Proszę wpisać poprawny email.";
			}
			else if(this.sent=="zle2")
			{
				komunikat1.text="Proszę wpisać dłuższy temat wiadomości.";
			}
			else if(this.sent=="zle3")
			{
				komunikat1.text="Proszę wpisać dłuższą treść wiadomości.";
			}
		}
		else {komunikat2.text="Nie udało się wysłać wiadomości, spróbuj później."; gotoAndStop(2);}
	}

	
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [as3] formularz kontaktowy w as3

Post autor: Marek_bf »

Testujesz w środowisku edycyjnym, dostęp do pliku php masz bezpośredni, plik php nie jest wykonywany. Testuj na serwerze z obsługą PHP.
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

Re: [as3] formularz kontaktowy w as3

Post autor: argik »

Na serwerze też testowałem i tam ciągle widzę komunikat "wiadomość jest wysyłana". Ale tego akurat się spodziewałem na serwerze, bo jak testuję w środowisku edycyjnym to jesli wszystko jest ok to powinienem zobaczyć komunikat "nie udało się wysłać wiadomości" a tymczasem wyskakują błędy w adobe flash podczas testowania filmu. Błąd tkwi gdzies w kodzie as 3 :/
Tylko gdzie ten błąd? :(
-----------------------------------
-----------------------------------
Chyba Wiem !!!!!!!!!! W klatce pierwszej w której mam formularz mam coś takiego:

Kod: Zaznacz cały

else {komunikat2.text="Nie udało się wysłać wiadomości, spróbuj później."; gotoAndStop(2);}
Pole tekstowe "komunikat2" znajduje się jednak w klatce DRUGIEJ w której mam tylko pole tekstowe "komunikat2" i przycisk "powrót" !! W AS 2 można było tak zrobić, w AS 3 nie ?
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [as3] formularz kontaktowy w as3

Post autor: Marek_bf »

Jeśli odwołujesz się 1 jakiejś klatce do obiektu którego w tej klatce nie ma to skończy się to niepowodzeniem (undefined) tak a AS1, jaki AS2 oraz AS3.
Nie możesz odwoływać się do czegoś co nie istnieje.
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

Re: [as3] formularz kontaktowy w as3

Post autor: argik »

Jak się okazuje nie dochodzą do mnie wiadomości wysłane z tego formularza opublikowanego na serwerze - widzę komunikat "W pozostałych wypadkach." - pole tekstowe z takim komunikatem mam w klatce 4, a skoro nastapilo przejscie do klatki nr 4 jak wynika z mojego kodu ponizej to znaczy, ze Flash nie odbiera wartości zmiennej "sent" od PHP. Bo w moim kodzie PHP mam, że jesli uda się wysłać emaila to: echo "sent=ok"; jesli sie nie uda to echo "sent=fail";. A jako że we Flashu nastapiło przejście do klatki 4 to świadczy o tym, że Flash nie odebrał od PHP wartości zmiennej "sent" równej "ok" ani "fail" tylko pewnie "NULL" - dlaczego ?

Kod: Zaznacz cały

wyslij.addEventListener (MouseEvent.CLICK, wyslijnasluchiwacz);

function wyslijnasluchiwacz(event:MouseEvent):void
{
if (od.text.length<5 || od.text.indexOf("@")==-1 || od.text.indexOf(".")==-1) {komunikat1.text = "Proszę wpisać poprawny email.";} 
else if (temat.text.length<5) {komunikat1.text = "Proszę wpisać dłuższy temat wiadomości.";} 
else if (wiadomosc.text.length<10) {komunikat1.text = "Proszę wpisać dłuższą treść wiadomości.";} 


else 
{

	jeden.visible=false;
	od.visible=false;
	dwa.visible=false;
	temat.visible=false;
	trzy.visible=false;
	wiadomosc.visible=false;
	reset.visible=false;
	wyslij.visible=false;
	komunikat1.text="Wysyłanie wiadomości...";
	
	
	
	var zadanie:URLRequest = new URLRequest("mail.php");
    zadanie.method = URLRequestMethod.POST; 
	
	var zmienne:URLVariables = new URLVariables();
    zmienne.p1 = od.text;
    zmienne.p2 = temat.text;
	zmienne.p3 = wiadomosc.text;
    zadanie.data = zmienne; 

   
    var loader:URLLoader = new URLLoader();
    loader.dataFormat = URLLoaderDataFormat.VARIABLES;
    loader.addEventListener(Event.COMPLETE, zaladowano);
    loader.load(zadanie); 
}
}


   function zaladowano(event:Event) 
   {

		if(this.sent=="ok") {gotoAndStop(3);}
		else if(this.sent=="zle1" || this.sent=="zle2" || this.sent=="zle3") 
		{
			jeden.visible=true;
			od.visible=true;
			dwa.visible=true;
			temat.visible=true;
			trzy.visible=true;
			wiadomosc.visible=true;
			reset.visible=true;
			wyslij.visible=true;
			if(this.sent=="zle1")
			{
				komunikat1.text="Proszę wpisać poprawny email.";
			}
			else if(this.sent=="zle2")
			{
				komunikat1.text="Proszę wpisać dłuższy temat wiadomości.";
			}
			else if(this.sent=="zle3")
			{
				komunikat1.text="Proszę wpisać dłuższą treść wiadomości.";
			}
		}
		
		else if(this.sent=="fail") {gotoAndStop(2);}
				
		else {gotoAndStop(4);}
	}

Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [as3] formularz kontaktowy w as3

Post autor: Marek_bf »

W takich przypadkach zawsze sprawdź czy sam skrypt PHP bez udziału Flasha wyśle email, czyli zrób w HTML te pola, co masz we Flashu i wyślij.
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

Re: [as3] formularz kontaktowy w as3

Post autor: argik »

W html i php wszystko ok mi sie wysyla. Może w AS 3 żeby odebrać wartość zmiennej z php trzeba uzyc jeszcze jakiejs klasy ?
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

Re: [as3] formularz kontaktowy w as3

Post autor: argik »

A i jeszcze dodam, bo może xle się wyraziłem - wiadomości wysłane z tych formularzy do mnie dochodzą tyle, że nie wiem dlaczego następuje przejście do klatki 4 - która wyświetla się gdy nie odebrano z php wartości zmiennej "sent".
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [as3] formularz kontaktowy w as3

Post autor: Marek_bf »

NIe sprawdzaj this.send tylko event.target.data.send
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

Re: [as3] formularz kontaktowy w as3

Post autor: argik »

Ooooo wielkie dzięki - teraz jak wyświetlam wartość "event.target.data.sent" to wartość pobrana z php jest prawidłowa. Tylko niestety wygląda na to, że w AS 3 nie można juz porównywać stringów za pomocą "==", np.

Kod: Zaznacz cały

if(event.target.data.sent=="ok")
jest fałszywe
event.target.data.sent wyswietla wartość "ok", a mimo wszystko stwierdza że ta wartość jest różna od "ok". Jak w AS 3 można porównać stringi ?
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [as3] formularz kontaktowy w as3

Post autor: Marek_bf »

Twój zapis powinien działać bez problemu, sprawdź zgodność małych i wielkich liter, zobacz czy nie przesyłasz jakiegoś dodatkowego znaku, sprawdź jeszcze taki zapis:

Kod: Zaznacz cały

String(event.target.data.send) == "ok"
argik
Nowy
Nowy
Posty: 72
Rejestracja: czw lip 12, 2007 2:21 pm

Re: [as3] formularz kontaktowy w as3

Post autor: argik »

Więc tak - test na dwóch serwerach:
na darmowym serwerze yoyo.pl pokazuje komunikat z klatki 2, że nie udało się wysłać wiadomosci mimo że wiadomość do mnie dochodzi oraz mimo że wyświetlenie event.target.data.sent zwraca "ok" - na tym serwerze jakoś "ok" jest różne od "ok" 8O

na darmowym serwerze lua.pl - wszystko OK, wiadomość wysyła, pokazuje komunikat z klatki 3, że "wysłano wiadomość", na tym serwerze "ok" równa się "ok" 8)

Dziwne - jak widać to chyba zależy od serwera.



PS. U mnie jest "sent" a nie "send"
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [as3] formularz kontaktowy w as3

Post autor: Marek_bf »

Pokaz mi plik PHP, plik z kodem, nie sam kod.
ODPOWIEDZ