Deprecated: Creation of dynamic property Automattic\Jetpack\WP_JS_Data_Sync\Data_Sync::$namespace is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php on line 91

Deprecated: Creation of dynamic property Automattic\Jetpack_Boost\Features\Speed_Score\Speed_Score::$modules is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/app/features/speed-score/Speed_Score.php on line 20

Deprecated: Creation of dynamic property Jetpack_Publicize::$modules is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack/modules/publicize.php on line 38

Deprecated: Creation of dynamic property Automattic\Jetpack\Publicize\Publicize_UI::$in_jetpack is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack/modules/publicize.php on line 101

Deprecated: Creation of dynamic property JQueryColorbox::$colorboxSettings is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jquery-colorbox/jquery-colorbox.php on line 93

Deprecated: Creation of dynamic property JQueryColorbox::$colorboxThemes is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jquery-colorbox/jquery-colorbox.php on line 97

Deprecated: Creation of dynamic property JQueryColorbox::$colorboxUnits is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jquery-colorbox/jquery-colorbox.php on line 121

Deprecated: Creation of dynamic property JQueryColorbox::$colorboxTransitions is deprecated in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jquery-colorbox/jquery-colorbox.php on line 127

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768

Warning: Cannot modify header information - headers already sent by (output started at /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-content/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-wp-js-data-sync/src/class-data-sync.php:91) in /home/owl_piotrek/blog.piotr.rybaltowski.pl/wp-includes/rest-api/class-wp-rest-server.php on line 1768
{"id":877,"date":"2013-05-13T23:17:15","date_gmt":"2013-05-13T21:17:15","guid":{"rendered":"http:\/\/blog.piotr.rybaltowski.pl\/?p=877"},"modified":"2022-01-18T23:36:41","modified_gmt":"2022-01-18T22:36:41","slug":"ajax-json-zend-framework-2","status":"publish","type":"post","link":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/","title":{"rendered":"AJAX i JSON w Zend Framework 2"},"content":{"rendered":"

Patrz\u0105c na fora w Internecie oraz zapytania programist\u00f3w, mam wra\u017cenie, \u017ce obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. Poni\u017cej postaram si\u0119 przybli\u017cy\u0107 ten temat. 5 lat temu pisa\u0142em<\/a> o tym temacie w kontek\u015bcie Zend Framework 1. Dzisiaj, kilka miesi\u0119cy po premierze ZF2, nadszed\u0142 czas na od\u015bwie\u017cenie tematu.<\/p>\n

Wy\u015bwietlanie widoku bez layoutu (w zale\u017cno\u015bci od metody \u017c\u0105dania)<\/h3>\n

Za\u0142\u00f3\u017cmy, \u017ce chcemy, aby nasza aplikacja dzia\u0142a\u0142a w taki spos\u00f3b, \u017ce gdy przychodzi pe\u0142ne nowe zapytanie o ca\u0142\u0105 stron\u0119, pokazuje widok akcji razem z pe\u0142nym layoutem, a gdy zapytanie przychodzi przez AJAX, wysy\u0142a tylko widok akcji, a layout pomija. Jest to do\u015b\u0107 popularna forma dynamizacji nawigacji po stronie za pomoc\u0105 schematu hashbang<\/em> (#!<\/em>) albo jeszcze lepiej pushState<\/em>.<\/p>\n

Rozpoznanie zapytania Ajaksowego odbywa si\u0119 na podstawie nag\u0142\u00f3wka\u00a0X-Requested-With<\/em>. Wi\u0119kszo\u015b\u0107 framework\u00f3w z obs\u0142ug\u0105 AJAX ustawia go na warto\u015b\u0107\u00a0XMLHttpRequest<\/em>. Zend Framework dostarcza metody \u0142atwego sprawdzenia tego nag\u0142\u00f3wka i warto\u015bci z poziomu kontrolera\u00a0$this->getRequest()->isXmlHttpRequest()<\/span>\u00a0. Je\u017celi w takim przypadku chcemy wy\u0142\u0105czy\u0107 wykorzystanie layoutu i wys\u0142a\u0107 do przegl\u0105darki sam widok akcji, musimy model widoku (zaleca odpowied\u017a akcji kontrolera) ustawi\u0107 jako ko\u0144cowy („terminal<\/em>„):<\/p>\n

\/**\n * @return \\Zend\\View\\Model\\ViewModel\n *\/\npublic function myAction()\n{\n    \/\/ tutaj kod akcji i ustawienie zmiennych, kt\u00f3re mo\u017cna przekaza\u0107 do widoku\n\n    $vm = new \\Zend\\View\\Model\\ViewModel();\n\n    if ($this->getRequest()->isXmlHttpRequest()) {\n        $vm->setTerminal(true);\n    }\n\n    return $vm;\n}<\/pre>\n

I to wystarczy aby w ten spos\u00f3b rozr\u00f3\u017cni\u0107 zwracan\u0105 zawarto\u015b\u0107.<\/p>\n

Odpowied\u017a JSON (w zale\u017cno\u015bci od \u017c\u0105danego formatu)<\/h3>\n

Buduj\u0105c aplikacj\u0119 w ten spos\u00f3b, \u017ceby mog\u0142a ona od razu dzia\u0142a\u0107 jako API, mo\u017cemy np. wy\u015bwietla\u0107 dane w formacie JSON na \u017c\u0105danie. Co pozwoli wchodz\u0105c na przyk\u0142adowy URL \/users<\/em> zobaczy\u0107 list\u0119 u\u017cytkownik\u00f3w jako normalna strona HTML, kt\u00f3ra jest cz\u0119\u015bci\u0105 serwisu, a wchodz\u0105c na \/users.json<\/em> zobaczymy informacje o tych u\u017cytkownikach w formacje JSON. Zachowuj\u0105c przy tym przestrzeganie wszystkich parametr\u00f3w z query<\/em>, np. stronicowanie albo wyszukiwanie.<\/p>\n

Zend Framework w wersji 2 wprowadzi\u0142 nowy spos\u00f3b wy\u015bwietlania. Wy\u015bwietlanie sk\u0142ada si\u0119 z wielu warstw, z kt\u00f3rych najwa\u017cniejsze to:<\/p>\n

    \n
  • modele wy\u015bwietlania (View Models<\/em>), kt\u00f3re \u0142\u0105cz\u0105 zmienne z plikami widok\u00f3w (np. phtml) oraz steruj\u0105 renderowaniem. Domy\u015blnym obiektem tworzonym przez akcj\u0119 jest obiekt klasy\u00a0Zend\\View\\Model\\ViewModel<\/em>. Nawet zwracaj\u0105c tablic\u0119 zmiennych, ZF2 tworzy z niej ViewModel<\/em> z domy\u015blnymi ustawieniami.<\/span><\/li>\n
  • renderery (Renderers<\/em>, nie przychodzi mi do g\u0142owy dobre t\u0142umaczenie), kt\u00f3re odpowiadaj\u0105 za wczytanie pliku widoku, przekazanie tam zmiennych i wyrenderowanie wyniku. Domy\u015blnie u\u017cywane s\u0105 podobnie jak w ZF1 pliki phtml, kt\u00f3re s\u0105 HTMLem z osadzonymi fragmentami PHP. Jest troch\u0119 r\u00f3\u017cnic w stosunku do poprzedniej wersji frameworka (tam podobn\u0105 rol\u0119 spe\u0142nia\u0142\u00a0Zend_View<\/em>), ale og\u00f3lna zasada dzia\u0142ania jest ta sama.<\/li>\n
  • strategie renderowania (Rendering Strategies<\/em>), czyli druga obok modeli wy\u015bwietlania najwi\u0119ksza r\u00f3\u017cnica, gdzie w zale\u017cno\u015bci od r\u00f3\u017cnych warunk\u00f3w (typ modelu, typ \u017c\u0105dania z przegl\u0105darki, wersja mobilna\/desktop), wynik renderowania b\u0119dzie r\u00f3\u017cny.<\/li>\n<\/ul>\n

    Jest jeszcze kilka innych warstw, ale z do\u015bwiadczenia wiem, \u017ce s\u0105 one mniej istotne i zazwyczaj domy\u015blne ustawienia wystarczaj\u0105.<\/p>\n

    Aby m\u00f3c prawid\u0142owo wy\u015bwietla\u0107 dane z akcji jako format JSON, pierwsze co musimy zrobi\u0107, to w\u0142\u0105czy\u0107 strategi\u0119 renderowania JSON obok standardowej strategii wy\u015bwietlania plik\u00f3w HTML. Robimy to w konfiguracji jednego z modu\u0142\u00f3w naszej aplikacji w sekcji ’view_manager’<\/em>:<\/p>\n

    <?php\n\nreturn array(\n    \/\/ to jest tylko fragment pliku konfiguracyjnego\n    'view_manager' => array(\n        'strategies' => array(\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'ViewJsonStrategy',\n\u00a0 \u00a0 \u00a0 \u00a0 ),\n    ),\n);<\/pre>\n

    Nast\u0119pnie w akcji kontrolera zamiast standardowego ViewModel<\/em> zwracamy JsonModel<\/em>. Przekazane jako pierwszy argument zmienne w postaci tablicy zostan\u0105 automatycznie przekszta\u0142cone do formatu JSON<\/em> oraz wys\u0142ane do odpowiedzi z typem MIME<\/em> application\/json<\/em>\u00a0(dzi\u0119ki u\u017cyciu strategii). Mo\u017cemy np. zbudowa\u0107 aplikacj\u0119 w taki spos\u00f3b, aby u\u017cytkownik wchodz\u0105c przez przegl\u0105dark\u0119 na zwyk\u0142y adres dostawa\u0142 standardowy widok HTML, a wchodz\u0105c na adres z rozszerzeniem .json<\/em>\u00a0dostawa\u0142 odpowied\u017a w tym formacie.<\/p>\n

    Aby to zrobi\u0107, do \u015bcie\u017cki adresowej musimy doda\u0107 parametr, np. w ten spos\u00f3b:<\/p>\n

    <?php\n\nreturn array(\n    \/\/ to jest tylko fragment pliku konfiguracyjnego\n    'router' => array(\n        'routes' => array(\n            'home' => array(\n                'type'    => 'Literal',\n                'options' => array(\n                    'route'    => '\/',\n                    'defaults' => array(\n                        '__NAMESPACE__' => 'Application\\Controller',\n                        'controller'    => 'Index',\n                        'action'        => 'index',\n                    ),\n                ),\n                'may_terminate' => true,\n                'child_routes' => array(\n                    'default' => array(\n                        'type'    => 'Segment',\n                        'options' => array(\n                            'route'    => '[:controller[\/:action[\/:id]]][.:format]',\n                            'constraints' => array(\n                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',\n                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',\n                                'id'         => '[0-9]*',\n                            ),\n                            'defaults' => array(\n                            ),\n                        ),\n                    ),\n                ),\n            ),\n        ),\n    ),\n);<\/pre>\n

    Przyk\u0142adowy kontroler, kt\u00f3ry pozwoli pobra\u0107 list\u0119 u\u017cytkownik\u00f3w pod adresem\u00a0\/users<\/em>\u00a0oraz wersj\u0119 JSON<\/em> pod adresem \/users.json<\/em> mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n

    <?php\n\nnamespace Application\\Controller;\n\nuse Application\\Model\\Users\\UserQuery;\nuse Zend\\Mvc\\Controller\\AbstractActionController;\nuse Zend\\View\\Model\\JsonModel;\nuse Zend\\View\\Model\\ViewModel;\n\n\/**\n * Class UsersController\n *\/\nclass UsersController extends AbstractActionController\n{\n    \/**\n     * @return JsonModel|ViewModel\n     *\/\n    public function indexAction()\n    {\n        $users = UserQuery::create()->findAllByParams($this->getRequest()->getQuery()->toArray());\n\n        switch ($this->params('format')) {\n            case 'json':\n                $usersData = array();\n                foreach ($users as $user) {\n                    $usersData[] = $user->toArray();\n                }\n                return new JsonModel(array(\n                    'success' => true,\n                    'users' => $usersData,\n                ));\n            default:\n                return new ViewModel(array(\n                    'users' => $users,\n                ));\n        }\n    }\n}<\/pre>\n

    Podsumowuj\u0105c<\/h3>\n

    Wykorzystanie w odpowiedni spos\u00f3b technik opisanych powy\u017cej pozwoli na zbudowanie dynamicznych, ajaksowych, nowoczesnych aplikacji, daj\u0105cym u\u017cytkownik wygod\u0119 poruszania si\u0119. Druga metoda pozawala te\u017c na zbudowanie w bardzo prosty spos\u00f3b API w tworzonym oprogramowaniu, tak aby zewn\u0119trzne aplikacje mog\u0142y w \u0142atwy spos\u00f3b pobiera\u0107 lub tworzy\u0107 dane w serwisie.<\/p>\n","protected":false},"excerpt":{"rendered":"

    Patrz\u0105c na fora w Internecie oraz zapytania programist\u00f3w, mam wra\u017cenie, \u017ce obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. Poni\u017cej postaram si\u0119 przybli\u017cy\u0107 ten temat. 5 lat temu pisa\u0142em o tym temacie w kontek\u015bcie Zend Framework 1. Dzisiaj, kilka miesi\u0119cy po premierze ZF2, nadszed\u0142 czas na od\u015bwie\u017cenie tematu.<\/p>\n","protected":false},"author":1,"featured_media":951,"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":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[14,4,5],"tags":[28,30,19,20],"jetpack_publicize_connections":[],"yoast_head":"\nAJAX i JSON w Zend Framework 2<\/title>\n<meta name=\"description\" content=\"Obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. We wpisie postaram si\u0119 przybli\u017cy\u0107 ten temat.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AJAX i JSON w Zend Framework 2\" \/>\n<meta property=\"og:description\" content=\"Obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. We wpisie postaram si\u0119 przybli\u017cy\u0107 ten temat.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Piotr Ryba\u0142towski\" \/>\n<meta property=\"article:published_time\" content=\"2013-05-13T21:17:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-01-18T22:36:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/blog.piotr.rybaltowski.pl\/wp-content\/uploads\/2013\/04\/zf2-logo-mark.png?fit=190%2C102&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"190\" \/>\n\t<meta property=\"og:image:height\" content=\"102\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Piotr Ryba\u0142towski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@prybaltowski\" \/>\n<meta name=\"twitter:site\" content=\"@prybaltowski\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Piotr Ryba\u0142towski\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/\",\"url\":\"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/\",\"name\":\"AJAX i JSON w Zend Framework 2\",\"isPartOf\":{\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/#website\"},\"datePublished\":\"2013-05-13T21:17:15+00:00\",\"dateModified\":\"2022-01-18T22:36:41+00:00\",\"author\":{\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/#\/schema\/person\/83a30be3ae1b549124de4ba1aadb7338\"},\"description\":\"Obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. We wpisie postaram si\u0119 przybli\u017cy\u0107 ten temat.\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.piotr.rybaltowski.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programowanie\",\"item\":\"https:\/\/blog.piotr.rybaltowski.pl\/kategoria\/programowanie\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"PHP\",\"item\":\"https:\/\/blog.piotr.rybaltowski.pl\/kategoria\/programowanie\/php\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"AJAX i JSON w Zend Framework 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/#website\",\"url\":\"https:\/\/blog.piotr.rybaltowski.pl\/\",\"name\":\"Piotr Ryba\u0142towski\",\"description\":\"Programista PHP, Symfony\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.piotr.rybaltowski.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/#\/schema\/person\/83a30be3ae1b549124de4ba1aadb7338\",\"name\":\"Piotr Ryba\u0142towski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.piotr.rybaltowski.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a4d8f9da3bba9f9c09eab549d2baa674?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a4d8f9da3bba9f9c09eab549d2baa674?s=96&d=wavatar&r=g\",\"caption\":\"Piotr Ryba\u0142towski\"},\"sameAs\":[\"http:\/\/www.piotr.rybaltowski.pl\/\",\"https:\/\/twitter.com\/prybaltowski\"],\"url\":\"https:\/\/blog.piotr.rybaltowski.pl\/author\/piotr\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AJAX i JSON w Zend Framework 2","description":"Obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. We wpisie postaram si\u0119 przybli\u017cy\u0107 ten temat.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/","og_locale":"pl_PL","og_type":"article","og_title":"AJAX i JSON w Zend Framework 2","og_description":"Obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. We wpisie postaram si\u0119 przybli\u017cy\u0107 ten temat.","og_url":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/","og_site_name":"Piotr Ryba\u0142towski","article_published_time":"2013-05-13T21:17:15+00:00","article_modified_time":"2022-01-18T22:36:41+00:00","og_image":[{"width":190,"height":102,"url":"https:\/\/i0.wp.com\/blog.piotr.rybaltowski.pl\/wp-content\/uploads\/2013\/04\/zf2-logo-mark.png?fit=190%2C102&ssl=1","type":"image\/png"}],"author":"Piotr Ryba\u0142towski","twitter_card":"summary_large_image","twitter_creator":"@prybaltowski","twitter_site":"@prybaltowski","twitter_misc":{"Napisane przez":"Piotr Ryba\u0142towski","Szacowany czas czytania":"5 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/","url":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/","name":"AJAX i JSON w Zend Framework 2","isPartOf":{"@id":"https:\/\/blog.piotr.rybaltowski.pl\/#website"},"datePublished":"2013-05-13T21:17:15+00:00","dateModified":"2022-01-18T22:36:41+00:00","author":{"@id":"https:\/\/blog.piotr.rybaltowski.pl\/#\/schema\/person\/83a30be3ae1b549124de4ba1aadb7338"},"description":"Obs\u0142uga zapyta\u0144 AJAXowych oraz zwracanie odpowiedzi w formacie JSON w Zend Framework 2 nie jest oczywista. We wpisie postaram si\u0119 przybli\u017cy\u0107 ten temat.","breadcrumb":{"@id":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-json-zend-framework-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.piotr.rybaltowski.pl\/"},{"@type":"ListItem","position":2,"name":"Programowanie","item":"https:\/\/blog.piotr.rybaltowski.pl\/kategoria\/programowanie\/"},{"@type":"ListItem","position":3,"name":"PHP","item":"https:\/\/blog.piotr.rybaltowski.pl\/kategoria\/programowanie\/php\/"},{"@type":"ListItem","position":4,"name":"AJAX i JSON w Zend Framework 2"}]},{"@type":"WebSite","@id":"https:\/\/blog.piotr.rybaltowski.pl\/#website","url":"https:\/\/blog.piotr.rybaltowski.pl\/","name":"Piotr Ryba\u0142towski","description":"Programista PHP, Symfony","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.piotr.rybaltowski.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.piotr.rybaltowski.pl\/#\/schema\/person\/83a30be3ae1b549124de4ba1aadb7338","name":"Piotr Ryba\u0142towski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.piotr.rybaltowski.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a4d8f9da3bba9f9c09eab549d2baa674?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a4d8f9da3bba9f9c09eab549d2baa674?s=96&d=wavatar&r=g","caption":"Piotr Ryba\u0142towski"},"sameAs":["http:\/\/www.piotr.rybaltowski.pl\/","https:\/\/twitter.com\/prybaltowski"],"url":"https:\/\/blog.piotr.rybaltowski.pl\/author\/piotr\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blog.piotr.rybaltowski.pl\/wp-content\/uploads\/2013\/04\/zf2-logo-mark.png?fit=190%2C102&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p3k68g-e9","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":234,"url":"https:\/\/blog.piotr.rybaltowski.pl\/ajax-i-json-w-zend-framework\/","url_meta":{"origin":877,"position":0},"title":"AJAX i JSON w Zend Framework","date":"30 marca 2008","format":false,"excerpt":"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 Framework, a tym razem w znacznym stopniu wykorzystuj\u0105cy tzw. AJAX. Jednak zamiast zwraca\u0107 XML wol\u0119 dane dostawa\u0107 jako JSON. Jak to robi\u0119, wykorzystuj\u0105c dobrodziejstwa ZF? Poka\u017c\u0119 na przyk\u0142adzie akcji logowania.\u2026","rel":"","context":"In "JavaScript"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":350,"url":"https:\/\/blog.piotr.rybaltowski.pl\/composer-zarzadzanie-zaleznosciami-w-aplikacji-php\/","url_meta":{"origin":877,"position":1},"title":"Composer – zarz\u0105dzanie zale\u017cno\u015bciami w aplikacji PHP","date":"16 czerwca 2012","format":false,"excerpt":"PHP doczeka\u0142 si\u0119 kolejnego elementu, kt\u00f3ry powoduje, \u017ce korzystanie z niego i budowanie profesjonalnych aplikacji jest przyjemniejsze. Mam na my\u015bli Composer - system zarz\u0105dzania zale\u017cno\u015bciami w aplikacji PHP. U\u0142atwia on instalowanie i zarz\u0105dzanie wersjami bibliotek wykorzystywanych przy budowaniu oprogramowania. W j\u0119zykach takich jak Node.js czy Ruby podobne programy s\u0105 ju\u017c\u2026","rel":"","context":"In "PHP"","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.piotr.rybaltowski.pl\/wp-content\/uploads\/2012\/06\/logo-composer-transparent.png?fit=300%2C356&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":351,"url":"https:\/\/blog.piotr.rybaltowski.pl\/skrypty-konsolowe-w-aplikacji-zf2\/","url_meta":{"origin":877,"position":2},"title":"Skrypty konsolowe w aplikacji ZF2","date":"17 pa\u017adziernika 2012","format":false,"excerpt":"Zend Framework 2 (od niedawna dost\u0119pny w wersji stabilnej) w\u015br\u00f3d licznych nowo\u015bci przyni\u00f3s\u0142 jedn\u0105, kt\u00f3ra bardzo mi si\u0119 podoba i zawsze mi jej brakowa\u0142o. Chodzi o wbudowan\u0105 obs\u0142ug\u0119 skrypt\u00f3w konsolowych. Czyli polece\u0144 w aplikacji, kt\u00f3re z poziomu konsoli mo\u017cna wywo\u0142ywa\u0107. Mog\u0105 to by\u0107 akcje odpalane z crona, zarz\u0105dzanie aplikacj\u0105, w\u0142\u0105czanie\u2026","rel":"","context":"In "PHP"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":344,"url":"https:\/\/blog.piotr.rybaltowski.pl\/ksiazka-zend-framework-od-podstaw-wlodzimierza-gajdy\/","url_meta":{"origin":877,"position":3},"title":"Ksi\u0105\u017cka \u201cZend Framework od podstaw\u201d W\u0142odzimierza Gajdy","date":"5 grudnia 2011","format":false,"excerpt":"Na co dzie\u0144 pracuj\u0119 przy tworzeniu i rozwijaniu aplikacji webowych dzia\u0142aj\u0105cych w oparciu o przegl\u0105dark\u0119 internetow\u0105. Programuj\u0119 przede wszystkim w j\u0119zyku PHP z wykorzystaniem Zend Framework, poniewa\u017c to znacznie przyspiesza pisanie cz\u0119sto powtarzanych element\u00f3w i czynno\u015bci, kt\u00f3re s\u0105 po prostu od razu gotowe do u\u017cycia w postaci odpowiednich klas. Do\u2026","rel":"","context":"In "Ksi\u0105\u017cki"","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.piotr.rybaltowski.pl\/wp-content\/uploads\/2011\/12\/zend-framework-wlodzimierz-gajda.list_.png?fit=200%2C307&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":346,"url":"https:\/\/blog.piotr.rybaltowski.pl\/routery-part-w-zend-framework-2-i-sprawdzanie-nazwy-domeny\/","url_meta":{"origin":877,"position":4},"title":"Routery Part w Zend Framework 2 i sprawdzanie nazwy domeny","date":"21 marca 2012","format":false,"excerpt":"Zend Framework 2 jest ju\u017c w wersji beta 3 i wielkimi krokami zbli\u017ca si\u0119 faza RC i w ko\u0144cu oficjalny release. Mam okazj\u0119 pracowa\u0107 w tym frameworku przy kilku projektach i poznawa\u0107 mniejsze i wi\u0119ksze nowo\u015bci, kt\u00f3re nowe wydanie oferuje programistom. Jedn\u0105 z tych mniejszych, ale bardzo ciekawych zmian jest\u2026","rel":"","context":"In "PHP"","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.piotr.rybaltowski.pl\/wp-content\/uploads\/2012\/03\/zf2-part-router-domain-example-thumb.png?fit=300%2C300&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":339,"url":"https:\/\/blog.piotr.rybaltowski.pl\/modele-i-formularze-zend-framework-automatyzacja-zapisu\/","url_meta":{"origin":877,"position":5},"title":"Modele i formularze Zend Framework – automatyzacja zapisu","date":"21 wrze\u015bnia 2011","format":false,"excerpt":"Na codzie\u0144 pracuj\u0119 w Zend Framework. Praca jest bardzo przyjemna, framework jest fajnie napisany, obiektowo, elastycznie (wiele klas mo\u017cna rozszerzy\u0107, jest wiele miejsc, w kt\u00f3rych domy\u015blne klasy s\u0105 gotowe do uruchomienia naszego kodu, itp.). Ale ma te\u017c wiele wad i brak\u00f3w, kt\u00f3re cz\u0119sto s\u0105 rozwi\u0105zane w innych frameworkach. Tw\u00f3rcy ZF\u2026","rel":"","context":"In "PHP"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/posts\/877"}],"collection":[{"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/comments?post=877"}],"version-history":[{"count":28,"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/posts\/877\/revisions"}],"predecessor-version":[{"id":3561,"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/posts\/877\/revisions\/3561"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/media\/951"}],"wp:attachment":[{"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/media?parent=877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/categories?post=877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.piotr.rybaltowski.pl\/wp-json\/wp\/v2\/tags?post=877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}