Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Symfony2][SF2] Akcja z formatem: ["html", "json", "ajax"]
Forum PHP.pl > Forum > PHP > Frameworki
Fluke
Witam,

Zaznaczę od razu, że od niedawna zacząłem uczyć się Symfony 2. Wcześniej działałem w Zend 1.

Mam małe pytanie odnośnie zautomatyzowania generowania widoku w akcji w zależności od "request`a". Mam 3 przypadki do rozpatrzenia.
1) zwykły request użytkownika. Ładuje się akcja i generuje podstawowy widok który rozszerza jakiś tam "layout.html.twig",
2) ajax`owy request z formatem "json". Oczywiście widok ma się nie generować tylko przesłać dane w postaci JSON.
3) ajax`owy request z formatem "ajax". Najchętniej jakby zwracał widok: "akcja.ajax.twig".

w 1 przypadku mam widok o nazwie: 'akcja.html.twig', który includuje widok 'akcja.ajax.twig' i rozszerza 'layout.html.twig'.

W akcji mam taki oto kod:
  1. //...
  2. if($request->get('_format') === 'html') {
  3. $response = array(
  4. 'result' => $Result,
  5. 'form' => $Form->createView()
  6. );
  7. if($request->isXmlHttpRequest()) {
  8. return $this->render('AccountBundle:Auth:login.ajax.twig', $response);
  9. } else {
  10. return $response;
  11. }
  12. } else {
  13. return new Response(json_encode(array(
  14. 'result' => $Result
  15. )));
  16. }


I teraz w każdej akcji muszę mniej więcej robić podobne kroki jeśli chcę wykonywać 3 różne przypadki. W Zend 1 było to bardziej zautomatyzowane. W metodzie Zend_Controller_Action::init() mogłem uruchomić helper`a o nazwie 'AjaxContext', w którym podawałem różne formaty a w akcji mogłem tylko zwrócić zwykłego array`a. W przypadku formatu JSON nie musiałem używać funkcji json_encode() - automatycznie helper ją stosował. A w przypadku formatu 'ajax' automatycznie szukał layout`u o nazwie 'akcja.ajax.twig'

Czy w Symfony 2 istnieje podobna rzecz jak w Zend 2. Czy może jakiś inny sposób, który redukuje ilość kodu w części gdzie mamy zwracać response.

Z góry dzięki za wszelkie sugestie,
Pozdrawiam
skowron-line
Nie musisz uzywac json_encode SF posiada klase ResponseJSON do ktorej przekazujesz tablice
Jezeli chcesz tylko przekazac dane do widoku to w twigu mozesz sobie sprawdzic rodzaj requesta i zaincludowac odpowiedni widok
  1. app.request.xmlHttpRequest
  2. ? '::ajax.html.twig'
  3. : '::full.html.twig'


czyli mialbys widok page.html.twig a w nim includa ktory sprawdza i laduje odpowiedni plik i to wsio.

Nie jest to moze taka automatyzacja o jakiej ty piszesz ale jest to sposob aby kontrolery Ci nie puchly.
Fluke
Czyli w kontrolerze mogę mniej więcej zrobić taki 'response`:
  1. //....
  2. if($request->get('_format') === 'json') {
  3. return new JsonResponse(array(
  4. 'account' => $Account
  5. ));
  6. } else {
  7. return array(
  8. 'account' => $Account
  9. );
  10. }


a w szablonie:
  1. {% extends app.request.xmlHttpRequest ? '::ajax.layout.html.twig' : '::simple.layout.html.twig' %}


Dobrze zrozumiałem ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.