2010-08-25 8 views
5

Sono nuovo per cakePHP ma sono vicino a smettere di usarlo a causa della mia incapacità di far funzionare jQuery con esso.Non ho fortuna quando provo ad usare JQuery con CakePHP 1.3

Sto usando cakePHP 1.3 e quindi ho pensato che gli helper Html e Js avessero reso Javascript e Ajax ridondanti, ma non trovo davvero alcuna documentazione di aiuto/api su come usare Js che sia sufficiente.

Tutto quello che sto provando a fare prima di tutto è inviare alcuni dati a cakePHP con jQuery e poi recuperare alcuni dati in jQuery e alert(). Per qualche ragione questo non funziona. Ecco il mio codice:

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; 
    } 
} 

Ogni volta che fa clic sul pulsante con la class = 'sociale' ottengo l'avviso "wut", che significa errore.

Ho il componente RequestHandler e gli helper JavaScript, Js e Ajax inclusi nel mio activity_controller.php.

Inoltre, test.js e jquery.js sono collegati utilizzando html-> script(); in default.ctp e tutte le altre cose di jQuery funzionano, quindi non è così.

Ho anche questo nel mio beforeFilter() per activities_controller.php:

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

Delle idee che cosa è sbagliato? È una cosa jQuery o una cosa cakePHP? O entrambi?

Grazie in anticipo,

Infinitifizz

P.S.

Non ho mai fatto AJAX in jQuery prima, quindi forse è qualcosa a che fare con quello che sta rovinando, ho sempre fatto semplicemente javascript AJAX.

+2

Questo è uno di quei momenti in cui sarebbe davvero utile avere il debug attivato - in particolare a un livello di "1" nel caso in cui vi siano errori PHP. Prova ad abilitare quel livello per le richieste Ajax e vedi se qualcosa è riportato nei tuoi registri di Cake ('/ app/tmp/logs/*'). –

+0

Prova a includere questo nel metodo della torta: $ this-> log ('Un messaggio di debug.', LOG_DEBUG); per vedere se il metodo viene chiamato. Controllare l'output in app/tmp/logs/debug.log Si noti che è possibile passare variabili, anche array al posto della stringa del messaggio. – Leo

+1

Inoltre, utilizzare Firebug in Firefox per monitorare l'attività di rete (nella scheda di rete). – Leo

risposta

3

Non rinunciare a CakePHP. C'è una curva di apprendimento, ma ne vale la pena.

Vorrei specificare l'URL in questo modo:

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

Sul lato CakePHP, il mio metodo sarebbe come questo:

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

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

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

Io non uso mai if($this->RequestHandler->isAjax()) anche se sono sicuro qualche anima gentile mi dirà perché dovrei.

Preferisco camelTestare i nomi dei metodi in linea con la convenzione CakePHP.

Si noti che questa riga nel codice: echo json_encode(array('result'=>'hello'); manca una parentesi di chiusura.

Inoltre, non vorrei usare jQuery per fare AJAX semplice come questo: può rendere difficile il debug, ma è solo una preferenza personale.

1

Questo probabilmente è fuori programma, ma ...

Quello che faccio per avere principale dell'applicazione nel mio javascript:

Nel /app/views/layout/default.ctp ho seguente codice

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

vostro parametro url sarà come:

url: root+'activities/add_activity', 

in questo modo, anche se si app è in una sottocartella o in un dominio TLD lo script funzionerà correttamente.

Restituire "wut" per me significa che lo script non è riuscito a raggiungere la pagina nel parametro url. Soprattutto se lavori in una sottodirectory apparirà in http://server.com/activities/add_activity. Sono sicuro al 99% che questo è il problema :)

Un altro suggerimento: Rimuovere Ajax mentre it was meant to work with Prototype piuttosto con jQuery

+0

Ah! Grazie! Scusa per il ritardo di risposta a tutti, sono stato via per l'ultima settimana, ma grazie Nik ci sto almeno arrivando per questo! Ora chiama la funzione dopo che ho aggiunto quella linea a default.ctp, ma torno sempre 'wut', quindi questo significa che almeno jQuery è in esecuzione ma riceve sempre l'errore ... qualche consiglio su cosa fare dopo? –

+0

Oh, quasi dimenticato, ho anche modificato la funzione add_activity per usare $ this-> javascript ... come ha detto Leo prima, quindi forse è anche utile. –

+0

Ah, ho appena usato firebug e sembra che cakephp stia rinviando un errore che sembra contenere "Warning: DbAcl :: check() - Failed ARO/ACO lookup dei nodi nel controllo delle autorizzazioni. Riferimenti dei nodi" e poi mostra l'array User con il record degli utenti registrati dalla tabella degli utenti. Quindi penso che fosse un problema di ACL, ora ho aggiunto add_activity() alle autorizzazioni allow() e così ora ottengo il successo da jQuery! Ma ... l'avviso (dati) mi dà semplicemente "[oggetto oggetto]" è perché la risposta non è json? Sono molto nuovo a JSON e l'ho provato solo perché era in un tutorial ... –

3

io odio il Helper Ajax in CakePHP ... cioè fino a quando ho trovato questo: http://blog.loadsys.com/2009/05/01/cakephp-jquery-ajax-helper-easy-scriptaculous-replacement/

Ora posso usare le chiamate Ajax di CakePHP nativi con jQuery! Guarda in questo. Sono stato in grado di risolvere tutti i miei "semplici" problemi di ajax con questa sostituzione di helper ajax darg-n-drop. Lo metto nella directory degli aiutanti nella mia app e sostituisco l'ajax.php che è lì e viola! jQuery funziona. È necessario includere lo script jQuery nel layout, naturalmente. Provalo, adorerai ancora CakePHP!

2

Si consiglia di utilizzare il layout di CakePHP json per trasmettere i dati dalla vista anziché i dati di echo json dal controller.

Problemi correlati