AJAX y Cakephp

71 views
Skip to first unread message

sangar1982

unread,
Oct 7, 2008, 6:48:36 AM10/7/08
to CakePHP en Español
HOla Grupo!

Estoy intentando hacer un ejemplo con AJAX sobre un proyecto que estoy
montando para aprender a usar bien Cake, y me estoy volviendo loco, no
encuentro nada que me ayude a realizar este ejemplo. Sin utilizar Ajax
lo haria sin problemas, pero quiero entender como funciona las
llamadas a través del framework.

MI ejemplo consiste en un blog con posts que puedes votar (para
hacerlo facil sin restricciones y es algo parecido a hacer un meneo en
meneame, haces click y te suma un voto a esa noticia) pero no se como
plantearlo ni como hacerlo.

Cargo en el controlador los helpers de ajax y javascript y tb cargo el
RequestHandler.

La idea es que cuando hagas click, por ejemplo, en el link de votar
del post, sume un voto en la bd para esa noticia y me devuelva el
nuevo numero de votos para mostrarlo.

Si no me equivoco, para hacer esto en la vista debo usar el metodo
$ajax->link y enviarlo a una acción (en mi caso se llama muevelo)
para que haga el update y me devuelva el nuevo registro.

Pero no tengo ni idea de como hacerlo.

A lo maximo que he llegado es esto en la vista:

<?php echo $ajax->link('link1',

array('controller'=>'posts','action'=>'muevelo'),
array('update' =>
'test',

'complete' => 'alert( "Executed OK" )',

'loading'=> 'alert("Loading")',

'loaded'=> 'alert("Loaded")')
); ?>

Parece que hace la peticion (porke me muestra los alerts y me abre una
nueva vista en el div test) pero me da un error ya ke me renderiza en
ese div una vista nueva

En el controlador no se lo que tengo que poner para recoger datos, ya
que no se por ejemplo como envio el id del post que he votado.

Quizas sea un poco lioso, pero es ke no encuentro nada de
documentación al respecto (o ya no se encontrarlo).

La idea general es: modificar un valor de la BD (sumar un voto) y que
me devuelva el nuevo numero de votas todo a través de AJAX

Alguien puede ayudarme con esto, me estoy volviendo loko!! jeje

Muchas gracias Grupo!!

Fran Iglesias

unread,
Oct 7, 2008, 7:24:02 AM10/7/08
to cakep...@googlegroups.com

El 07/10/2008, a las 12:48, sangar1982 escribió:

> En el controlador no se lo que tengo que poner para recoger datos, ya
> que no se por ejemplo como envio el id del post que he votado.


Ponlo al construir el enlace

array(
'controller' => 'posts',

'action' => 'muevelo',
$post_id // Bueno, donde lo tengas claro
)

la acción en el controller...

function muevelo($post_id) {...}

Lo otro no sé, si tienes el RequestHandler, cake debería ocuparse de
no añadir Layout a tu vista.

--
Fran Iglesias
fra...@buabua.com


sangar1982

unread,
Oct 7, 2008, 10:10:53 AM10/7/08
to CakePHP en Español
Gracias por la respuesta!

He avanzado un poco mas y ahora ya consigo augmentar el numero de
votos del post.

El problema ahora es como le paso ahora el nuevo numero de votos que
tiene el post a la vista para actualizarlo, es decir, refrescar el
numero de votos que tiene ahora.

hasta ahora mi funcion del controlador esta asi:

function muevelo($id){
if ($this->RequestHandler->isAjax()) {
$post = $this->Post->findById($id);
if(!empty($post)) {
$this->Post->id = $post['Post']['id'];
$this->Post->saveField('muevelo', $post['Post']
['muevelo'] + 1);
}
$this->autoRender=false;
}
}

He probado mil cosas pero no se como pasarle el nuevo valor y poder
mostrarlo en el siguiente div de mi vista:

<div class='menealo' ">
<br/><span id='menealo_num'><?php echo
$post['Post']['muevelo']; ?></span><br/ >menealo
</div>

Y el link que hace la peticion AJAX:

