Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jQuery $.get wyświetla jeszcze raz layout i akcję kontrolera.
Forum PHP.pl > Forum > XML, AJAX
callwith
Mam taki problem, w prostym frameworku PHP MVC, gdy za pomocą funkcji jQuery w widoku pobieram dane z kontrolera to oprócz tych danych wyświetla się jeszcze raz layout i akcja, problem wynika pewnie z tego że za pomocą URL w rzeczonej funkcji jQuery uruchamiam jeszcze raz tę funkcję krórej wywołanie jest w pliku php inicjujacym działanie frameworku;
  1. public function run($action, $params = array())
  2. {
  3. $this->setParams($params);
  4. $this->_templateName = $action;
  5. $this->setContext('title', ucfirst($this->_getControllerShortName()) . ' - ' . $action);
  6. $methodName = $action . 'Action';
  7. if (method_exists($this, $methodName)) {
  8. $this->$methodName();
  9. extract($this->_context);
  10. // tu jest require dla layout'u, może ktoś wie jak powiedzieć php żeby ponownie nie uruchamiać tego require'a, domyślam się ze trzeba zastosować odpowiednią instrukcję warunkową, ale jak ma wyglądac to niestety nie wiem, dlatego proszę o pomoc
  11. require_once PROJECT_DIRECTORY . DIRECTORY_SEPARATOR . 'views' .
  12. DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR .
  13. $this->_layoutName . '.phtml';
  14. } else {
  15. $controller->run('notfound', $this->getParams());
  16. }
  17. }


może będzie ktoś w stanie mi doradzić jak sobie z tym poradzić;
mortus
Trzeba zastosować instrukcję warunkową, która sprawdzi, czy żądanie jest żądaniem AJAX-owym:
  1. if($this->getRequest()->isXmlHttpRequest()) {
  2. // wyłączamy renderowanie widoku
  3. $this->getHelper('viewRenderer')->setNoRender();
  4. // zwracamy tylko dane, metoda realizacji dowolna, np.
  5. $this->getResponse()->setBody('Hello World!');
  6. } else {
  7. // renderujemy layout i widok
  8. require_once PROJECT_DIRECTORY . DIRECTORY_SEPARATOR . 'views' .
  9. DIRECTORY_SEPARATOR . 'layouts' . DIRECTORY_SEPARATOR .
  10. $this->_layoutName . '.phtml';
  11. }

Metoda isXmlHttpRequest() działa z bibliotekami JS:
- Prototype and Scriptaculous (and libraries derived from Prototype),
- Yahoo! UI Library,
- jQuery,
- MochiKit.
callwith
dzięki mortus, rozjaśniło mi to trochę sprawę , ale ta metoda jest dla Zend Frameworka, a ja się bawię z takim custom framewokiem którego znalazłem w sieci i trochę przebudowałem i rozbudowałem, ale zatrzymałem się własnie w momecie jak chciałem zaimplementować ajaxowe ładowanie danych, mój poblem jest podobny do opisanego tu
mortus
ZF-owa metoda isXmlHttpRequest() to nic innego jak sprawdzenie zawartości superglobalnej tablicy $_SERVER pod kątem obecności odpowiedniego nagłówka. Jeśli ten framework nie implementuje odpowiedniej metody, to w PHP robisz tak:
  1. if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  2. // zwracamy dane w odpowiadającej nam formie i zatrzymujemy działanie skryptu, żeby nie dopytywał się o layout i widok
  3. die();
  4. } else {
  5. // renderujemy layout i widok
  6. }
callwith
mortus jesteś wielki, serdecznie dziękuje za pomoc, o to właśnie chodziło, działa prawidłowo, ten kawałek kodu który mi podsunąłeś:


  1. if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  2. // zwracamy dane w odpowiadającej nam formie i zatrzymujemy działanie skryptu, żeby nie dopytywał się o layout i widok
  3. die();
  4. } else {
  5. // renderujemy layout i widok
  6. }


wystarczyło umieścić w akcji kontrolera wywołującej widok z użyciem ajaxu, na pewno nie tylko mi ale i innym początkującym przyda się ta rada, wielki szacunek dla Ciebie ze jako bardziej zaawansowany programista chciałeś się pochylić na problemami początkującego, cieszę się tym bardziej ze od dłuższego czasu próbowałem sobie z problemem ładowań ajaxowych w php mvc poradzić ale niestety bezskuteczne; tak ze postanowiłem szukać porady na tym forum, dzięki jeszcze raz mortus,
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.