Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax] Moje pierwsze starcie
Forum PHP.pl > Wortal > Artykuły
Stron: 1, 2, 3
TomASS
Z topicu powstal artykuł
http://wortal.php.pl/phppl/wortal/artykuly...tarcie_z_ajaxem
topic przeznaczony na dyskusję na jego temat
----
nospor


Moje pierwsze starcie z AJAXem czyli przewodnik dla całkowicie zielonych.
Na podstawie klasy advAJAX Łukasza Lacha.

Zaskoczony sukcesem AJAXa w sieci, oraz problemami wielu użytkowników, postanowiłem zobaczyć z „czym to się je”, a moje doświadczenie przkazać innym. Zabieram się za googlowanie.

Zaczynam od tego czym właściwie jest AJAX. Jest, już przeczytałem - ale nie będę się tutaj rozpisywał, że jest to ble, ble, ble….tylko tak na mój chłopski rozumek. Jest to zaprzężenie JavaScriptu do ingerencji w kod HTML strony. JavaScript wysyła żądanie do serwera i otrzymuje odpowiedź, na jej podstawie modyfikuje cały czas otwartą stronę HTML.

Z technicznego punktu widzenia opiera się na „magicznej” właściwośći przeglądarki, która na zadane żądanie dostaje od serwera odpowiedź (XMLHttpRequest) w postaci tekstu (responseText) lub w postaci XML (responseXML). JavaScript „obrabia” odpowiedź i ingeruje w kod HTML (np. innerHTML lub window.write() ).

