2010-08-25 14 views
5

Jestem nowy w CakePHP, ale jestem blisko rezygnacji z używania go z powodu mojej niezdolności do pracy z jQuery.Nie powodzenia, gdy próbuję użyć JQuery z CakePHP 1.3

Używam CakePHP 1.3 i tak myślę, że pomocnicy Html i Js sprawili, że Javascript i Ajax są zbyteczne, ale nie mogę znaleźć żadnej dokumentacji pomocy/api, jak używać Js, która jest wystarczająca.

Wszystko, co próbuję zrobić przede wszystkim, to wysłać trochę danych do CakePHP z jQuery, a następnie pobrać trochę danych z powrotem do jQuery i alert() to. Z jakiegoś powodu to po prostu nie działa. Tu jest mój kodu:

test.js

$('.social').click(function() 
{ 
    $.ajax({ 
     type: 'POST', 
     url: '/activities/add_activity', 
     data: 'type=social', 
     dataType: 'json', 
     success: function(data) 
     { 
      alert(data); 
     }, 
     error: function() 
     { 
      alert('wut'); 
     } 
    }); 
}); 

activities_controller.php

function add_activity() 
{ 
    if($this->RequestHandler->isAjax()) 
    { 
     $this->autoRender = false; 
     $this->autoLayout = false; 

     $this->header('Content-Type: application/json'); 

     echo json_encode(array('result'=>'hello'); 
     return; 
    } 
} 

każdym razem, kiedy kliknij przycisk z class = 'społeczny' pojawia się alert "PW", co oznacza, błąd.

Mam komponent RequestHandler oraz pomocników JavaScript, Js i Ajax zawartych w moim actions_controller.php.

Ponadto, test.js i jquery.js są połączone za pomocą html-> script(); w default.ctp i wszystkie inne rzeczy jQuery działają, więc to nie to.

Mam również w moim beforeFilter() dla activities_controller.php:

if($this->RequestHandler->isAjax()) 
{ 
    Configure::write('debug',0); 
} 
parent::beforeFilter(); 

Jakieś pomysły co jest nie tak? Czy jest to rzecz jQuery, czy ciastko? Lub oba?

Dzięki z góry,

Infinitifizz

PS:

Nigdy wcześniej nie robiłem AJAX w jQuery, więc może to ma coś wspólnego z tym, co się zepsuło, robiłem tylko proste AJAX javascript.

+2

Jest to jeden z tych przypadków, kiedy byłoby naprawdę pomocne włączanie debugowania - szczególnie do poziomu "1" na wypadek błędów PHP. Spróbuj włączyć ten poziom dla żądań ajax i zobacz, czy cokolwiek jest zgłaszane w twoich logach Cake'a ('/ app/tmp/logs/*'). –

+0

Spróbuj dodać to do swojej metody: $ this-> log ("Komunikat do debugowania.", LOG_DEBUG); aby sprawdzić, czy wywoływana jest metoda. Sprawdź dane wyjściowe w aplikacji/tmp/logs/debug.log Pamiętaj, że możesz przekazywać zmienne - nawet tablice zamiast ciągu wiadomości. – Leo

+1

Używaj Firebuga w Firefoksie do monitorowania aktywności sieci (na zakładce net). – Leo

Odpowiedz

3

Nie poddawaj się CakePHP. Istnieje krzywa uczenia się, ale warto.

chciałbym podać url tak:

<?php $Url = Router::url(array('controller'=>'activities','action'=>'addActivity'),true); ?> 
$('.social').click(function() 
{ 
    $.ajax({ 
     type: 'POST', 
     url: '<?php echo $Url ?>'; 
     ... 

po stronie CakePHP, moja metoda byłaby tak:

function addActivity() 
{ 
    $this->autoRender = false; 
    $this->autoLayout = false; 

    App::import('Helper', 'Javascript'); 
    $javascript = new JavascriptHelper(); 

    echo($javascript->object(array('result'=>'hello'))); 
    exit(1); 
} 

nigdy używać if($this->RequestHandler->isAjax()) chociaż jestem pewien, że jakaś dusza powie mi, dlaczego powinienem.

Preferuję nazwy metod camelCase zgodnie z konwencją CakePHP.

Należy zauważyć, że w tym wierszu kodu: echo json_encode(array('result'=>'hello'); brakuje nawiasu zamykającego.

Ponadto, nie używałbym jQuery do robienia prostych AJAX w ten sposób - może to utrudnić debugowanie, ale to tylko osobiste preferencje.

1

To prawdopodobnie jest offtopic, ale ...

Co mam zrobić aby mieć korzeń aplikacji w moim javascript:

W /app/views/layout/default.ctp Mam następujący kod

<?php 
echo $javascript->codeBlock("var root = '".$html->url('/')."';"); 
?> 

Twój parametr url będzie wyglądać na przykład:

url: root+'activities/add_activity', 

w ten sposób, nawet jeśli aplikacja znajduje się w podfolderze lub w domenie tld, skrypt będzie działał poprawnie.

Powrót "wut" oznacza dla mnie, że skrypt nie może osiągnąć strony w parametrze url. Szczególnie jeśli pracujesz w podkatalogu, będzie on wyglądał w http://server.com/activities/add_activity. Jestem 99% pewien, że to jest problem :)

Kolejna propozycja: Usuń Ajax podczas it was meant to work with Prototype raczej z jQuery

+0

Ah! Dzięki! Przepraszam za późną odpowiedź wszystkim, nie było mnie przez ostatni tydzień, ale dziękuję Nikowi, że przynajmniej dostałem się z tego powodu! Teraz wywołuje funkcję po dodaniu tej linii do default.ctp, ale zawsze otrzymuję "wut", więc oznacza to, że przynajmniej jQuery jest uruchomiony, ale zawsze otrzymuję błąd ... jakieś wskazówki, co dalej? –

+0

Och, prawie zapomniałem, zmieniłem też funkcję add_activity, aby użyć $ this-> javascript ... tak jak wcześniej powiedział Leo, więc może to też pomogło. –

+0

Ah, właśnie użyłem firebug i wygląda na to, że cakephp wysyła błąd, który wydaje się zawierać "Ostrzeżenie: DbAcl :: check() - Nieudane sprawdzanie węzłów ARO/ACO w sprawdzeniu uprawnień." Węzły odniesienia węzła ", a następnie pokazuje tablicę użytkowników z zalogowanym rejestrem użytkowników z tabeli użytkowników. Więc myślę, że to był problem z listą ACL, dodałem teraz add_activity() do uprawnień allow(), więc teraz otrzymuję sukces z powrotem z jQuery! Ale ... alert (dane) po prostu daje mi "[obiekt obiektu]" to dlatego, że odpowiedź nie jest json? Jestem bardzo nowy w JSON i próbowałem go tylko dlatego, że był w samouczku ... –

3

Nienawidzę Helper Ajax w CakePHP ... to aż znalazłem to: http://blog.loadsys.com/2009/05/01/cakephp-jquery-ajax-helper-easy-scriptaculous-replacement/

Teraz mogę używać macierzystych wywołań Ajax CakePHP z jQuery! Spójrz na to. Byłem w stanie rozwiązać wszystkie moje "proste" problemy z ajaxem z tymi zastąpieniami pomocników ajaxów darg-n-drop. Po prostu upuszczam to do katalogu pomocy w mojej aplikacji i zastępuję ajax.php, który tam jest i viola! jQuery działa. Musisz oczywiście uwzględnić skrypt jQuery w układzie. Spróbuj, pokochasz CakePHP ponownie!

2

Polecam użyć układu json CakePHP do wyprowadzania danych z widoku zamiast danych echo echa z kontrolera.

Powiązane problemy