Autor wpisu: batman, dodany: 02.06.2010 20:21, tagi: zend_framework
Spośród wszystkich popełnionych przeze mnie wpisów na temat Zend Framework, kilka w jakiś sposób nawiązywało do ajaxa. Nie opisałem jednak sposobu w jaki ZF pozwala obsługiwać requesty ajaxowe.
AjaxContext podobnie z resztą jak ContextSwitch, który jest jego bardziej ogólną wersją, umożliwia obsłużenie w jednej akcji różnych żądań i w zależności od kontekstu takiego żądania, zwraca dane w odpowiednim formacie. Typ żądania można rozpoznać po wartości zmiennej format, przesłanej w adresie. Zazwyczaj zmienna ta odpowiada typowi danych jaki chcemy zwrócić. Jedną z wielu zalet korzystania z AjaxContext jest to, że w razie wywołania akcji z parametrem format wskazującym na ajaxowy kontekst nie poprzez ajax (np bezpośrednie wpisanie adresu do przeglądarki), wówczas kontekst nie zostanie użyty, a do renderowania widoku użyty zostanie standardowy widok.
Skoro już przy widokach jesteśmy, to należy wiedzieć, że każdy kontekst posiada swój własny plik widoku z odpowiednim prefixem, który dodawany jest przed rozszerzeniem pliku. W przypadku AjaxContext jest to .ajax. Wówczas w katalogu scripts znajdą się dwa pliki widoku, jeden o nazwie np index.phtml i drugi index.ajax.phtml. Funkcjonalność AjaxContext nie jest dostępna od razu dla każdej akcji. Sami musimy wskazać, która akcja z niej korzysta. Najlepiej zrobić to w metodzie init klasy kontrolera.
public function init() { $ajaxContext = $this->_helper->getHelper('AjaxContext'); $ajaxContext->addActionContext('index', 'html') ->initContext(); }
Teraz wykonując request ajaxowy, wystarczy, że w adresie podany zostanie parametr format o wartości html. Poniżej kod jQuery
$.ajax({ url: "/index/index/format/html", type: "POST", data: "zmienna1=wartosc1&zmienna2=wartosc2", success: function(html) { $("#ajax-content").append(html); } });
W ten oto prosty sposób można stworzyć dwa różne skrypty widoku dla jednej akcji, wyświetlane w zależności od tego, czy mamy do czynienia z ajaxem, czy nie. Co ciekawe, w przypadku requestu ajaxowego, automatycznie wyłączany jest layout.
To jeszcze nie wszystko. Zmienna przypisana do widoku jest widoczna zarówno w skrypcie “normalnym” jak i ajaxowym. Co więcej, można wykryć, czy mamy do czynienia z ajaxem i zmodyfikować zawartość niektórych zmiennych, dodać nowe lub usunąć już istniejące.
public function indexAction() { $this->view->jakasZmienna = 'zawartosc zmiennej'; if($this->_request->isXmlHttpRequest()) { $this->view->jakasZmienna = 'zawartosc tylko w ajax'; } }
Na pewno część z was zastanawia się do czego może się przydać taka funkcjonalność. Najlepszym przykładem będzie paginacja i sortowanie danych w tabeli. Kolumna, po której dane mają być sortowane oraz numer strony do wyświetlenia, przechodzą przez ten sam kod w tej samej akcji, dzięki czemu nie trzeba pisać dwóch identycznych skryptów. Ponadto jeśli okaże się, że z jakiegoś powodu nie działa javascript, strona po prostu się odświeży, poprawne wyświetlając dane.
Więcej informacji na temat AjaxContext możecie znaleźć w manualu. Polecam również zajrzeć do działu poświęconego ContextSwitch.
Przykładową aplikację znajdziecie w repozytorium.