AJAX i JSON w Zend Framework

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:

  1. class AccountController extends Zend_Controller_Action
  2. {
  3.     function signinAction()
  4.     {
  5.         if($this->view->checkLogin())die();
  6.         $this->_helper->layout->setLayout('json');
  7.         $this->view->json = array('error'=>0, 'signin'=>false, 'message'=>'');
  8.         if($this->_request->isPost())
  9.         {
  10.             $f = new Zend_Filter_StripTags();
  11.             $login = $f->filter($this->_request->getPost('login',''));
  12.             $password = $f->filter($this->_request->getPost('password',''));
  13.             if(!empty($login))
  14.             {
  15.                 $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter(), 'users', 'email', 'passwd', 'MD5(?) AND is_deleted = 0');
  16.                 $authAdapter->setIdentity($login);
  17.                 $authAdapter->setCredential($password);
  18.                 $auth = Zend_Auth::getInstance();
  19.                 $result = $auth->authenticate($authAdapter);
  20.                 if($result->isValid())
  21.                 {
  22.                     $data = $authAdapter->getResultRowObject(array('id_user', 'email', 'name', 'user_role'));
  23.                     $auth->getStorage()->write($data);
  24.                     $this->view->json['signin']=true;
  25.                 }
  26.             }
  27.         }
  28.         if(!$this->view->json['signin'])
  29.             $this->view->json['message']='Podane e-mail i hasło nie pasują do siebie.';
  30.     }
  31. }

Po kolei

Cała magia zaczyna się od

  1. $this->_helper->layout->setLayout('json');
  2. $this->view->json = array('error'=>0, 'signin'=>false, 'message'=>'');

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ę:

  1. Zend_Layout::startMvc(array('layoutPath'=>ROOT_DIR.'/application/views/layouts/'));

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:

  1. <?=$this->json(isset($this->json)?$this->json:array())?>

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.

  1. /*
  2.  * url - adres akcji logowania - w przykładzie /account/signin/
  3.  * params - informacje logowania
  4.  */
  5. new Ajax(url, {'data':params, 'method': 'post', 'onComplete': function(t){
  6.         var data = Json.evaluate(t);
  7.         if(!data)
  8.                 alert('Wystąpił błąd podczas logowania!');
  9.         if(data.error)
  10.                 alert('Wystąpił błąd podczas logowania!');
  11.         if(data.signin)
  12.                 alert('Zalogowany!');
  13.         else
  14.                 alert(data.message);
  15. }

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.

Pokaż ten wpis innym: wykop.pl facebook.com twitter.com

Komentarze do wpisu „AJAX i JSON w Zend Framework”

  1. 3 kwietnia 2008 @ 16:59

    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
    28 listopada 2008 @ 23:00

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

  3. 28 listopada 2008 @ 23:25

    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.

Napisz, co o tym myślisz
captcha
dekoderek-jogg