<?php echo $ajax->link('link1',

array('controller'=>'posts','action'=>'muevelo', $post['Post']
['id']),
array('update' => 'menealo_num'
); ?>

Gracias!
Message has been deleted

Fran Iglesias

unread,
Oct 7, 2008, 10:16:25 AM10/7/08
to cakep...@googlegroups.com
Hola,

El 07/10/2008, a las 16:11, sangar1982 escribió:

> He probado mil cosas pero no se como pasarle el nuevo valor y poder
> mostrarlo en el siguiente div de mi vista:


creo que la solución sería hacer una acción en el controller que te
devuelva el valor y en el ajax link añadir una opción 'complete' que
sea otra llamada ajax (la puedes crear con remoteFunction, creo) que
actualice la div "menealo" al terminar de ejecutar la llamada
principal del link.

No estoy seguro de explicarme.
--
Fran Iglesias
fra...@buabua.com


sangar1982

unread,
Oct 7, 2008, 11:43:39 AM10/7/08
to CakePHP en Español
Ya he encontrado la solucion! y es mas facil de lo que parecia.

Solo con un simple "echo" en el controlador le devuelvo a la vista
los datos que necesito para actualizar. Es decir que si hago esto:

function muevelo($id){
if ($this->RequestHandler->isAjax()) {
$post = $this->Post->findById($id);
if(!empty($post)) {
$this->Post->id = $post['Post']['id'];
$this->Post->saveField('muevelo', $post['Post']
['muevelo'] + 1);
}
$this->autoRender=false;
echo $post['Post']['muevelo'] + 1; -----> es el valor
que obtengo al hacer el update que kiero refrescar en la
pagina
}
}


<?php echo $ajax->link('votame',
array('controller'=>'posts','action'=>'muevelo', $post['Post']
['id'],
array('class'=>'d')),
array('update' => 'menealo_num'') -------------> donde le marco
el div a hacer el update

); ?>

es como si estuviera haciendo #menealo_num.innerhtml = (el echo
dentro del controlador)

Que piensas Fran sobre esto?

Muchas Gracias!

pablo

unread,
Oct 7, 2008, 1:21:24 PM10/7/08
to CakePHP en Español
Hola,

Lo que has hecho está bien y te sirve, pero se te podría dar el caso
en el que el método ajax tubiera que devolver una vista y no una
simple variable (por ejemplo: si se actualizan dos variables y no sólo
una). Para ese caso deberías crear la vista con el nombre de la
acción, en este caso muevelo.ctp y el método muevelo de esta forma:

function muevelo($id) {

if ($this->RequestHandler->isAjax()) {

$post = $this->Post->findById($id);

if(!empty($post)) {
$this->Post->id = $post['Post']['id'];
$this->Post->saveField('muevelo', $post['Post']['muevelo']
+ 1);
}

$this->set('post', $this->Post->read(array('id', 'votos',
'title','created', 'modified')));
// Esto pasa las variables a las vistas como en un controlador/
vista normal
}
}

De esta forma el div se actualizaría no con una variable si no con una
vista. Espero que te sirva.

Saludos.

Fran Iglesias

unread,
Oct 7, 2008, 2:27:48 PM10/7/08
to cakep...@googlegroups.com
Hola,

El 07/10/2008, a las 17:43, sangar1982 escribió:

> Solo con un simple "echo" en el controlador le devuelvo a la vista
> los datos que necesito para actualizar.


mejor es que añadas un $this->set('muevelo', $post['Post']['muevelo']
+ 1); para pasar el dato a la vista y luego lo muestres en la vista
muevelo.ctp (bastaría el simple echo, o si necesitas algo más
elaborado, como ponerle HTML o así). Ya sabes la presentación de datos
va en las vistas.


--
Fran Iglesias
fra...@buabua.com


sangar1982

unread,
Oct 8, 2008, 5:34:03 AM10/8/08
to CakePHP en Español
Hola grupo

Ok, ya lo he probado a través de listas y funciona, y lo más
importante es ke ya entiendo como va.

Muchas gracias a todos por vuestra ayuda!!!
Reply all
Reply to author
Forward
0 new messages