Tworzenie dynamicznej Księgi Gości w ActionScript 3 + XML i PHP
9. Ustawianie pliku PHP
Plik musi być nazwany jako ksiega.php, jego zawartość posiada ten oto kod:
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])){
$xml = $GLOBALS["HTTP_RAW_POST_DATA"];
$plik = fopen("wiadomosci.xml","wb");
fwrite($plik, $xml);
fclose($plik);
}
?>
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])){
$xml = $GLOBALS["HTTP_RAW_POST_DATA"];
$plik = fopen("wiadomosci.xml","wb");
fwrite($plik, $xml);
fclose($plik);
}
?>
Skrypt sprawdza czy zostały przesłane jakieś dane, jeśli tak wykonuje operacje pobrania ich, później otwiera plik XML oraz nadpisuje zawartość, po czym zamyka plik.
Dodano przez: divix
Ranga: Administrator serwisu Punktów: 0
Ranga: Administrator serwisu Punktów: 0
Komentarze użytkowników
Nie działa.. Nie wiem dlaczego. W swojej wersji usunąłem pole tytuł. Czy ktoś mógłby przesłać mi poprawnie wykonany plik fla? Albo wskazać błąd. Po wrzuceniu wszystkiego na serwer nie wyswietlaja sie wiadomości z pliku "wiadomosci.xml" tlko w oknie pole_txt jest napisane "Wpisz się do księgi..". Poza tym moge edytowac zawartość pole_txt (w przykladzie jest nieaktywne). sprawdzalem i po kliknieciu na przycisk zawartosc pliku wiadomosci.xml nie zmienia sie... :( pomocy
- Zobacz kod dodany do tego wpisu
-
Error #2044: Unhandled ioError:. text=
Error #2032: Stream Error. URL: file:///<sciezka do pliku na dysku>/flash/wiadomosci.xml?ck=1243173607734
at guestbook_fla::MainTimeline/guestbook_fla::frame1()
-
autor: grygo@interia.pl | 203 | 2009-05-24 16:06:37
Sprawdź jeszcze raz ścieżkę do pliku XML, jeśli posiadasz już plik wiadomosci.xml w tym samym katalogu to ścieżka będzie jak poniżej, jeśli nie wtedy musisz uwzglęgnić katalogi lub ustalic ścieźke bezwględną. Najlepiej sprawdź obydwa sposoby.
Drugim problemem może być źle ustawione pole tekstowe pole_txt, pole to musi być dynamiczną (dynamic) wartością, nie natomiast input czy static.
- Zobacz kod dodany do tego wpisu
-
ścieżka wzgledna:
wiadomosci.xml
ścieżka bezwzgledna:
C:\katalog\wiadomosci.html
-
autor: Divix | 206 | 2009-05-25 01:22:40
dziękuję za odpowiedź. pole tekstowe zmieniłem na dynamiczne. sprawdziłem ścieżkę do pliku XML. podaje ja raz na początku w sposób względny. pliki umieszczam na serwerze. wchodzę na stronę. tym razem nie mogę edytować już tekstu z pola_txt :) niestety wysyłanie wiadomości nie działa a w polu_txt wyświetlany jest wyłącznie napis "wpisz się do księgi.." w pliku wiadomości istnieją fabryczne dwa wpisy jednak nigdzie ich nie widać. sprawdzałem ponownie czy w pliku XML zachodzą zmiany po próbie wpisu - niestety nie. plikowi XML nadałem zezwolenie 777. zarówno wiadomosc.xml, ksiega.php jak i sam plik SWF znajdują się w jednym folderze. nie wiem co źle zrobiłem. bardzo zależy mi aby zrobić to dobrze. pomocy.
autor: grygo@interia.pl | 221 | 2009-05-25 17:16:43
Sprawdziłem to dwukrotnie z innymi ścieżkami. Jednak problem był z adresowaniem. Z niewiadomych powodów dla flasha w tym przykładzie musisz zaadresować je bezwzględnie czyli np: http://localhost/phpflash/ksiega_gosci_w_xml/wiadomosci.xml . Ścieżka PHP również musi zostać zmieniona na bezwzględną.
autor: Divix | 222 | 2009-05-25 17:35:44
świetnie :) teraz wszystko gra i trąbi :) pięknie dziękuję. ciekawy jestem tylko czy istnieje możliwość wyświetlania wiadomości w kolejności od najnowszej do najstarszej? pozdrawiam!
autor: grygo@interia.pl | 227 | 2009-05-26 16:18:13
W jaki sposób dodać węzeł z nowa pozycja na początku treści pliku XML? tak aby nowe wpisy wyświetlane były na początku a stare można było oglądać przewijając listę w dół? czy może wymaga to innego zabiegu? proszę o pomoc.
autor: GO | 230 | 2009-05-28 00:12:46
Aby nowe wiadomości były wyświetlane na górze, a stare na dole, wystarczy wpisać te 4 linijki kodu tuż na początku funkcji aktualizacja():
- Zobacz kod dodany do tego wpisu
-
Imie.reverse();
Tytul.reverse();
Data.reverse();
Tekst.reverse();
-
autor: Divix | 231 | 2009-05-28 02:28:54
mam spory problem, zrobiłam ksiegę gości i dodałam nawet ten kod co wyswietla świeże wpisy na początku i wszystko jest ok gdyby nie to, że księga gości mi sie nie odswieża sama tylko po wciśnięciu f5 lub ctrl+f5 co mam zrobic, zeby sama sie odświeżała?? poniżej podaje kod który mam. Ps i drugi problem to gdy mam adres bezwzględny do plików php i xml to gdy wpisze np www przed adresem w przegladarce to juz mi księgi nie widzi. POMOCY :)
- Zobacz kod dodany do tego wpisu
-
var sciezka_do_pliku_XML = "http://wewa.pl/01/wiadomosci.xml";
var sciezka_do_pliku_PHP = "http://wewa.pl/01/ksiega.php";
var pierwsza_wiadomosc:String = "Wpisz się do księgi..";
//////////////NIE DO EDYCJI /////////////////
imie_input.text = "";
tytul_input.text = "";
tekst_input.text = "";
pole_txt.htmlText = pierwsza_wiadomosc;
var cache_killer:String = "?ck="+ new Date().getTime();
var plikXML:URLRequest = new URLRequest(sciezka_do_pliku_XML+cache_killer);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, plik_wczytany);
addEventListener(Event.ENTER_FRAME, sprawdzaj);
wyslij_btn.enabled = false;
wyslij_btn.addEventListener(MouseEvent.MOUSE_UP, wyslij_dane);
loader.load(plikXML);
var wiadomosci:XML = new XML();
wiadomosci.ignoreWhitespace = true;
var xmlList:XMLList;
var Imie:Array = new Array();
var Tytul:Array = new Array();
var Data:Array = new Array();
var Tekst:Array = new Array();
function plik_wczytany(e:Event):void {
wiadomosci = XML(e.target.data);
xmlList = wiadomosci.children();
for (var i:int=0; i<xmlList.length(); i++) {
var xmlImie:String = xmlList[i].imie;
var xmlTytul:String = xmlList[i].tytul;
var xmlData:String = xmlList[i].data;
var xmlTekst:String = xmlList[i].tekst;
Imie.push(xmlImie);
Tytul.push(xmlTytul);
Data.push(xmlData);
Tekst.push(xmlTekst);
if (i == xmlList.length() -1) {
aktualizacja();
}
}
}
function aktualizacja():void {
Imie.reverse();
Tytul.reverse();
Data.reverse();
Tekst.reverse();
pole_txt.htmlText = "";
for (var i:int = 0; i<xmlList.length(); i++) {
pole_txt.htmlText += ("<b><u>Imię:</u></b> " + Imie[i]);
pole_txt.htmlText += ("<b><u>Tytul:</u></b> " + Tytul[i]);
pole_txt.htmlText += ("<b><u>Data:</u></b> " + Data[i]);
pole_txt.htmlText += ("<b><u>Wiadomość:</u></b> " + Tekst[i]);
pole_txt.htmlText += ("..........................................................................................");
}
scroll.scrollTarget = pole_txt;
}
function sprawdzaj(e:Event):void {
if (imie_input.text != "" && tytul_input.text != "" && tekst_input.text != "") {
wyslij_btn.enabled = true;
}
}
function wyslij_dane(e:MouseEvent):void {
var dzisiaj:Date = new Date();
var miesiac:uint = dzisiaj.getMonth();
var miesiace:Array = new Array("Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień");
var dzisiejsza_data:String = (dzisiaj.getDate()+" "+miesiace[miesiac]+" "+dzisiaj.getFullYear());
var nowa_pozycja:XML = XML("<wiadomosc><imie>" + imie_input.text + "</imie><tytul>" + tytul_input.text + "</tytul><data>"+ dzisiejsza_data + "</data><tekst>" + tekst_input.text + "</tekst></wiadomosc>");
wiadomosci.appendChild(nowa_pozycja);
var plikPHP:URLRequest = new URLRequest(sciezka_do_pliku_PHP+cache_killer);
plikPHP.data = wiadomosci;
plikPHP.contentType = "text/xml";
plikPHP.method = URLRequestMethod.POST;
var loader2:URLLoader = new URLLoader();
loader2.load(plikPHP);
loader2.addEventListener(Event.COMPLETE, plik_wczytany2);
}
function plik_wczytany2(e:Event) :void {
Imie = [];
Tytul = [];
Data = [];
Tekst = [];
imie_input.text = "";
tytul_input.text = "";
tekst_input.text = "";
wyslij_btn.enabled = false;
pole_txt.htmlText = "";
loader.load(plikXML);
}
-
autor: WEWA | 274 | 2009-06-24 22:36:17
1. Skrypt został tak napisany, że po każdym dodanym wpisie zostaje przeładowany automatycznie. Ewidentnie aktualizacja w twoim przykładzie nie spełnia swojego zadania, może spróbować usunąć kod poniżej tuż na końcu funkcji plik_wczytany.
2. Nie napisałaś gdzie znajduje się plik SWF, czy w tym samym katalogu? Drugim problemem może być brak dostęp jeśli plik SWF jest na innym FTP wtedy musisz pozwolić plikowi Flasha wykorzystywać zasoby przez nowy serw. Więcej o tym poszukaj pod frazą cross-domain.xml .
- Zobacz kod dodany do tego wpisu
-
if (i == xmlList.length() -1) {
}
//pozostaw natomiast wpis: aktualizacja();
-
autor: Divix | 277 | 2009-06-25 13:48:26
Dziękuje za radę, ale gdy wyciełam tą linijkę, którą mi wskazałeś to zawieśiła mi się przeglądarka kilka razy i flash cs3 podczas test movie, może można w inny sposób? :) Co do Twojego pytania gdzie znajduje się plik swf to w tym samym katalogu co plik php i xml oraz html z swf-a. Sorki, że Ci zawracam głowe, ale zalezy mi na tym by to działało :) Będę wdzięczna za dalszą pomoc.
autor: WEWA | 279 | 2009-06-25 20:50:49
Skrypt został odpowiednio zmodyfikowany i teraz korzysta również ze zmiennej w PHP o nazwie "zapis", jeśli plik został zapisany wtedy dopiero Flash wczyta zawartość pliku XML.
Problem polegał na tym, że Flash w jednej chwili wysyłał zapytanie do pliku PHP aby zapisał nowe dane, ale zaraz po tym wczytywał plik XML. Najwyraźniej w świecie PHP nie był w stanie w tak szybkim tempie wykonać swój kod, czyli Flash zaciągał dane XML tuż przed zapisem (czyli te same), co konsekwentnie widać było po wynik odświeżenia strony.
Jeśli chodzi o drugi problem, to dla Flasha nie ma różnicy czy dajesz localhost czy też http adres, każdy jest traktowany tak samo, czyli musisz jeszcze raz sprawdzić ścieżki tych plików, oraz sprawdzić jaką wersje odtwarzacza Flash Playera masz na przeglądarce (bo na dysku widać, że masz wystarczającą). Wystarczy, że klikniesz w adres i zainstalujesz co trzeba: http://get.adobe.com/flashplayer/?promoid=BUIGP (powinno pomóc).
- Zobacz kod dodany do tego wpisu
-
/////////////////////////////////////////////
//////////// KONTROLER SKRYPTU /////////////
///////////////////////////////////////////
//Określ dostęp do twoich plików XML i PHP
//////////////////////////////////////////
var sciezka_do_pliku_XML = "http://localhost/phpflash/ksiega_gosci_w_xml/wiadomosci.xml";
var sciezka_do_pliku_PHP = "http://localhost/phpflash/ksiega_gosci_w_xml/ksiega.php";
var pierwsza_wiadomosc:String = "Wpisz się do księgi..";
//skrypt pobrany ze strony: http://Funkcje.net
//////////////NIE DO EDYCJI /////////////////
imie_input.text = "";
tytul_input.text = "";
tekst_input.text = "";
pole_txt.htmlText = pierwsza_wiadomosc;
var cache_killer:String = "?ck="+ new Date().getTime();
var plikXML:URLRequest = new URLRequest(sciezka_do_pliku_XML+cache_killer);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, plik_wczytany);
addEventListener(Event.ENTER_FRAME, sprawdzaj);
wyslij_btn.enabled = false;
wyslij_btn.addEventListener(MouseEvent.MOUSE_UP, wyslij_dane);
loader.load(plikXML);
var loader2:URLLoader = new URLLoader();
loader2.addEventListener(Event.COMPLETE, plik_wczytany2);
var pierwsze_zaladowanie:Boolean = true;
var wiadomosci:XML = new XML();
wiadomosci.ignoreWhitespace = true;
var xmlList:XMLList;
var Imie:Array = new Array();
var Tytul:Array = new Array();
var Data:Array = new Array();
var Tekst:Array = new Array();
function plik_wczytany(e:Event):void {
var dane:URLVariables = new URLVariables(loader2.data);
if (pierwsze_zaladowanie == true || dane.zapis == "ok") {
wiadomosci = XML(e.target.data);
xmlList = wiadomosci.children();
for (var i:int=0; i<xmlList.length(); i++) {
var xmlImie:String = xmlList[i].imie;
var xmlTytul:String = xmlList[i].tytul;
var xmlData:String = xmlList[i].data;
var xmlTekst:String = xmlList[i].tekst;
Imie.push(xmlImie);
Tytul.push(xmlTytul);
Data.push(xmlData);
Tekst.push(xmlTekst);
if (i == xmlList.length() -1) {
aktualizacja();
}
}
pierwsze_zaladowanie == false;
}//koniec ifa
else{
loader.load(plikXML);
}
}
function aktualizacja():void {
Imie.reverse();
Tytul.reverse();
Data.reverse();
Tekst.reverse();
pole_txt.htmlText = "";
for (var i:int = 0; i<xmlList.length(); i++) {
pole_txt.htmlText += ("<b><u>Imię:</u></b> " + Imie[i]);
pole_txt.htmlText += ("<b><u>Tytul:</u></b> " + Tytul[i]);
pole_txt.htmlText += ("<b><u>Data:</u></b> " + Data[i]);
pole_txt.htmlText += ("<b><u>Wiadomość:</u></b> " + Tekst[i]);
pole_txt.htmlText += ("..........................................................................................");
}
scroll.scrollTarget = pole_txt;
}
function sprawdzaj(e:Event):void {
if (imie_input.text != "" && tytul_input.text != "" && tekst_input.text != "") {
wyslij_btn.enabled = true;
}
}
function wyslij_dane(e:MouseEvent):void {
var dzisiaj:Date = new Date();
var miesiac:uint = dzisiaj.getMonth();
var miesiace:Array = new Array("Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień");
var dzisiejsza_data:String = (dzisiaj.getDate()+" "+miesiace[miesiac]+" "+dzisiaj.getFullYear());
var nowa_pozycja:XML = XML("<wiadomosc><imie>" + imie_input.text + "</imie><tytul>" + tytul_input.text + "</tytul><data>"+ dzisiejsza_data + "</data><tekst>" + tekst_input.text + "</tekst></wiadomosc>");
wiadomosci.appendChild(nowa_pozycja);
var plikPHP:URLRequest = new URLRequest(sciezka_do_pliku_PHP+cache_killer);
plikPHP.data = wiadomosci;
plikPHP.contentType = "text/xml";
plikPHP.method = URLRequestMethod.POST;
loader2.load(plikPHP);
loader2.addEventListener(Event.COMPLETE, plik_wczytany2);
}
function plik_wczytany2(e:Event) :void {
Imie = [];
Tytul = [];
Data = [];
Tekst = [];
imie_input.text = "";
tytul_input.text = "";
tekst_input.text = "";
wyslij_btn.enabled = false;
pole_txt.htmlText = "";
loader.load(plikXML);
}
-
autor: Divix | 281 | 2009-06-26 03:07:05
autor: Divix | 282 | 2009-06-26 03:09:08
Księga fajna :) U mnie niestety są problemy i to inne niż opisywane wcześniej. 1) To podczas publikacji dostaję 4 błędy takie same w 4 linijkach: 1120 Access of undefined properyty teks_input. Po wrzuceniu na serwer plików miga mi pasek scroll i nie wyświetla się zawartość formularza. Jakie może być rozwiązanie problemu ?
- Zobacz kod dodany do tego wpisu
-
>> tekst_input.text = "";
>> tekst_input.text = "";
>> var nowa_pozycja:XML = XML("<wiadomosc><imie>" + imie_input.text + "</imie><tytul>" + tytul_input.text + "</tytul><data>"+ dzisiejsza_data + "</data><tekst>" + tekst_input.text + "</tekst></wiadomosc>");
>> if (imie_input.text != "" && tytul_input.text != "" && tekst_input.text != "") {
-
autor: Pan X | 431 | 2009-08-23 17:19:17
To znaczy, że nie ma stworzonego pola wejściowego o nazwie 'tekst_input' na scenie, musisz je stworzyć. Jeśli działa ci skrypt na komputerze, a nie na serwerze to znaczy, że nie wysłałeś wszystkich plików: PHP i XML.
\n Przykład ten jest dość zaawansowaną wersją i początkujący programiści Flash nie powinni zaczynać swojej zabawy od tego kodu, radził bym najpierw przeczytać kurs ActionScript, dostępny tutaj: http://funkcje.net/view/12/29/2172/index.html
autor: Divix | 432 | 2009-08-23 18:17:23
Dziękuje za otpowiedź, wszystko już działa rewelacyjnie. Fakt, że skrytp jest wymagający jak na początek, ale warto było trudu, ponieważ jest najlepszy jaki znalazłem w necie, jak na moje potrzeby. Super kurs i uważnie go przerobię, na pewno się przyda. W moim przypadku problemem okazała się literówka w nazwie pola, po wpisaniu ponownie nazwy błąd zniknął. Pliki były wgrane jak trzeba.Kolejnym wyzwaniem były ścieżki do plików, u mnie zadziałały względne ścieżki. I jeszcze jedna uwaga do ścieżek, może komóś się przyda. Po zmianie ścieżek w plikach musiałem zrobić restart localhosta, dopiero wtedy wszystko zaczęło działać, samo odświerzenie przeglądarki nie wystarczało do zadziałania zmian. Na serwerze zewnętrznym nie sprawdzałem, ale tam będę miał tam prawdopodobnie podobny problem jak na localhost. Jedno jest pewne dobrze wykonana księga działa bezbłędnie, trzeba tylko ze ścieżkami pokombinować. Problemy jakie mogą wystąpić są lokalne, po stronie twórcy. Jeszcze raz dziękuje i idę do kursu podnieść umiejętności.
autor: Pan X | 434 | 2009-08-24 11:22:45
UWAGA, nowy zoptymlizowany kod ActionScript jest dostępny pod spodem.
- Zobacz kod dodany do tego wpisu
-
var sciezka_do_pliku_XML = "http://funkcjenet.boo.pl/funkcjenet/ksiega_gosci_w_xml/wiadomosci.xml";
var sciezka_do_pliku_PHP = "http://funkcjenet.boo.pl/funkcjenet/ksiega_gosci_w_xml/ksiega.php";
var pierwsza_wiadomosc:String = "Wpisz się do księgi..";
imie_input.text = "";
tytul_input.text = "";
tekst_input.text = "";
pole_txt.htmlText = pierwsza_wiadomosc;
var plikXML:URLRequest = new URLRequest(sciezka_do_pliku_XML);
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, plik_wczytany);
addEventListener(Event.ENTER_FRAME, sprawdzaj);
wyslij_btn.enabled = false;
wyslij_btn.addEventListener(MouseEvent.MOUSE_UP, wyslij_dane);
try {
loader.load(plikXML);
}catch(e:Error) {
pole_txt.htmlText = "błąd";
}
var wiadomosci:XML = new XML();
wiadomosci.ignoreWhitespace = true;
var xmlList:XMLList;
var Imie:Array = new Array();
var Tytul:Array = new Array();
var Data:Array = new Array();
var Tekst:Array = new Array();
function plik_wczytany(e:Event):void {
wiadomosci = XML(e.target.data);
xmlList = wiadomosci.children();
for (var i:int=0; i<xmlList.length(); i++) {
var xmlImie:String = xmlList[i].imie;
var xmlTytul:String = xmlList[i].tytul;
var xmlData:String = xmlList[i].data;
var xmlTekst:String = xmlList[i].tekst;
Imie.push(xmlImie);
Tytul.push(xmlTytul);
Data.push(xmlData);
Tekst.push(xmlTekst);
if (i == xmlList.length() -1) {
aktualizacja();
}
}
}
function aktualizacja():void {
Imie.reverse();
Tytul.reverse();
Data.reverse();
Tekst.reverse();
var buffor:String = "";
pole_txt.htmlText = "";
for (var i:int = 0; i<xmlList.length(); i++) {
buffor += "<b><u>Imię:</u></b> " + Imie[i];
buffor += "<br /><b><u>Tytul:</u></b> " + Tytul[i];
buffor += "<br /><b><u>Data:</u></b> " + Data[i];
buffor += "<br /><b><u>Wiadomość:</u></b> " + Tekst[i];
buffor += "<br />..........................................................................................<br />";
}
pole_txt.htmlText = buffor;
scroll.scrollTarget = pole_txt;
}
function sprawdzaj(e:Event):void {
if (imie_input.text != "" && tytul_input.text != "" && tekst_input.text != "") {
wyslij_btn.enabled = true;
}
}
function wyslij_dane(e:MouseEvent):void {
var dzisiaj:Date = new Date();
var miesiac:uint = dzisiaj.getMonth();
var miesiace:Array = new Array("Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień");
var dzisiejsza_data:String = (dzisiaj.getDate()+" "+miesiace[miesiac]+" "+dzisiaj.getFullYear());
var nowa_pozycja:XML = XML("<wiadomosc><imie>" + imie_input.text + "</imie><tytul>" + tytul_input.text + "</tytul><data>"+ dzisiejsza_data + "</data><tekst>" + tekst_input.text + "</tekst></wiadomosc>");
wiadomosci.appendChild(nowa_pozycja);
var plikPHP:URLRequest = new URLRequest(sciezka_do_pliku_PHP);
plikPHP.data = wiadomosci;
plikPHP.contentType = "text/xml";
plikPHP.method = URLRequestMethod.POST;
var loader2:URLLoader = new URLLoader();
loader2.load(plikPHP);
loader2.addEventListener(Event.COMPLETE, plik_wczytany2);
}
function plik_wczytany2(e:Event) :void {
Imie = [];
Tytul = [];
Data = [];
Tekst = [];
imie_input.text = "";
tytul_input.text = "";
tekst_input.text = "";
wyslij_btn.enabled = false;
pole_txt.htmlText = "";
loader.load(plikXML);
}
-
autor: divix | 525 | 2009-10-07 23:01:42
Dla bardzo pomocny kurs. Pokazuje wiele bardzo pomocnych mechanizmów. Tak trzymać!!!
autor: mario1 | 6629 | 2010-10-09 21:49:36
:: Losowe artykuły
:: Wymiana linków
Modowe inspiracje |
Android Gry i Aplikacje |
ZaplanujTransport.pl: Przeprowadzki, transport, aukcje |
Logo dla firmy |
Change Tires - Car Weather Forecast Reminder |
Laminas: MVC Framework for PHP |
IT Books Reviews and Programming: JS, JAVA, PHP, ANDROID, CSS |
Katalog roślin |
Programming articles: JAVA, PHP, C++, Python, JavaScript |
Kancelaria Adwokacka Łukasz Huszno