Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][AJAX] Struktura po stronie serwera.
Forum PHP.pl > Forum > PHP
tolomei
Witam.

Chciałbym zapytać o wasze doświadczenia przy obsłudze żądań AJAX po stronie skryptu PHP.

Przy projektach używałem dwóch sposobów:

Sposób 1.

Skrypt JS obsługując różne zdarzenia wysyła żądania postem do np. ajaxFunctions.php w podanej formie:

{ funkcja: 1, dane: data }
{ funkcja: 2, dane: data }

Strona php:

  1. // pomijam walidację i kwestie bezpieczeństwa
  2.  
  3. if(isset($_POST['funkcja'])) {
  4.  
  5. if($_POST['funkcja'] == 1) {
  6. // kod obsługi
  7. // zwracamy odpowiedź
  8. } elseif($_POST['funkcja'] == 2) {
  9. // kod obsługi
  10. // zwracamy odpowiedź
  11. } elseif($_POST['funkcja'] == 3) {
  12. // kod obsługi
  13. // zwracamy odpowiedź
  14. } else {
  15. // zwracamy błąd
  16. }
  17. }



Sposób 2.

Każde zdarzenie jest obsługiwane przez oddzielny skrypt php na serwerze.
Chyba nie potrzeba więcej wyjaśnień tutaj.


Oba sposoby wykorzystywałem i nie jestem z nich w 100% zadowolony.
Domyślam się, że jeszcze można by pójść w stronę OOP.

Macie jakieś własne sposoby implementacji ?

Dzięki.
Pozdro.
bastard13
Cytat
Domyślam się, że jeszcze można by pójść w stronę OOP.

Dobrze się domyślasz:)

Abstrahując jednak od tego, to dla każdego zapytania AJAXowego powinien być inny adres url np.
edycja profilu -> my_page.com/profile/edit
wyświetlanie listy zadań -> my_page.com/task_list

Czyli ta twoja funkcja ze sposobu pierwszego powinna być określona za pomocą url'a, natomiast pozostałe dane get'em lub post'em.
Często można spotkać doklejanie id do url'a, czyli jeżeli jestem użytkownikiem o id = 2, to link do edycji profilu wyglądałby tak:
my_page.com/profile/edit/2

Koniec końców raczej stosuj drugi sposób niż pierwszy:) W taki sposób łatwiej, a przede wszystkim czytelniej:) jest kontrolować uprawnienia użytkowników.
ActivePlayer
a ja to robie tak (zend framework):

1. używam zend_layout domyślnie w aplikacjach. sama akcja zwraca tylko środek.
2. napisałem plugin, który w przypadku jeśli mamy zapytanie ajaxowe wyłącza layout

tym sposobem mam wymieszane wszystkie akcje ajaxowe oraz nei ajaxowe w controlerach (oczywiscie dobre nazewnictwo jest jak najbardziej wskazane).

fajne w tym jest to, że jeśli chcę przeładować ajaxem "centrum" aplikacji, to request z marszu zwróci mi tylko środek, a jak wywołam ten sam odnośnik w nowym oknie, to doklei layout i wszystko będzie działało odpowiednio.
bastard13
Cytat
fajne w tym jest to, że jeśli chcę przeładować ajaxem "centrum" aplikacji, to request z marszu zwróci mi tylko środek, a jak wywołam ten sam odnośnik w nowym oknie, to doklei layout i wszystko będzie działało odpowiednio.

Nie wydaje mi się, żeby coś takiego było potrzebnym zabiegiem. W końcu wiesz, które akcje mają być responsem ajaxowym, a które nie, więc po co dodatkowo to sprawdzanie robić po stronie serwera? Jeżeli użytkownik wpisze ajaxowy url z palca to dlaczego otaczać to dodatkowo layoutem? Taka akcja nie jest pożądana, więc dlaczego nie wypluć po prostu czystego responsa?

Cytat
tym sposobem mam wymieszane wszystkie akcje ajaxowe oraz nei ajaxowe w controlerach

Dobrze prawi:) Logika jest ważniejsza niż typ żądania.
ActivePlayer
Cytat
Nie wydaje mi się, żeby coś takiego było potrzebnym zabiegiem. W końcu wiesz, które akcje mają być responsem ajaxowym, a które nie, więc po co dodatkowo to sprawdzanie robić po stronie serwera? Jeżeli użytkownik wpisze ajaxowy url z palca to dlaczego otaczać to dodatkowo layoutem? Taka akcja nie jest pożądana, więc dlaczego nie wypluć po prostu czystego responsa?

u mnie jest to skonstruowane w ten sposób:
Kod
<a href="url_do_akcji" class="ajaxlink">link</a>

no i jak mam cos takigo to sobie javascriptem linki z klasą ajaxlink obsługuję do jakiegoś głównego diva. a jesli ktoś nie ma akurat javascriptu włączonego, to i tak całość zadziała normalnie, tyle że z przeładowaniem strony (i dla google też zadziała).
tolomei
Na "ifach" robiłem ajaxowy chat online z konsultantem.
Rodzajów zapytań było wiele i w obrębie tego jednego modułu więc zrobiłem w ten sposób.

Świetne rozwiązanie ActivePlayer smile.gif
Dzięki za wypowiedzi.
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-2025 Invision Power Services, Inc.