2010-08-25 21 views
5

Soy nuevo en cakePHP pero estoy a punto de dejar de usarlo debido a mi incapacidad para hacer que jQuery trabaje con él.No tuve suerte al intentar usar JQuery con CakePHP 1.3

Estoy usando CakePHP 1.3 y pensé que los helpers Html y Js habían hecho que Javascript y Ajax fueran redundantes, pero realmente no puedo encontrar ninguna documentación de ayuda/api sobre cómo usar Js que sea suficiente.

Todo lo que estoy tratando de hacer ante todo es enviar algunos datos a cakePHP con jQuery y luego recuperar algunos datos en jQuery y alertarlos(). Por alguna razón esto simplemente no está funcionando. Aquí está mi código:

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

Cada vez que haga clic en el botón con class = 'social' tengo la alerta "Wut", que significa error.

Tengo el componente RequestHandler y Javascript, Js y Ajax helpers incluidos en my activities_controller.php.

Además, test.js y jquery.js se vinculan utilizando html-> script(); en default.ctp y todas las demás cosas de jQuery funcionan, así que no es eso.

También tengo esto en mi beforeFilter() para activities_controller.php:

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

Alguna idea de lo que está mal? ¿Es algo de jQuery o algo de CakePHP? ¿O ambos?

Gracias de antemano,

Infinitifizz

P. S.

Nunca he hecho AJAX en jQuery antes, así que tal vez tenga algo que ver con eso que está estropeando, solo he hecho javascript AJAX simple.

+2

Este es uno de esos momentos en los que sería realmente útil tener la depuración activada, específicamente a un nivel de "1" en caso de que haya errores de PHP. Intente habilitar ese nivel para solicitudes ajax y vea si se informa algo en los registros de Cake ('/ app/tmp/logs/*'). –

+0

Intente incluir esto en su método de torta: $ this-> log ('Un mensaje de depuración', LOG_DEBUG); para ver si el método está siendo llamado. Compruebe la salida en app/tmp/logs/debug.log Tenga en cuenta que puede pasar variables, incluso matrices en lugar de la cadena del mensaje. – Leo

+1

Además, usa Firebug en Firefox para monitorear la actividad de la red (en la pestaña de red). – Leo

Respuesta

3

No te rindas con CakePHP. Hay una curva de aprendizaje, pero vale la pena.

Me especificar el URL como esta:

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

En el lado CakePHP, mi método sería así:

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

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

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

nunca uso if($this->RequestHandler->isAjax()) aunque estoy seguro de que algún alma especie me dirá por qué debería hacerlo

Prefiero los nombres de los métodos camelCase en línea con la convención de CakePHP.

Tenga en cuenta que a esta línea en su código: echo json_encode(array('result'=>'hello'); le falta un corchete de cierre.

Además, no usaría jQuery para hacer AJAX simple como este - puede dificultar la depuración, pero eso es solo preferencia personal.

1

Probablemente esto sea oftálmico, pero ...

Lo que hago con el fin de tener raíz de la aplicación en mi javascript:

En el /app/views/layout/default.ctp He siguiente código

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

Su parámetro url se verá como:

url: root+'activities/add_activity', 

esta manera, incluso si la aplicación es en una subcarpeta o en un dominio TLD el guión funcionará correctamente.

Devolver "wut" significa que el script no pudo acceder a la página en su parámetro url. Especialmente si trabaja en un subdirectorio se verá en http://server.com/activities/add_activity. Estoy 99% seguro de que este es el problema :)

Otra sugerencia: Retirar el Ajax, mientras que it was meant to work with Prototype más bien con jQuery

+0

¡Ah! ¡Gracias! Perdón por la respuesta tardía a todos, he estado fuera durante la última semana, pero gracias Nik, al menos estoy llegando por eso. Ahora llama a la función después de que agregué esa línea a default.ctp pero siempre volví a 'wut', así que eso significa que al menos jQuery se está ejecutando pero siempre recibiendo el error ... ¿algún consejo sobre qué hacer a continuación? –

+0

Ah, casi lo olvido, también cambié la función add_activity para usar $ this-> javascript ... como Leo dijo antes, así que tal vez eso también ayudó. –

+0

Ah, acabo de utilizar Firebug y parece que cakephp está enviando un error que parece contener "Advertencia: DbAcl :: check() - Búsqueda de nodo ARO/ACO fallida en la verificación de permisos. Referencias de nodo" y luego muestra la matriz de usuario con el registro de usuarios registrados de la tabla de usuarios. ¡Así que creo que fue un problema de ACL, ahora agregué add_activity() a los permisos de allow() y ahora obtengo éxito de jQuery! Pero ... la alerta (datos) simplemente me da "[object Object]" es esto porque la respuesta no es json? Soy muy nuevo en JSON y solo lo probé porque estaba en un tutorial ... –

3

me gusta el ayudante del Ajax en CakePHP ... es decir, hasta que encontré esto: http://blog.loadsys.com/2009/05/01/cakephp-jquery-ajax-helper-easy-scriptaculous-replacement/

¡Ahora puedo usar llamadas nativas de CakePHP Ajax con jQuery! Mira esto. Pude resolver todos mis problemas ajax "simples" con estos reemplazos de ajax darg-n-drop. ¡Simplemente coloco esto en el directorio de ayuda en mi aplicación y reemplazo el ajax.php que está ahí y viola! jQuery está funcionando. Debe incluir el script jQuery en el diseño, por supuesto. Pruébalo, ¡te encantará CakePHP nuevamente!

2

Le recomendaría que utilice el diseño CakePHP json para mostrar los datos de la vista en lugar de los datos de echo json de su controlador.

Cuestiones relacionadas