Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Zend + Ajax
Forum PHP.pl > Forum > PHP > Frameworki
Ghost_78
Witam szanowne grono Kolegów.
Od jakiegoś czasu zabawiam się z Zendem i przyszedł czas na wplecienie AJAXa w funkcjonalność aplikacji.

Moje pytanie jest następujące. W jaki sposób obsługujecie zapytania po stronie Zenda? Chodzi mi tutaj o następującą rzecz: załóżmy, że chcę dynamicznie podstawić do jakiegoś DIV'a inputa, selecta czy cokolwiek. Po stronie przeglądarki nie jest istotne jak to załatwimy (JS czy jQuery). Ważne jest jak to obsłużyć po stronie Zenda. Czytałem, czytałem i w większości sytuacji wyglądało to tak, że dowołanie szło na konkretny kontroler i akcje, które zwracały np kod html.

Problem w tym, jak zarządzać strukturą katalogów, kontrolerów, akcji dla Ajaxa? Czy macie np jeden kontroller i do tego odpowiednie akcje ? np /ajax/categoryselect ? Czy może wplatacie wyniki dla ajaxa w kontrolery, które są przeznaczone także do normalnego funkcjonowania strony. A może jeszcze inaczej ?

Bardzo jestem ciekaw Waszych opinii.

P.S.
Jeżeli za bardzo zamieszałem to przepraszam wink.gif
melkorm
Używając helpera contextSwitcher i ajaxContext można łatwo zrobić akcję które mogą działać po ajaxsie i normalnie wink.gif Bo praktycznie jeżeli używasz helpera to one się nie różnią wink.gif

przykład:

Akcja zwraca formularz:
  1. // walidacja itp
  2. $this->view->form = $form;


Jeżeli użyjesz ajaxContext i zwracany format masz html to zwróci Tobie po prostu samą wyrenderowaną akcję bez layout'u (oczywiście sam sprawdzi czy request jest ajax'owy itp), problem robi się gdy zwracasz JSON'a wtedy już musisz zwrócić więcej danych czyli czy waldiacja przeszła poprawnie i jeżeli nie to wyrenderowany formularz, albo po prostu jeżeli ok to ok a jeżeli rpzyszedł form wyrenderowany to zakładamy że nie przeszedł walidacji, sposobów jest mnóstwo wink.gif
Ghost_78
To co piszesz to święta prawda smile.gif.
Doskonale to opisał Batman na blogu (za co dzięki śliczne). W moim poście i pytaniu chodziło mi bardziej o samą strukturę.
Postaram się jaśniej naświetlić mój problem:
Wiadomym jest, że jeżeli chcemy coś pobrać AJAXem to musimy się odwołać do jakiegoś skryptu PHP. Zazwyczaj bez ZENDa robiłem sobie to tak:
za pomocą AJAXa wywoływałem sobie np: jakisPlik.php?szukam=czegos
  1. //jakisPlik.php
  2. $czegoSzukam = $_GET[szukam];
  3. switch ($czegoSzukam){
  4. case'switchZKategoriami':
  5. //tu np echo switcha z kategoriami
  6. break;
  7. case'switchZMarkami':
  8. //tu np echo switcha z markami
  9. break;
  10. }

Nie jest to jakoś specjalnie za eleganckie - ale działało wink.gif
Chodzi mi tutaj teraz o to, żeby w Zendzie nauczyć się to pisać w "ładny" sposób.
Można np zrobić małą fabryczkę, która będzie nam w ten sam sposób zwracała takie selekciki:
  1. class SelectyController extends Zend_Controller_Action{
  2. public function kategorieAction(){
  3. $select = Zend_Form_Element_Select();
  4. .... // wykonanie tego selecta
  5. $this->view->pokaz = daneZSelectem
  6. }
  7. }


wtedy możemy AJAXem sobie pobrać to przez /selecty/kategorie

Tylko moje pytanie - czy taki sposób jest prawidłowy ? Czy Wasze doświadczenie także doprowadziło Was do takich rozwiązań?
melkorm
to gdzie umieścisz funkcję od ajax'a to już Twoja sprawa, ja pakuję je tam gdzie powinny być czyli w zasięgu danego kontrola który odpowiada za wyświetlanie tego gdzie ajax się odbywa.

Co do przykładu to się przyczepie do tego że wszystko związane z pobieraniem danych powinno się odbywać w modelu więc by to wyglądało tak:

  1. // pseudo kod
  2. akcja{
  3. model = new model;
  4. somedata = model->getSomeData();
  5. // ewentualne jakieś operacje na tych danych
  6. // przekazanie do widoku czy to JSON, XML, HTML itp
  7. $this->view->data = somedata;
  8. }
Ghost_78
yyy. Nie za bardzo wiem do której części nawiązałeś. Chodzi o to ?
  1. public function kategorieAction(){
  2. $select = Zend_Form_Element_Select();
  3. .... // wykonanie tego selecta
  4. $this->view->pokaz = daneZSelectem
  5. }

Jeżeli tak to to tylko był przykład na podmiankę selekta w formularzu. Czasami tak jest, że chcemy podmienić listę w selekcie (w formularzu) w zależności od tego co jest wybrane w innej części formularza.

Co do danych to oczywiście pobieram je w Modelu i ewentualnie przekazuje do formularza lub jego elementu aby wypełnić go danymi. Tutaj przedstawiłem tylko zarys tego co chciałem osiągnąć.

Co do umieszczenia kodu, który będzie 'wyświetlany' dla AJAXa to w sumie chodziło mi o to miejsce. Ty umieszczasz to w kontrolerze gdzie jest dana podstrona wyświetlana. I to jest ok. Tylko co jeżeli chcemy tak jak napisałem - pobrać tylko mały element, który może występować w wielu podstronach. Wtedy troszeczkę kłóci się z zasadami dobrego programowania umieszczanie kodu dla AJAXa w każdym miejscu.

Np mając 10 podstron na których musimy zaktualizować AJAXem tylko część formularza (uparłem się). Wtedy w każdym kontrolerze musielibyśmy wklejać wyżej przedstawiony kod.

Z drugiej strony nie możemy zapisać tylko w jednym z nich bo z czasem nie będziemy pamiętali, w którym on był. Poza tym to takie trochę nie eleganckie by było smile.gif.

Dlatego właśnie myślałem o jakimś specjalnym miejscu smile.gif.

P.S.
Przepraszam za męczenie tematu jakoś zmęczyło mnie pisanie kodu, który będzie działał - bez znaczenia jak został napisany. Czas zabrać się za eleganckie pisanie tongue.gif. Jeszcze kawałek drogi przede mną i dlatego wolę podpytać bardziej doświadczonych ode mnie smile.gif.
melkorm
To już twoja sprawa czy zrobisz jakiś kontroler na ajaxowe funkcje wykorzystywane w wielu miejscach, ale zawsze możesz w kontrolerze A odwołać się do kontrolera B do ajaxowej funkcji

Bo to:
Cytat
Np mając 10 podstron na których musimy zaktualizować AJAXem tylko część formularza (uparłem się). Wtedy w każdym kontrolerze musielibyśmy wklejać wyżej przedstawiony kod.

Jest bezsensu skoro możesz odwołać się do innego kontrolera.


Ogólnie to napisz tak i tak, popatrz jak Tobie wygodniej / czytelniej / bezpieczniej - bo niektóre funkcje np będą potrzebowały zalogowanego user'a inne nie, do tego ACL itp wink.gif

Ja jestem za moim rozwiązaniem, ale to moje subiektywne spojrzenie wink.gif
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.