Zacz\u0105\u0142em niedawno nowy projekt. Kolejny oparty o Zend Framework<\/a>, a tym razem w znacznym stopniu wykorzystuj\u0105cy tzw. AJAX<\/abbr>. Jednak zamiast zwraca\u0107 XML<\/abbr> wol\u0119 dane dostawa\u0107 jako JSON<\/abbr>. Jak to robi\u0119, wykorzystuj\u0105c dobrodziejstwa ZF<\/abbr>? Poka\u017c\u0119 na przyk\u0142adzie akcji logowania.<\/p>\n Akcja logowania nie generuje u mnie \u017cadnych formularzy ani tekstu. S\u0142u\u017cy tylko do wywo\u0142ania przez zapytanie asynchroniczne i zwr\u00f3cenia danych jako JSON<\/abbr>.<\/p>\n Oto kod akcji:<\/p>\n Ca\u0142a magia zaczyna si\u0119 od<\/p>\n czyli wybrania layoutu dla tej akcji i zainicjowania tablicy json<\/i> w obiekcie view<\/i>. Dalej odbywa si\u0119 logowanie za pomoc\u0105 modu\u0142u Zend_Auth<\/a> (o tym mo\u017ce przy innej okazji) i odpowiednie wype\u0142nianie tablicy json<\/i>.<\/p>\n A po co by\u0142 ten wyb\u00f3r layoutu? To nowo\u015b\u0107 w wersji 1.5 frameworka. W pliku bootstrap<\/i> (zazwyczaj index.php<\/i>) nale\u017cy go zainicjowa\u0107 dodaj\u0105c linijk\u0119:<\/p>\n Domy\u015blny layout nale\u017cy umie\u015bci\u0107 w pliku \/application\/views\/layouts\/layout.phtml<\/i> – b\u0119dzie on wczytywany dop\u00f3ki go dla danej akcji nie wy\u0142\u0105czymy lub nie zmienimy. To drugie zrobi\u0142em w\u0142a\u015bnie w akcji logowania. A w pliku \/application\/views\/layouts\/json.phtml<\/i> wrzuci\u0142em tylko:<\/p>\n i wtedy ca\u0142a odpowied\u017a akcji to przerobiona tablica json<\/i> za pomoc\u0105 zendowego helpera json()<\/i>. Reszta to ju\u017c kwestia JS<\/abbr> i odpowiedniego odczytania zwr\u00f3conego obiektu. Korzystam z mootools<\/a> i tamtejszej metody Json.evaluate()<\/i>; pobieranie danych za pomoc\u0105 Json.Remote<\/i> generowa\u0142o b\u0142\u0119dy.<\/p>\n Oczywi\u015bcie logowanie to tylko przyk\u0142ad tworzenia wyniku JSON<\/abbr>. Najwa\u017cniejsze elementy to:<\/p>\n Podobny wpis dla Zend Framework 2 mo\u017cna znale\u017a\u0107 tutaj (13 maja 2013). Zacz\u0105\u0142em niedawno nowy projekt. Kolejny oparty o Zend<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[6,4,5],"tags":[],"jetpack_publicize_connections":[],"yoast_head":"\nclass AccountController extends Zend_Controller_Action\r\n{\r\n function signinAction()\r\n {\r\n if($this->view->checkLogin())die();\r\n $this->_helper->layout->setLayout('json');\r\n $this->view->json = array('error'=>0, 'signin'=>false, 'message'=>'');\r\n if($this->_request->isPost())\r\n {\r\n $f = new Zend_Filter_StripTags();\r\n $login = $f->filter($this->_request->getPost('login',''));\r\n $password = $f->filter($this->_request->getPost('password',''));\r\n if(!empty($login))\r\n {\r\n $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter(), 'users', 'email', 'passwd', 'MD5(?) AND is_deleted = 0');\r\n $authAdapter->setIdentity($login);\r\n $authAdapter->setCredential($password);\r\n $auth = Zend_Auth::getInstance();\r\n $result = $auth->authenticate($authAdapter);\r\n if($result->isValid())\r\n {\r\n $data = $authAdapter->getResultRowObject(array('id_user', 'email', 'name', 'user_role'));\r\n $auth->getStorage()->write($data);\r\n $this->view->json['signin']=true;\r\n }\r\n }\r\n }\r\n if(!$this->view->json['signin'])\r\n $this->view->json['message']='Podane e-mail i has\u0142o nie pasuj\u0105 do siebie.';\r\n }\r\n}<\/pre>\n
Po kolei<\/h3>\n
$this->_helper->layout->setLayout('json');\r\n$this->view->json = array('error'=>0, 'signin'=>false, 'message'=>'');<\/pre>\n
Zend_Layout::startMvc(array('layoutPath'=>ROOT_DIR.'\/application\/views\/layouts\/'));<\/pre>\n
json(isset($this->json)?$this->json:array())?><\/pre>\n
\/*\r\n * url - adres akcji logowania - w przyk\u0142adzie \/account\/signin\/\r\n * params - informacje logowania\r\n *\/\r\nnew Ajax(url, {'data':params, 'method': 'post', 'onComplete': function(t){\r\n var data = Json.evaluate(t);\r\n if(!data)\r\n alert('Wyst\u0105pi\u0142 b\u0142\u0105d podczas logowania!');\r\n if(data.error)\r\n alert('Wyst\u0105pi\u0142 b\u0142\u0105d podczas logowania!');\r\n if(data.signin)\r\n alert('Zalogowany!');\r\n else\r\n alert(data.message);\r\n}<\/pre>\n
Podsumowanie<\/h3>\n
\n