AJAX i JSON w Zend Framework

Uwaga! Ten wpis został napisany ponad rok temu i informacje w nim zawarte mogą być nieaktualne.

Zacząłem niedawno nowy projekt. Kolejny oparty o Zend Framework, a tym razem w znacznym stopniu wykorzystujący tzw. AJAX. Jednak zamiast zwracać XML wolę dane dostawać jako JSON. Jak to robię, wykorzystując dobrodziejstwa ZF? Pokażę na przykładzie akcji logowania.

Akcja logowania nie generuje u mnie żadnych formularzy ani tekstu. Służy tylko do wywołania przez zapytanie asynchroniczne i zwrócenia danych jako JSON.

Oto kod akcji:

Po kolei

Cała magia zaczyna się od

czyli wybrania layoutu dla tej akcji i zainicjowania tablicy json w obiekcie view. Dalej odbywa się logowanie za pomocą modułu Zend_Auth (o tym może przy innej okazji) i odpowiednie wypełnianie tablicy json.

A po co był ten wybór layoutu? To nowość w wersji 1.5 frameworka. W pliku bootstrap (zazwyczaj index.php) należy go zainicjować dodając linijkę:

Domyślny layout należy umieścić w pliku /application/views/layouts/layout.phtml – będzie on wczytywany dopóki go dla danej akcji nie wyłączymy lub nie zmienimy. To drugie zrobiłem właśnie w akcji logowania. A w pliku /application/views/layouts/json.phtml wrzuciłem tylko:

i wtedy cała odpowiedź akcji to przerobiona tablica json za pomocą zendowego helpera json(). Reszta to już kwestia JS i odpowiedniego odczytania zwróconego obiektu. Korzystam z mootools i tamtejszej metody Json.evaluate(); pobieranie danych za pomocą Json.Remote generowało błędy.

Podsumowanie

Oczywiście logowanie to tylko przykład tworzenia wyniku JSON. Najważniejsze elementy to:

  • zainicjowanie Zend_Layout;
  • utworzenie tablicy json (tylko ten krok należy wykonać w każdej akcji, pozostałe wykonają się automagicznie);
  • zdefiniowanie layoutu jsonowego;
  • przekształcenie tablicy do JSON w layoucie;
  • skrypt akcji w views może zostać pusty.

Komentarze

  1. Radarek ·

    Uhm i właśnie dlatego nie piszę w php. Toż to przecież java…
    $f->filter($this->_request->getPost(‘login’,’‘));
    Nie, dziękuję :).

  2. Tybalt ·

    Cała magia zaczyna się tu:
    if($this->view->checkLogin())die();

  3. Piotr Rybałtowski ·

    Jak jest zalogowany, to nie będzie tego przez AJAX wywoływał. A jak wywołuje, to znaczy, że coś przekręcił. A jak przekręcił, to jego problem.

  4. nkp ·

    die() jest raczej do skryptów. Dla www powinieneś zwracać kod błędu http.

  5. AJAX i JSON w Zend Framework 2 ·

    […] formacie JSON w Zend Framework 2 nie jest oczywista. Poniżej postaram się przybliżyć ten temat. 5 lat temu pisałem o tym temacie w kontekście Zend Framework 1. Dzisiaj, kilka miesięcy po premierze ZF2, nadszedł […]

Dodaj komentarz