Googluję dalej, aby dowiedzieć się jak się z tego kożysta. W moje ręce wpada jedna z lepszych klas (i chyba jedyna polska klasa) advAJAX (http://advajax.anakin.us/index-pl.htm) autorstwa Łukasza Lacha. Klasa ta pozwala w prosty sposób kontrolować stan, w jakim jest nasze zapytanie. W skrócie polega to na tym, że wywołujemy metodę get() lub post() obiektu advAJAX i otrzymujemu odpowiedź (obj):
Kod
advAJAX.get({
   url: "http://www.example.com/page.html",
   onSuccess : function(obj) { alert(obj.responseText); }
});

W przykładzie tym próbujemy wykonać zapytanie (metodą get() ) na adresie: http://www.example.com/page.html. Po zakończeniu (onSuccess) wyświetlamy cały tekst w okienku (alert).

Równie dobrze mogłaby być tutaj dowolna funkcja JS:
Kod
advAJAX.get({
   url: "http://www.example.com/page.html",
   onSuccess : function(obj) { dodajHTML(obj.responseText);}
});


Możemy też przekazać w urlu jakieś zmienne:
Kod
page = parseInt(document.getElementById("page").value);
advAJAX.get({
   url: "http://www.example.com/page.php?p="+page,
   onSuccess : function(obj) { dodajHTML(obj.responseText);}
});


Klasa ta pozwala nie tylko kontrolować sytuację, w której strona załadowała się pomyślnie (onSucces), ale również w kilkunastu innych przypadkach, min w momencie inicjalizacji, podczas ładowania, po zakończeniu, po zakończeniu błędem, po zakończeniu sukcesem (pełny spis na (link) ). Np. aby zrobić napis (proszę czekać – loading):
Kod
page = parseInt(document.getElementById("page").value);
advAJAX.get({
   url: "http://www.example.com/page.php?p="+page,
   onInitialization : function(obj) ( ShowLoading();},
   onSuccess : function(obj) { dodajHTML(obj.responseText);},
   onFinalization : function(obj) { HideLoading();}
});

Wszystkie statusy polegają na interpretowaniu właściwości http_request.readyState odpowiedzi.

Klasa ta obsługuje również ponawianie połączenia, pamięć tymczasową przeglądarki, obsługę formularzy i grupowanie wywołań.

Myślę, że ciekawym przykładem, będzie przykład samego autora tej klasy. Będzie to stronicowanie. Do działania przykładu potrzebne są cztery pliki:2.html który zawiera cały kod html strony. Kod ten będzie modyfikowany przez JavaScript zawarty w pliku 2.js . W pliku 2.js jest funkcja getRecords() która wysyła proźbę (zapytanie) do pliku 2.php, który generuje odpowiedni XML. Działa to tak:
- użytkownik wczytuje stronę 2.html
- kod JS zawarty w pliku 2.js wysyła żądanie do pliku 2.php
- plik 2.php generuje odpowiedni kod XML i wysyła go z powrotem do JS (plik 2.html jest ciągle otwarty w oknie przeglądarki)
- kod JS otrzymuje odpowiedź w postaci obj.responseXML i funkcją parseXML modyfikuje kod strony 2.html (dodaje odpowiednie tagi do <tbody id="dataTable">
</tbody>.
Oczywiście nie możemy zapomnieć o ostatnim, najważniejszym pliku – klasie advAJAX.js. Przykładowy kod generujący XML może wyglądać tak:
  1. <?
  2. header("Content-type: text/xml; charset=UTF-8");  
  3. $query="SELECT count(*)AS total FROM zamowienia_old;";
  4. $result = mysql_query($query); 
  5. $row = mysql_fetch_assoc($result);
  6. $total = $row['total'];
  7.   
  8. $query="SELECT * FROM zamowienia ORDER BY Z.ID LIMIT 0,10";
  9. $result = mysql_query($query); 
  10. echo '<?xml version="1.0" encoding="UTF-8"?><records total="'.$total.'" max_per_page="'.$per_page.'" page="'.$page.'" count="'.mysql_affected_rows().'">';
  11.    while ($row = mysql_fetch_assoc($result)){
  12.   echo '<record>';
  13.     while(list($Index,$Value)=each($row)){
  14.       echo '<'.$Index.'>'.convert($Value).'</'.$Index.'>';
  15.     }
  16.     echo '</record>';
  17.     }
  18.  echo '</records>';?>


Oczywiście nic nie stoi na przeszkodzie kożystać z innch klas, lub samemu napisać dla siebie klasę obsługi AJAXa a w ostateczności używać „gołego” XMLHttpRequest.

Ufff to by było na tyle. Może na sam koniec troszkę linków:
Strona projektu advAJAX
Ajax w „gołej” postaci
Ajax wiki
Klasa do obsługi AJAX
Małe conieco o AJAX


A oto co można zrobić przy pomocy AJAXa:
https://www.paguna.com/
http://demo.script.aculo.us/
http://www.google.com/webhp?complete=1&hl=en
http://www.clearnova.com/ajax/
http://24ways.org/advent/easy-ajax-with-prototype
http://www.digitalmediaminute.com/article/...s-and-resources

Mam nadzieję, że przybliżyłem problematykę związaną z technologią AJAX. Jednak jak każda technologia ma swoje wady i zalety, nie można jej używać do wszystkiego, jednak to pozostawiam już czytelnikom.....
Puciek
Boom
Wg. mnie nadaje sie to na artykul
mike
Temat jest ostatnio popularny a ~TomASS napisał kilka ciekawych informacji.

Podpinam.
(ewenualne dyskusje o AJAXie, oraz ciekawe spostrzeżenia czy porady proszę zamieszczać tutaj)

A ja przeniosę z początkujący na poziom wyzej
---
nospor
aleksander
to zdecydowanie nadaje się na artykuł, tutaj kompletnie nie pasuje.
mariuszn3
Według mnie większość tych klas do ajaxa (a chodzi przecież o bardzo prosty w obsłudze, z raptem paroma metodami obiekt xmlHttp - szczerze nie lubię nazwy ajax) tylko zaciemnia i komplikuje całą idee.. a początkującym użytkownikom utrudnia zrozumienie jakie naprawdę ma możliwości obiekt xmlHttp i robi z całego obiektu jakiś trudny do ogarnięcia moloch.
Bardzo dobry artykuł o xmlHttp (po angielsku) jest też tutaj
crash
Tak czy inaczej artykuł bardzo dobry i pomocny dla osób zaczynających z AJAX'em. mariuszn3: Gdyby wszystkiego używało się łatwo i przyjemnie to nie powstawałyby takie rzeczy jak AJAX, ADoDB czy połowa PEAR'a. A z innej beczki: poprawiłem pare literówek w kodzie JS, żeby nie było, że coś nie działa.
mariuszn3
Cytat(crash @ 2006-02-08 13:47:27)
Tak czy inaczej artykuł bardzo dobry i pomocny dla osób zaczynających z AJAX'em. mariuszn3: Gdyby wszystkiego używało się łatwo i przyjemnie to nie powstawałyby takie rzeczy jak AJAX, ADoDB czy połowa PEAR'a. A z innej beczki: poprawiłem pare literówek w kodzie JS, żeby nie było, że coś nie działa.

Crash a co to jest AJAX?
W ogóle przeczytałeś uważnie to co napisałem, czy gdzieś w swoim poście wspomniałem, że pisanie bibliotek upraszczających korzystanie z narzędzi jest bez celowe?
NX_Turbospeed
Nic z tego nie zrozumialem. Pozaym co ten Ajax robi wogole?
crash
Najprostrzy przykład użycia, na chłopski rozum: AJAX pozwala na zmianę treści części strony bez przeładowywania całej strony dając także dodatkowe możliwości jak np. wyświetlenie informacji o trwaniu przeładowywania danych etc.
NX_Turbospeed
Aha. Pożyteczne ;P


---
Nabijanie postów.!
Kolejne takie posty będą karane.
~mike_mech
TomASS
Witam. Aby jeszcze bardziej przybliżyć technologię AJAX, przedstawie jeszcze jeden przykład. Jest to ulepszona walidacja formularza do rejestracji użytkownika. Potrzebny będzie nam jak zwykle plik klasy advAJAX.js, plik z funkcjami js (register.js), oraz pliki: register.php oraz register2.php…… troszkę dużo się nazbierało, ale już wyjaśniam.

Ogólna idea jest taka:
Wczytujemy formularz z pliku register.php, po wypełnieniu pól zaczyna się magia……ekhm, no nie zupełnie, zaczyna się AJAX, wywołuje odpowiednią funkcję JS, która przesyła odpowiednie dane (z formularza) do pliku register2.php, on daje odpowiedź i ajax na podstawie otrzymanej odpowiedzi wysyła bądź nie formularz. Ktoś może powiedzieć, że to można zrobić bez ajaxa – fakt, można, ale nie zamierzam nikogo do tego przekonywać, potraktujmy to jako ćwiczenie.


Zaczniemy od pliku register.php. Równie dobrze, mógłby być to register.html, to bez różnicy:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  3. <title>rejestracja nowego użytkownika</title>
  4. <script type="text/javascript" src="register.js"></script>
  5. <script type="text/javascript" src="advajax.js"></script>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. </head>
  8.  
  9. <form action="register3.php" method="POST" id="registerForm" name="registerForm">
  10. <tr><td class="napis">Login:</td><td><input type="text" name="login" id="login"></td></tr>
  11. <tr><td class="napis">Hasło:</td><td><input type="password" name="Haslo"></td></tr>
  12. <tr><td class="napis">Powtórz hasło:</td><td><input type="password" name="Haslo2"></td></tr>
  13. <tr><td class="napis">E-mail:</td><td><input type="text" name="email" id="email"></td></tr>
  14. <tr><td colspan="2" style="text-align: center;"><button onclick="sprawdz_dane();">Zarejestruj mnie...</button></td></tr>
  15.  
  16. </form>
  17. </body>
  18. </html>


Plik ten ma za zadanie wyświetlenie formularza, mamy 4 pola: Login, Hasło, Powtórz hasło oraz e-mail. Aby nie gmatwać przykładu zajmiemy się tylko „dodatkową” walidacją, czyli czy użytkownik lub e-mail istnieją już w bazie danych. Do przycisku Zarejestruj mnie…. Przypisana jest akcja „sprawdź dane()” która znajduje się w pliku register.js, który wygląda następująco:

  1. function $(id) {
  2. return document.getElementById(id);
  3. }
  4.  
  5. function sprawdz_dane() {
  6. var login = $("login").value;
  7. var email = $("email").value;
  8. var zapytanie = "register2.php?login="+login+"&email="+email;
  9. advAJAX.get({
  10. url : zapytanie,
  11. onSuccess : function(obj) {
  12. if(obj.responseText == "login"){
  13. alert("Użytkownik o takim loginie jest już w bazie danych");
  14. $("login").style.border='1px solid red';
  15. $("email").style.border='1px solid #7F9DB9';
  16. }
  17. if(obj.responseText == "email"){
  18. alert("Ten e-mail isntieje już w bazie danych");
  19. $("login").style.border='1px solid #7F9DB9';
  20. $("email").style.border='1px solid red';
  21. }
  22. if(obj.responseText == "OK") $("registerForm").submit();
  23. }
  24. });
  25. }

Funkcja sprwawdz_dane pobiera wartości pól input text login oraz email I na ich podstawie generuje odpowiednie zapytanie do pliku register2.php. Zapytanie to jest wykonywane (url: zapytanie). Jako odpowiedź mamy trzy możliwości: albo jest to login – tzn „login” jest już w bazie danych, albo jest to „email” – znaczy się ze e-mail jest w bazie, oraz”OK” – wszystko w porządku (można wysyłać formularz - $("registerForm").submit(); ) i zostanie wysłany formularz do pliku register3.php. Plik, który generuje odpowiedź na zadane żądanie (register2.php) wygląda następująco:

  1. <?
  2. $dbhost = localhost;
  3. $dblogin = root;
  4. $dbhaslo = '';
  5. $db = uop;
  6.  
  7. mysql_connect ($dbhost,$dblogin,$dbhaslo) or die ("Nie masz uprawnien");
  8. mysql_select_db ("$db");
  9.  
  10. $login = mysql_escape_string($_GET['login']);
  11. $email = mysql_escape_string($_GET['email']);
  12.  
  13. $query = "SELECT count(*)AS Ile FROM uop_users WHERE Login='".$login."';";
  14. $result = mysql_query($query); 
  15. $row = mysql_fetch_array($result);
  16.  
  17. if($row['Ile']) echo 'login';
  18. else{
  19.    $query = "SELECT count(*)AS Ile FROM uop_users WHERE e_mail='$email';";
  20.    $result = mysql_query($query); 
  21.    $row = mysql_fetch_array($result);
  22.    if($row['Ile']) echo 'email';    
  23.    else echo 'OK';
  24. }
  25. ?>

Nic nadzwyczjanego – dwa zapytania i tyle.

Oczywiście, można jeszcze kombinować z metodą assign klasy advAJAX:
  1. advAJAX.assign($(registerForm))

ale to już pozostawiam do treningiu. Całe rozwiązanie można podpatrzeć tutaj http://advajax.anakin.us/phpsolutions/1.html

Powodzenia drodzy forumowicze.


------------------------edit----------------------------------
Poprawiłem uwagi Marusza, sorki, nie wszystko można zauważyć pisząć, pewnie dlatego, że sam mam złe nawyki tongue.gif
A co do mysql_num_rows() to nie za bardzo się mogę zgodzić, ponieważ tak czy siak będą potrzebne dwa zapytania.......a co się tyczy niekonsekwencji to?
Radarek
Nie jestem ekspertem od js ale takie cus widze po raz pierwszy.
Cytat
var email = $("email").value;


To jest w ogole poprawne?
crash
Ta... Tutaj $ to po prostu nazwa funkcji.
Radarek
No to szyd niezly smile.gif. Nie dziwie sie wiec, ze powstaja artykuly o takim tytule :
link smile.gif.
Marusz
TomASS, jest juz pozno wiec bede sie streszal:
Cytat
mysql_connect ("$dbhost","$dblogin","$dbhaslo")

- Taki zapis jest nieprawidlowy. Uczysz poczatkujacych zlych nawykow...

Cytat
$login = addslashes($_GET['login']);
$email = addslashes($_GET['email']);

- Do zabezpieczenia stringow przed "zlymi" znakami w przypadku bazy danych sluzy funkcja mysql_escape_string(). Dlaczego nie powinno sie stosowac addslashes() znajdziesz na stronach php.net. Poza tym utworzenie tych dwoch zmiennych nie robi nic wiecej jak tylko zzera pamiec

Cytat
"SELECT count(*)AS Ile FROM uop_users WHERE Login='$login';"

- Ten sam blad. Dziel stringi komponujac zmienne. Dzieki temu Twoj php ma mniej do myslenia. Procz tego masz wieksza kontrole nad tym co sie dzieje i skrypt jest bardziej czytelny. Dodatkowo w przypadku zapytan MySQL zalecane (ale nie wymagane) jest "ubieranie" nazw tabel i kolumn znaczkiem "`".

Cytat
count(*)AS Ile

2 zapytania stworzone niepotrzebnie. Zainteresuj sie funkcja mysql_num_rows().

Poza tym piszesz bardzo niekonsekwentnie. Niemniej dzieki za tekst, bo zawsze komus moze sie przydac.
Tajny
Marusz

pragnę tylko przypomnieć że używanie COUNT jest szybsze i to o wiele od mysql_num_rows , a zwlaszcza gdy rodzaj tabeli to MyIsam .

Zwróć uwagę że select * a pozniej mysql_num_rows oznacza tyle co zwrocenie przez query calego select * itd. , a count (*) zwraca ci tylko jeden wiersz.


Pozdrawiam
snipe
z tego co wywnioskowalem, to ajax sluzy do dynamicznego zmieniania zawartosci strony bez przeladowania, czyli np. te reklamy na onecie co sie zmieniaja tez sa zrobione ajaxem??
TomASS
Cytat
ajax sluzy do dynamicznego zmieniania zawartosci strony bez przeladowania

Można by tak powiedzieć smile.gif


Cytat
eklamy na onecie co sie zmieniaja tez sa zrobione ajaxem??

Chyba jest mało reklam które wymagają przeładowywania strony - one są prawdpodobnie napisane albo w "czystym JS" albo we flashu....tak mi się przynajmniej wydaje.
mariuszn3
Cytat(snipe @ 2006-02-15 12:59:09)
z tego co wywnioskowalem, to ajax sluzy do dynamicznego zmieniania zawartosci strony bez przeladowania, czyli np. te reklamy na onecie co sie zmieniaja tez sa zrobione ajaxem??

Nie do końca, to znaczy mało precyzyjnie. Do zmieniania zawartości strony bez przeładowywania wystarczy sam javascript. Obiekt xmlHttp (na tym opiera się hasło ajax) jest owszem obiektem javascript (pominę kwestię ie<=6) ale to nie nim zmieniamy zawartość strony i wcale nie trzeba z niego korzystać by móc zmodyfikować zawartość strony.

Obiekt xmlHttp, pozwala na komunikację z serwerem co daje możliwość szybkiej interakcji użytkownik -> serwer bez przeładowywania strony.. a to już coś dużo więcej.

Możemy dzięki temu odpowiadać na wszystkie zapytania użytkownika, których nie da się przewidzieć na poziomie programowania. Przykładowo, w wyszukiwarce strony możemy podać użytkownikowi wyniki wyszukiwania nie przeładowując jej (na płaszczyźnie html+js bez korzystania z tego obiektu nie ma innej możliwości wymiany informacji z serwerem )

A portale takie jak onet.pl muszą się trochę obudzić by zacząć korzystać z możliwości xmlHttp.. na razie są parę lat do tyłu i w żadym wypadku nie należy się na nich wzorować smile.gif
Termit_
Hmm.. a co mają zrobić osoby, które wyłączają JS, albo są zmuszone wejść na stronę np. linksem? Czy takie ślepe zauroczenie AJAX-em nie wpłynie zgubnie na, już i tak olewaną, kwestię dostępności witryn (WCAG i te sprawy)?
FiDO
I tu wlasnie wychodzi, jak to moj kolega z grupy ladnie ujal, "Najbardziej czasochłonny, skomplikowany, redundantny i niezauważany mechanizm, jaki można zaimplementować.". Chodzi oczywiscie o interfejs dla przegladarek bez takich "cudow" jak JS itp. Zobacz sobie serwisy google korzystajace z AJAXA jak dzialaja z wylaczonym JS.. nie jest to juz tak user friendly, ale jest w pelni uzyteczne. Boli jedynie to, ze trzeba to w porzadnej aplikacji zaimplementowac, a wiekszosc ludzi nawet tego nie zauwazy.
TomASS
Ja to robię wpierw jedną stronę - dla której nie potrzeba JS, oraz przygotowuję zmodyfikowaną wersję z JS i AJAXem. Cos na styl poczty na interii - do wyboru smile.gif
Natomiast zawsze staram się klienta pytać jaki sprzęt używa.

Lynksa chyba nie używa nawet 0,0001% ludzi smile.gif
Termit_
Jasne. Wszystko przecież zależy od charakteru witryny.

Nie chciałbym mieć po prostu takiej sytuacji, że wchodzę na shella, próbuję ściągnąć nowe php a tu kicha, bo linksem się do tego nie dostanę.

Podobnie ze sprawdzeniem poczty – jasne, że raczej nie będę dokonywał zmiany konfiguracji profilu, nawet nie będę maila wysyłał – ale blokowanie możliwości sprawdzenia, czy ktoś coś mi przysłał byłoby IMHO nie na miejscu.

O to mi mniej więcej chodziło winksmiley.jpg.
TomASS
Witam ponownie wszystkich forumowiczów guitar.gif

Postanowiłem opisać jeszcze jeden przykład na wykorzystanie AJAXa oraz na rozwiązanie popularnego problemu od czasu do czasu poruszanego na tym forum.

Chodzi tutaj o dwa selecty <span style="font-style: italic;">"sprzężone"</span> ze sobą w ten sposób, że wybór odpowiedniej pozycji na <span style="font-weight: bold;">selekcie1</span> wpływa na zawartość <span style="font-weight: bold;">selecta2</span> - np. mamy wybrać ze spisu jedną wieś w Polsce. Przeszukując selectem cały spis wszystkich miejscowości moglibyśmy się zaszukać na śmierć tongue.gif . Wygodniej byłoby wybierać po kolei: Województwo -> Powiat -> Gmina -> Miejscowość.

Przedstawie tuta tylko pierwszy etap (Województwo -> Powiat) - dorobienie reszty jest już dziecinnie proste.

Noto zaczynamy.
Na początek podam definicję bazy danych abyście nie musieli się trudzić - oczywiście ktoś może ją wypełnić swoimi danymi:
  1. #
  2. # Struktura tabeli dla `powiaty`
  3. #
  4.  
  5. CREATE TABLE `powiaty` (
  6. `ID` int(10) NOT NULL AUTO_INCREMENT,
  7. `ID_wojewodztwo` int(10) DEFAULT NULL,
  8. `Powiat` varchar(20) DEFAULT NULL,
  9. UNIQUE KEY `ID` (`ID`)
  10. ) TYPE=MyISAM AUTO_INCREMENT=15 ;
  11.  
  12. #
  13. # Zrzut danych tabeli `powiaty`
  14. #
  15.  
  16. INSERT
  17. INTO `powiaty` VALUES (1, 1, 'Wroclawski');
  18. INSERT
  19. INTO `powiaty` VALUES (2, 1, 'Sroda Slaska');
  20. INSERT
  21. INTO `powiaty` VALUES (3, 1, 'Miekinia');
  22. INSERT
  23. INTO `powiaty` VALUES (4, 1, 'Legnica');
  24. INSERT
  25. INTO `powiaty` VALUES (5, 1, 'Lubin');
  26. INSERT
  27. INTO `powiaty` VALUES (6, 2, 'Opole');
  28. INSERT
  29. INTO `powiaty` VALUES (7, 2, 'Brzezie');
  30. INSERT
  31. INTO `powiaty` VALUES (8, 2, 'Grodkow');
  32. INSERT
  33. INTO `powiaty` VALUES (9, 2, 'Brzeg');
  34. INSERT
  35. INTO `powiaty` VALUES (10, 2, 'Nysa');
  36. INSERT
  37. INTO `powiaty` VALUES (11, 3, 'Szczecin');
  38. INSERT
  39. INTO `powiaty` VALUES (12, 3, 'Szczecinek');
  40. INSERT
  41. INTO `powiaty` VALUES (13, 3, 'Gryfow');
  42. INSERT
  43. INTO `powiaty` VALUES (14, 3, 'Miedzyzdroje');

Jak zwykle mamy 4 pliki. Pierwszy z nich to dobrze wszystkim znay plik <span style="font-weight: bold;">advajax.js</span>. Kolejnym plikiem jest <span style="font-weight: bold;">dzialaj.html</span> (plik który uruchamia użytkownik), plik <span style="font-weight: bold;">odpowiedz.php </span>- generujący odpowiedź z serwera w postaci XML oraz plik z funkcjami JS - <span style="font-weight: bold;">function.js</span>.

Plik uruchamiany przez użytkownika nie jest wielce skomplikowany:
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  2. </head>
  3.  
  4. <select name="wojewodztwa" id="wojewodztwa" onchange="getRecords();">
  5. <option value="1">Dolnośląskie</option>
  6. <option value="2">Opolskie</option>
  7. <option value="3">Zachodnio Pomorskie</option>
  8.  
  9. <select name="gminy" id="gminy" style="width: 200px;">
  10.  
  11. <script type="text/javascript" src="advajax.js"></script>
  12. <script type="text/javascript" src="function.js"></script>
  13. </body>
  14. </html>

Składa się on z dwóch selectów (wojewodztwa - z wypełnioną listą) oraz gminy (będzie dopiero wypełniany)

Plik odpowiedz.php jest bardzo ładny smile.gif :
  1. <?
  2. header("Content-type: text/xml; charset=UTF-8"); 
  3. echo '<?xml version="1.0" encoding="UTF-8"?>';
  4.  
  5. $dbhost = localhost;
  6. $dblogin = root;
  7. $dbhaslo = '';
  8. $db = uop;
  9. mysql_connect (localhost,root,'') or die ("Nie masz uprawnien");
  10.  
  11.  
  12. $wojewodztwo = (int)$_GET['wojewodztwo'];
  13. if(!$wojewodztwo) $wojewodztwo = 1;
  14.  
  15. echo '<records>';
  16. $query = "SELECT ID, Powiat FROM powiaty WHERE ID_wojewodztwo='$wojewodztwo'";
  17. $result = mysql_query($query);
  18. while ($row = mysql_fetch_array($result)){
  19. echo '<record>';
  20. echo '<ID>'.$row['ID'].'</ID>';
  21. echo '<nazwa>'.$row['Powiat'].'</nazwa></record>';
  22. }
  23.  
  24. echo '</records>';
  25. ?>

Bardzo ważny jest nagłówek - aby był to plik XML:
  1. header("Content-type: text/xml; charset=UTF-8"); 
  2. echo '<?xml version="1.0" encoding="UTF-8"?>';

Potem zwykłe zapytanie do bazy danych wybierające odpowiednie rekordy - nic szczególnego.
Po zapytaniu następuje generacja XML - także nic co mogło by być bardzo szczególnym zajęciem. Nie zagłębiam się tutaj w puste znaczniki (aby zamiast <nazwa></nazwa> pisać </nazwa>) nie zajmuję się także polskimi znaczkami aby nie komplikować kodu - i muszę coś pozostawić jeszcze Wam smile.gif

Bardzo istotnym plikiem jest plik function.js:
  1. function $(id){
  2. return document.getElementById(id);
  3. }
  4.  
  5.  
  6. function parseRecords(xml) {
  7.  
  8. var opttypes = document.getElementById("gminy");
  9. record = xml.getElementsByTagName("record");
  10. ID = new Array();
  11. nazwa = new Array();
  12. for (i = 0; i < record.length; i++) {
  13. nazwa[i] = record[i].childNodes[1].childNodes[0].nodeValue;
  14. ID[i] = record[i].childNodes[0].childNodes[0].nodeValue;
  15.  
  16. }
  17.  
  18. for (i = opttypes.options.length-1; i >= 0; i--) {
  19. opttypes.remove(i);
  20. }
  21.  
  22. for(var i = 0; i < nazwa.length; i++) {
  23. opttypes.options[i] = new Option(nazwa[i],ID[i]);
  24. }
  25. }
  26.  
  27.  
  28. function getRecords() {
  29. var wojewodztwo = $("wojewodztwa").value;
  30.  
  31. advAJAX.get({
  32. url : "odpowiedz.php?wojewodztwo="+wojewodztwo,
  33. onInitialization : function(obj) {
  34. $("gminy").disabled="true";
  35. },
  36. onSuccess : function(obj) {
  37. parseRecords(obj.responseXML);
  38. $("gminy").disabled="";
  39. }
  40. });
  41. }

Trzy skromne funkcje, a właściwie tylko dwie: jedna parsująca wynik XML na kod HTML. Dzieje sie to za pomocą new Option(Nazwa,Value), a wartości są zczytywane z odpowiedzi XML za pomocą:
  1. record[i].childNodes[0].childNodes[0].nodeValue;
  2. record[i].childNodes[1].childNodes[0].nodeValue;

Jest jeszcze funkcja "uruchamiająca" AJAXa. Najpierw prosi go o to aby wyczytał odpowiedni URL z odpowiednia opcia (?wojewodztwo) a nastepnie podczas inicjalizacji blokuje selecta gminy. Po zakonczeniu wczytywania (onSuccess) XML jest parsowany a select gminy odblokowywany.

To tyle - it`s simply smile.gif
Nie powinno nastarczyć to kłopotu ludziom z podstawową znajomością JS, php, MySQL.

P.S Proszę nie zwracać na błedy w postaci że dany powiat nie jest powiatem albo nie leży w odpowiednim województwie tongue.gif
bigZbig
@TomASS - pierwszy post, z wyjatkiem sparafrazowania definicji AJAXa i kilku linków na końcu, jest zwyklym streszczeniem dokumentacji advAJAXa napisanej przez Łukasza Lacha. Nie wnosi wiele nowego, nic nie upraszcza i z pewnoscia nie nadaje sie na artykul. Moze po malych przerobkach daloby sie z tego stworzyc haslo w wikipedi.

Twoje kolejne posty przedstawiajace przyklady zastosowania advAJAX sa juz o wiele bardziej interesujące. Mam jednak mala uwagę. Czy mógłbyś w js stosowac wcięcia? Odpowiednio sformatowany kod łatwiej się czyta.
mike
Cytat(bigZbig @ 2006-03-02 09:42:16)
(...) Czy mógłbyś w js stosowac wcięcia? Odpowiednio sformatowany kod łatwiej się czyta.

Niestety sposób osadzania kodów źródłowych na forum za pomocą [ html ] ma wadę i nie zachowuje wcięć. Więc muszę tutaj ~TomASSa usprawiedliwić.
Zostanie to prawdopodobnie poprawione w niedługim czasie.

P.S.
A na artykuł faktycznie to się nie nadaje. Porada zwykła i tyle. Równie dobrze mógłby być link do bloga ~anAKiNa, co innego późniejsze przykłady, one już coś wnoszą.
bigZbig
Cytat(mike_mech @ 2006-03-02 10:58:22)
Niestety sposób osadzania kodów źródłowych na forum za pomocą [ html ] ma wadę i nie zachowuje wcięć. Więc muszę tutaj ~TomASSa usprawiedliwić.
Zostanie to prawdopodobnie poprawione w niedługim czasie.

Ale [CODE] juz wciecia zachowuje wiec czy nie lepsze byloby zastosowanie tego bbcode tym bardziej, ze js to nie html, wiec nikt nie mogby zglosic uwagi, ze zastosowano niewlasciwy bbcode.

edit
---------------
A tak swoja droga przydalby sie jakis parser kolorujacy kod js - moze MX-BBCode?
kukix
Witam.
Zainteresowałem sie przykładem autora advajax, "stronnicowanie danych"...
kod źódłowy wziełem z płytki "php solutions" i napotkałem pare problemów, które nie potrafie obejśc...

pierwszym, który napotkałem to wstawienie styli do tabelki generowanej przes skrypt js oto kod autora advajax:

Kod
function parseRecords(xml) {

   with (xml.getElementsByTagName("records").item(0)) {
       page = getAttribute("page")*1;
       maxPerPage = getAttribute("max_per_page");
       startId = maxPerPage*page+1;
       total = getAttribute("total")*1;
       maxPage = Math.ceil(total/maxPerPage);
       $("dataStats").innerHTML =
         " &nbsp; Rekordy: " + startId + " - " + (startId+getAttribute("count")*1-1) + " z " + total + " (Strona: " +
         (page+1) + " z " + maxPage + ")";
   }
   $("btnFirst").style.visibility = $("btnPrev").style.visibility = page == 0 ? "hidden" : "visible";
   $("btnLast").style.visibility = $("btnNext").style.visibility = page+1 == maxPage ? "hidden" : "visible";
   
   d = $("dataTable");
   for (i = d.rows.length-1; i >= 0; i--)
     d.deleteRow(i);
   record = xml.getElementsByTagName("record");
   result = "";
   for (i = 0; i < record.length; i++) {
       tr = document.createElement("tr");
       td = document.createElement("td");

/* próbówałem tak:         td = style.font-weight:  = "bold"; */
       td.innerHTML = startId + i;
       tr.appendChild(td);
       for (j = 0; j < 3; j++) {
           td = document.createElement("td");
           td.innerHTML = record[i].childNodes[j].childNodes[0].nodeValue;

           tr.appendChild(td);
       }
       d.appendChild(tr);
   }
   return result;
}


jak to obejśc..? da sie zrobić tak, żeby do kolumny z Imieniem dodac "align=center" , albo class=styyl ?

Nie moge sobie z tym poradzić... może ktośrobił już to i może mi pomóc?

P.S. Wogóle nie rozumie, jak powstaje ta tabelka.. domyslam sie, że document.createElement("td"); jest funkcją wbudowaną w js i ona tworzy tabelke...
TomASS
Tabelka jest już gotowa - zobacz do źródła tego pliku:
  1. </thead>
  2. <tbody id="dataTable">
  3. </tbody>
  4. </tfoot>

Zuważ że w kodzie JS masz tak:
Kod
d = $("dataTable");

Natępnie tabela jest czyszczona:
Kod
for (i = d.rows.length-1; i >= 0; i--)
     d.deleteRow(i);

Później jest tworzony element <tr>:
Kod
tr = document.createElement("tr");

Wpisywane są do niego komórki. Początek komórki (<td>):
Kod
td = document.createElement("td");

Zawartość przy pomocy innerHTML:
Kod
td.innerHTML = record[i].childNodes[j].childNodes[0].nodeValue;

Zamykamy obiekt(y) <td> oraz <tr>:
Kod
tr.appendChild(td);
d.appendChild(tr);


Różne właściwości (np. td) możesz modyfikować np w następujący sposób:
Kod
td = document.createElement("td");
td.noWrap="nowrap";
td.innerHTML = "dlugi tekst;
tr.appendChild(td);
kukix
Dzieki TomASS, Twoja odpowiedź była pomocna.

jednak dalej nie moge "podpiąć" całego styla z pliku .css pod tabele. próbowałem tak:
Kod
td.class="styltabelki";
td.style.class="styltabelki";
td.style="styltabelki";

jednak to nie działa...
więc wszystkie własciwości wpisałem "ręczniene".
Jest jednak problem z właściwościami, które mają w nazwie kreske (-) np: border-bottom
Kod
td.style.padding = "6px 15px";
to działa, ale nie to:
Kod
td.style.border-bottom = "1px solid #ebebe4"
Ogólnie moge powiedzieć, że "zaadoptowanie" advAJAX'a do swojego projektu jest trudne dla średnio zaawansowanej osoby... podstawowym problemem jest (co zrobić tym AJAXEM, a co nie).

Mam w administracji dział newsy, w którym znajduje sie spis newsów i mały formularz do edycji i dodawania nowych newsów.
I tak zastanawiam sie, co zrobić tym AJAX'em.. co naprawde pomoże w pracy, a co bedzie przeszkadzało... Chciałem zrobić edycje danego newsa po dwukliknięciu na pozycje z listy... jednak narazie nie wiem, jak odświerzyć poprawioą liste... dodawanie równiez można by zrobić z wykorzystaniem AJAX'a...
Diwi
z tego co się orientuje w javascripcie to zamiast:
Kod
td.class="styltabelki";

Powinno być
Kod
td.className="styltabelki";


smile.gif

Pozdrawiam
TomASS
Cytat
Mam w administracji dział newsy, w którym znajduje sie spis newsów i mały formularz do edycji i dodawania nowych newsów.
I tak zastanawiam sie, co zrobić tym AJAX'em.. co naprawde pomoże w pracy, a co bedzie przeszkadzało... Chciałem zrobić edycje danego newsa po dwukliknięciu na pozycje z listy... jednak narazie nie wiem, jak odświerzyć poprawioą liste... dodawanie równiez można by zrobić z wykorzystaniem AJAX'a...


Użycie ajaxa ma sens, wtedy gdy pobieramy jakieś dane i wyświetlamy je na stronie przy czym zawartość "graficzna" strony nie zmienia się - takie coś ma miejsce w przypadku np. stronicowania, robienia map czy "dynamicznych" formularzy. Generalnie staraj się używać AJAXa tam gdzie to jest pomocne (np. w automatycznym dopełnianiu formularzy), ale muisz wziąść też pod uwagę użytkowników, którzy mają wyłączony JavaScript i umożliwić im prace bez AJAXa. Oto kilka przykładów na wykorzystanie:
RSS Reader
dopełnianie formularza
formularz hotelowy
dużo fajnych przykładów
kukix
Dzieki chlopaki za pomoc.. teraz już dużo mi sie rozjaśniło... blink.gif

Przeglądałem przykłady zastosowania AJAX'a, bardzo dobry jest przykład menu z możliwością ręcznego sortowania. Przykład ...
jest to chyba zbudowane na innym "silniku" AJAX. potrafił by ktoś zrobić coś takiego na AdvAJAX?

P.S. TomASS Twój przykład z formularzem rejestrującym nie działa.. (domyślam sie, że chyba nie jest on dokończony...)
TomASS
Cytat
Przeglądałem przykłady zastosowania AJAX'a, bardzo dobry jest przykład menu z możliwością ręcznego sortowania. Przykład ...
jest to chyba zbudowane na innym "silniku" AJAX. potrafił by ktoś zrobić coś takiego na AdvAJAX?

Pewnie się da - można też użyć innych klas np SAJAX.

Cytat
P.S. TomASS Twój przykład z formularzem rejestrującym nie działa.. (domyślam sie, że chyba nie jest on dokończony...)

Sama rejestracja oczywiście, że nie działa smile.gif Tutaj chodziło o walidację smile.gif
anAKiN
Bardzo ładnie, panowie biggrin.gif
TomASS
Dzisiaj przeczesując czeluścia internetu natrafiłem na Dynamiczną tabelę - świetna sprawa oparta na AJAXie.

Cytat
Bardzo ładnie, panowie smile.gif

Anakin - jeśli ktoś jeszcze nie zdążył się połapać jest autorem klasy advAJAX smile.gif
kukix
Siedze już kurde drugi dzień nad tym ajaxem i albo jestem jakis ciemny, albo nie wiem... Już nie napisze, że nie potrafie przerobić przykładu "stronnicowanie danych" tak, zeby kożystał z tabeli o innej strukturze... no ale pokolei...

Pierwsze, przez co nie moge przebrnąc to wstawieniue danych z bazy do formularza...w tym przypadku kożystałem z '.value', nie kożystałem z '.innerHTML' ponieważ w formularzu nic sie nie działo.. '.innerHTML' bez problemu wstawia dane do np <DIV id="xxx">...</DIV> ale do <INPUT type="text" name="xxx" id="xxx"> już nie wstawia, wyskakuje błąd.. dry.gif

plik zaladuj.js:
Kod
function wyswietl() {    
 advAJAX.setDefaultParameters({
   onInitialization : function(obj) { document.getElementById(obj.tag).value = "Przygotowanie..."; },
   onLoading : function(obj) { document.getElementById(obj.tag).value = "Ładowanie..."; },
   onSuccess : function(obj) { document.getElementById(obj.tag).value = "" + obj.responseText; },
   onError : function(obj) { document.getElementById(obj.tag).value = "Error..."; }
 });
 advAJAX.get({ url: "zaladuj.php?wartosc=naglowek", tag: "news_naglowek" });
 advAJAX.get({ url: "zaladuj.php?wartosc=data", tag: "news_tresc" });
 advAJAX.get({ url: "zaladuj.php?wartosc=autor", tag: "news_autor" });
 advAJAX.setDefaultParameters({});
}


plik zaladuj.php:
  1. <?php
  2.  
  3. $mysql_link = mysql_connect('host', 'login', 'haslo');
  4.     
  5. $mysql_result = mysql_query('SELECT '.$wartosc.' FROM tbl_news WHERE id_news=3 LIMIT 0,1');
  6.  
  7. $row = mysql_fetch_assoc($mysql_result);
  8. print($row[$wartosc]);
  9.  
  10. ?>


problem z tym kodem jest taki, że wrzucając zawartość pliku zaladuj.php do pola INPUT wrzuca razem ze statystykami home.pl (home dokleja je do każdje strony)... w przypadku 'innerHTML' nie ładowało tego....

Wiem, że nie jest to zbyt skomplikowany problem, jest to poprostu "wrzucanie" danych do formularza, podstawopwa sprawa, no ale jednak jest to problem..Może ktoś mi pomóc?
Vomit
A jak zrobic cos w stylu loadingu ale z procentami?

Np. chodzi mi, ze mam liste mailingowa i 300 maili do rozesłania.
Wpisuje tresc i naglowek, klikam Rozeslij, i chciałbym dowiadywac sie w jakim stopniu maile zostały juz rozesłane, czy to 30 maili (10%) czy tez 99% maili ?
TomASS
Dla bardziej zainteresowanych napisałem kolejny przykład - tym razem oparty o klasę:

SAJAX
klasę to można ściągnąć ze ype = "GET";
sajax_init();
sajax_export("check_user");
sajax_handle_client_request();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       <script>
       <?
       sajax_show_javascript();
       ?>
       function $(id){
   return document.getElementById(id);
 }
 
       function czy_istnieje(wartosc) {
        if(wartosc=='email'){
         alert("Ten e-mail isntieje już w bazie danych");
         $("login").style.border='1px solid #7F9DB9';
   $("email").style.border='1px solid red';
        }
        else if(wartosc=='login'){
         alert("Użytkownik o takim loginie jest już w bazie danych");
   $("login").style.border='1px solid red';
   $("email").style.border='1px solid #7F9DB9';
        }
        else if(wartosc=='OK') $("registerForm").submit();
       }

       
       function check() {
   login = $("login").value;
   email = $("email").value;
               x_check_user(login, email, czy_istnieje);
       }
       </script>

</head>
<body>
<form action="register.php" method="POST" id="registerForm">
Login: <input type="text" name="login" id="login"><br>
Hasło: <input type="text" name="email" id="email"><br>
<button onclick="check();">Wyslij</button>
</form>
</body>
</html>
TomASS
Może coś wyjaśnię.

Rzeczywiście mike_mech - nie ma wpływu na SMARTY.
Inn sprawa, że advAJAX może wysłać żądanie do serwera, który dzięki SMARTY wygeneruje jakiś HTML i później dzięki innerHTML można ten kod umieścić na stronie. Ale na sposób generacji AJAX może wpływać tylko poprzez żądanie do serwera.

Cytat
Nie po to pobierasz dane metoda get obiektu advAjax aby te dane wysylac spowrotem na serwer w celu wrzucenia ich do szablonu smarty.

Myślę, że nie o to chodziło eMartio - możesz AJAXem pobrać (przy pomocy np. GET) cały wygenerowany szablon i umieścić go w divie.

Cytat
I jak teraz z pliku index.php przesłać nowe dane do templejtu?

Nowe dane nie prześlesz do templejtu, możesz co najwyżej wygenerować nowy kod HTML.

Cytat
Dla jasnosci advAjax zmienia zawartosc juz wygenerowanej strony, a szablon smarty jest wzorem na podstawie ktorego sie te strone generuje. advAjax nie zmienia wzoru tylko wynik.

Właśnie o to chodzi - AJAX nie zmieni szablonu lecz tylko jego zawartość.


@kukix:
Cytat
Czytałem troche na stronie advAJAX o wysyłaniu formularzy no i sa tam dwa sposoby wysyłania formularzy.. jeden to

Noi brawo smile.gif a gdybyśmy dali Ci na początku gotowe rozwiązanie, to prawdopodobnie trudniej by Ci było się zmotywować do poczytaniu o AJAXie smile.gif

Cytat
Jak myslicie, który sposób jest lepszy i do czego jest lepszy... 

Myślę, że advAJAX.assign jest lepszym rozwiązaniem przy wysyłaniu formularzy. Po to (prawdopodobnie) został stworzony. Pomyśl sobie, jakbyś miał formularz generowany przez php bądź JS i niewiedział ile masz pól (np. checkboxów lub selectów) - wtedy wysyłanie submitem mogłoby być troszkę uciążliwe.

Cytat
P.S2 Jest w advAJAX taka "opcja", która czyści cały formularz.. np po wysłaniu formularza? czy trzeba wszystkie pola ręcznie czyścić?

jest instrukcja JavaScript, która "zeruje" formularz:
Kod
this.form.reset();
chomiczek
Hmm.. ja właściwie dopiero zainteresowałem sie AJAXem, ale mam pewien problem, a mianowicie póki co mam taki prosty kodzik:

test.php
  1. <?php
  2. include '../config.inc.php';
  3. $zapytanie = "SELECT * FROM `arkaProdukty` WHERE `ProductId`='".$_GET['id']."' LIMIT 1";
  4. $odp=mysql_query($zapytanie);
  5. while($row=mysql_fetch_array($odp)) {
  6. echo $row['Symbol'];
  7. }
  8. ?>


w index.php mam:
Kod
<script type="text/javascript">
function changeModel(p) {
    changeModel += p;
    advAJAX.setDefaultParameters({
    onInitialization : function(obj) { document.getElementById(obj.tag).innerHTML = "Przygotowywanie..."; },
    onLoading : function(obj) { document.getElementById(obj.tag).innerHTML = "Ładowanie..."; },
    onSuccess : function(obj) { document.getElementById(obj.tag).innerHTML = "Wynik: " + obj.responseText; },
    onError : function(obj) { document.getElementById(obj.tag).innerHTML = "Błąd..."; }
    });
    advAJAX.get({ url: "test.php?id="+p, tag: "e3_div1" });
    }
</script>

oraz poniżej:
  1. <div id="e3_div1" class="e3_div"></div><br/><br/>


i niby wszystko ładnie, ale do mometu pierwszego wywołania, a mianowicie kiedy kliknę na link: java script:changeModel(4) wszystko ok, ale kiedy już otrzymam wynik i kliknę np. na następny changeModel(5) nic sie nie dzieje. :/ o co chodzi?

Juz znalazłem.. poprawiony plik JS powinnien być bez linijki:
Kod
changeModel += p;
kukix
Używam do wysyłania fomrularza AJAX'a .. wszystko jest ok, ale co zrobic, jeżeli na jednej stronie są dwa różne formularze...

Mam w <BODY ... onload="updateObjects();">

Kod
function updateObjects() {
 advAJAX.assign($("frm_news"), {
   onInitialization : function(obj) {...},
   onComplete : function() {...},
   onSuccess : function(obj) {...},
   onError : function(obj) {...}
 });
}


Funkcja updateObjects wykionuje różne działania, które w innym formularzu nie są potrzebne, będą powodowały konflikt.. (podstawianie domyslnych wartości, resetowanie itd..)...

I teraz mam inny formularz (lista newsów z checkboxem wybieram tutaj te do usunięcia)... no i jak go wysyłam submitem, to wykonuje tą funkcje updateObjects..

Jak rozwiązać tą sprawe.. drugiej funkcji updateObjects2() raczej nie można wstawić do onLoad.. myślałem, żeby wewnątrz funkcji updateObjects() podzielić kod ze względu na formularza np:


Kod
function updateObjects() {

if (form= 'foirmularz1') {
 advAJAX.assign($("frm_news"), {
   onInitialization : function(obj) {...},
   onComplete : function() {...},
   onSuccess : function(obj) {...},
   onError : function(obj) {...}
 });
} else {//inny formularz
 advAJAX.assign($("frm_news"), {
   onInitialization : function(obj) {...},
   onComplete : function() {...},
   onSuccess : function(obj) {...},
   onError : function(obj) {...}
 });
}
}


Co wy o tym sądzicie.. może jest jkakiś inny lepszy sposób...questionmark.gif
bigZbig
Nie latwiej zrobic osobne funckje dla obslugi kazdego formularza updateObjects1() i updateObjects2()?
kukix
Mam takie pytanie co do advAJAX.assign()...
Chodzi mi konkretnie o wysyłanie tablicy...
mam taki form:
  1. <FORM ...>
  2. <INPUT type=checkbox name=zaznacz_mnie[] value=1>
  3. <INPUT type=checkbox name=zaznacz_mnie[] value=2>
  4. <INPUT type=checkbox name=zaznacz_mnie[] value=3>
  5. </FORM>


no i teraz chciałem skryptem php wrzucić tą tablice do pętli:
  1. <?php
  2.  
  3. if(count($zaznacz_mnie)>0) {
  4.   foreach($zaznacz_mnie as $id_pozycji) {
  5.     sql("DELETE FROM news WHERE id = '".$id_pozycji."' LIMIT 1");
  6.   }
  7. }
  8.  
  9. ?>


no i problem jkest w tym, że z tego formularza dochodzi tablica, ale tylko z pierwszym wpisem value=1 (count($zaznacz_mnie) zwraca 1)..da sie jakoś to ominąc..? czy advAJAX.assign() "potrafi"wysyłac tablice? spotkał sie może ktoś kiedyśz takim przypadkiem?
chomiczek
Hmm.. ja mam pytanko dot. tego czego lepiej użyć, które rozwiązanie jest bardziej optymalne:
1.
  1. advAJAX.get({ url: "look.php?symbol="+p, tag: "symbol" });
  2. advAJAX.get({ url: "look.php?rozmiar="+p, tag: "rozmiar" });
  3. advAJAX.get({ url: "look.php?skora="+p, tag: "skora" });
  4. advAJAX.get({ url: "look.php?fotoD="+p, tag: "fotoD" });

w odpowiednie tagi 'wklejane są' wyniki zapytania.. tylko w tym przypadku jest wysyłane aż 4 razy zapytanie do bazy danych do pliku look.php

2.
Wysyłam jedno zapytanie, które zwraca mi spreparowaną stronę. W chwili obecnej jest tak, że w kilku miejscach na stronie pojawi mi się Ładowanie, jesli byłoby to jedno zapytanie to byłoby to jedno ŁADOWANIE, a strona na chwile by znikała (jesli dobrze rozumuje).

Które z tych rozwiązań jest lepsze, ewentulanie może jest trzecie?

W chwili obecnej potrzebuje tego do Tej strony
zalinkowane są fotki na dole, ale czy mój pomysł jest ok?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.