Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ZEND + AJAX
Forum PHP.pl > Forum > PHP
raval
Witam,

Mam problem z ajax'em w ZF. Przy odświeżeniu strony otrzymuje następujący błąd:

  1. POST <a href="http://127.0.0.1/my_app/ajax/main_contact" target="_blank">http://127.0.0.1/my_app/ajax/main_contact</a> 404 Not Found 2.45s


poniżej kod:

Akcja ajax:

  1. public function ajaxAction(){
  2. try{
  3.  
  4. if ($this->getRequest()->isXmlHttpRequest())
  5. {
  6. switch($this->_getParam('param1'))
  7. {
  8. case 'main_contact': $contacts = new $this->_db_table_contact;
  9. $getContacts = $contacts->getContacts($this->getRequest()->getPost('category_id'));
  10. $jsonObjectWithExpression = Zend_Json::encode(array("post_content" => $getContacts->post_content));
  11. echo $jsonObjectWithExpression;
  12.  
  13. break;
  14. }
  15.  
  16. } else {
  17. throw new Exception ("Invalid action. Not post");
  18. }
  19. } catch (Exception $e) {
  20. echo $e->getMessage();
  21. }
  22.  
  23. }


js:

  1. $.ajax({
  2. type: "POST",
  3. url: "<?php echo $this->baseUrl; ?>/ajax/main_contact",
  4. data: "category_id=" + cat,
  5. dataType: "json",
  6.  
  7. success: function(data){
  8. $('div.pl-contacts').html(data.post_content);
  9. },
  10. error: function(data){
  11. alert( "Wystąpił błąd: \n" + data.post_content );
  12. }
  13. });


Już męcze się z tym drugi dzień i nie wiem co może być tego przyczyną.
Uprzejmie prosze o pomoc.
CuteOne
1. Akcja main_contact nie istnieje
2. Widok dla tej akcji nie istnieje

Odpal http://127.0.0.1/my_app/ajax/main_contact z adresu przeglądarki i sam sprawdź
raval
Cytat(CuteOne @ 16.11.2012, 14:29:34 ) *
1. Akcja main_contact nie istnieje
2. Widok dla tej akcji nie istnieje

Odpal http://127.0.0.1/my_app/ajax/main_contact z adresu przeglądarki i sam sprawdź


main_contact to parametr akcji ajax:

  1.  
  2. resources.router.routes.ajax.route = "ajax/:param1"
  3. resources.router.routes.ajax.defaults.controller = "index"
  4. resources.router.routes.ajax.defaults.action = "ajax"
  5. resources.router.routes.ajax.defaults.param1 = 0
  6. resources.router.routes.ajax.reqs.param1 = "\w+"


Akcja i widok 'ajax' jak najbardziej istnieje. Dane są prawidłowo przetwarzane, oraz są zwracane Json'em (podgląd w firebug):

  1. {"post_content":"<table style=\"width: 530px;\" border=\"0\" align=\"left\">\r\n<tbody>\r\n<tr id=\"main_contact_table\">\r\n<td id=\"row\"><span style=\"font-size: 10px;\">......<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>"}


Stąd nie rozumiem problemu.
cudny
W takim wypadku my_app jest kontrolerem - nie używaj "_" ani w akcjach ani w kontrolerach, znak jest zarezerwowany dla path separator.
Spróbuj dać myappController, problem powinien zniknąć
raval
my_app to nic innego jak folder w którym znajduje sie projekt. Kontroler nazywa się index i ustawiony tak , aby nie był wyświetlany w odnośniku.
cudny
A baseUrl masz ustawiony na my_app ?
raval
Myślę, że definiowanie zmiennej w index.php robi swoje:

  1. defined('APPLICATION_PATH')|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));


Odpowiedź jest, że mam. Nigdy wcześniej nie bawiłem się ajaxem w projektach ZF, może trzeba jakoś ustawić jeszcze callback? :X
cudny
Ajax do zenda nic nie ma.
Zobacz czy masz w bootstrap ustawione setBaseUrl('my_app');
raval
Witam po weekendzie.

Cytat(cudny @ 17.11.2012, 16:41:52 ) *
Ajax do zenda nic nie ma.
Zobacz czy masz w bootstrap ustawione setBaseUrl('my_app');


Niestety nie dało to żadnego rezultatu.

Zauważyłem w firebugu, że w nagłówku żądania pozycja Referer jest ustawiona na: http://127.0.0.1/my_app/ , a nie jak chyba być powinno: http://127.0.0.1/my_app/ajax/main_contact



Czyżby w tym tkwił problem questionmark.gif Jeżeli tak, to jak go ustawic poprawnie ?
cudny
Raval, nie jestem w stanie zdebugować twojego kodu, musisz to zrobić sam.
W kontrolerze do którego się odnosisz w init daj, nie wiem...
  1. echo 'exists'; die;
to na początek, zobacz czy wchodzi w ogóle w kontroller.
Zobacz co ci wyświetla
  1. console.log("<?php echo $this->baseUrl; ?>/ajax/main_contact")
i takie tam.
Wtedy będziesz wiedział w czym jest błąd. Trzeba debugować, debugować debugować
raval
Tak jest.. uczono mie po wsze czasy, aby debugować, debugować i debugować.. tak też i robie, bynajmniej staram się wink.gif
Dlatego co uznam za odkryte przeze mnie, staram się tutaj przedstawić i zapytać, czy ide w dobrym kierunku.

Jeżeli chodzi o sama stronę, to kontlolery i akcje działaja bez zarzutów. Problem pojawił mi sie jedynie przy wykorzystaniu ajaxa, wiem, że nie ma on nic wspolnego z ZF, aczkolwiek odnosze wrażenie jakby przy jego wywołaniu "gubił" (jeżeli mogę to tak nazwac) adres powrotny :X Stąd jestem już cały zielony i nie wiem co robie źle, albo czego jeszcze nie zrobiłem :X

  1. console.log("<?php echo $this->baseUrl; ?>/ajax/main_contact")


wyświetla: /my_app/ajax/main_contact

  1. echo 'exists'; die;


wykonuje sie praiwdłowo, czyli samo exists.
cudny
Rozumiem, że exists widzisz w konsoli ? Bo coś mi się nie wydaje tongue.gif
url dla ajaxa powinien raczej wyglądać: my_app/ajax/main_contact a nie /my_app/ajax/main_contact

Ja baseUrl zawsze sobie ustawiam w jakiejś klasie javascript i potem się do tego odnoszę, aby nie walić zawsze <?php echo $this->baseUrl; ?>.
Moja rada, daj sobie gdzieś na początku var baseUrl = '<?php echo $this->baseUrl.'/'; ?>'; Powinno zadziałać smile.gif

Z tym że możesz jeszcze dać trim($this->baseUrl,'/');
raval
Zdaje się, że rozwiązałem problem. Tak jak myślałem, wszystko zależało od prawidłowej implementacji w ZF.
Poniżej zamieszczam fragment kodu, jaki powinien znajdowac się w Akcji AJAX.

  1. $this->getResponse()
  2. ->setHttpResponseCode(200)
  3. ->setBody($jsonObjectWithExpression)
  4. ->setHeader('Content-Type', 'text/json');


Dzięki wszystkim za pomoc i pozdrawiam wink.gif

PS.
Cytat(cudny @ 19.11.2012, 10:41:04 ) *
Rozumiem, że exists widzisz w konsoli ? Bo coś mi się nie wydaje tongue.gif


Broń Panie w żadnej konsoli tongue.gif
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.