Cakephp ajax start voting. Sistema de votaciones en ajax mediante estrellas

Hace mucho tiempo que he implementado en un site en cakephp, un sistema de votaciones con estrellas que funciona con ajax.

Fue bastante complejo y me llevó un tiempo, ahora lo retomo para publicarlo y compartirlo. Inicialmente seguí las indicaciones de un articulo publicado en bakery.cakephp.org que al final se puede ver la fuente original.

El sistema de votos por estrellas es ya muy conocido y lo tienen integrados muchos sites, pero meterlo en cakephp es un poco mas “laberíntico” porque hay muchos archivos que interfieren y en muchas capas de la lógica.

A continuación indico los pasos que he seguido

1 )
Lo primero descargar el plugin. Tener en cuenta la versión de Cakephp que uséis. Aquí indico las dos versiones disponibles hasta el momento.

[download id=”11″ format=”4″ autop=”false”]

[download id=”10″ format=”4″ autop=”false”]

2)
Extraer el plugin, incluir la carpeta rating en la carpeta de plugins en app/plugins

3)
Copiar el archivo rating/config/plugin_rating.php a tu carpeta app en app/config/plugin_rating.php

En este archivo se pueden especificar muchos detalles de configuración

Si se quiere habilitar para que usuarios anónimos no logeaos puedan usar el sistema para votar habrá que tener la siguiente activa a true

$config['Rating.guest'] = true;

Otro punto interesante de la configuración del plugins es poder guardar los resultados de cada voto en su modelo (tabla) correspondiente. Para ello tener en cuenta las siguientes variables.

$config['Rating.saveToModel'] = true;
$config['Rating.modelAverageField'] = 'votos_media';
$config['Rating.modelVotesField'] = 'votos';

Vienen bien explicadas en el archivo, así como las sqls que habría que ejecutar para crear los campos necesarios en cada tabla. Pero serían así

ALTER TABLE [TABLA] ADD (votos_media decimal(3,1) unsigned default '0.0');
ALTER TABLE [TABLA] ADD (votos int(11) unsigned default '0');

Si esto diera algún problema, recordar borrar la cache de los modelos  en  app/tmp/cache/models.

4)
Ejecutar las consultas que hay en el archivo install.sql para crear la tabla de ratings donde se guardarán todos los votos.

CREATE TABLE `ratings` (
 `id` int(11) unsigned NOT NULL auto_increment,
 `user_id` char(36) NOT NULL default '',
 `model_id` char(36) NOT NULL default '',
 `model` varchar(100) NOT NULL default '',
 `rating` tinyint(2) unsigned NOT NULL default '0',
 `name` varchar(100) default '',
 `created` datetime default NULL,
 `modified` datetime default NULL,
 PRIMARY KEY (`id`),
 KEY `rating` (`model_id`,`model`,`rating`,`name`)
);

5)
Cargar los archivos javascript y css del plugin en el layout o directamente en una vista. Reemplazar [your_framework] por prototype_min o jquery_min dependiendo del framework javascript que useis.
Personalmente yo he usado y me gusta mucho mas jquery.

<?php
 echo $javascript->link('/rating/js/rating_jquery_min');
 echo $html->css('/rating/css/rating');
?>

6)
Agregar el elemento rating en la vista de la siguiente manera. Reemplazar [name_of_your_model] y [id_of_your_model] por vuestros valores

<?php
echo $this->element('rating', array('plugin' => 'rating',
 'model' => '[name_of_your_model]',
 'id' => [id_of_your_model]));
?>

Un ejemplo real podría ser el siguiente:

<?php 
echo $this->element('rating', array('plugin' => 'rating',
'model' => 'Articulo',
'id' => $articulo_ficha['Articulo']['id'])); 
?>

Puediera ser que os de errores. Yo tuve que poner el archivo /rating/model/rating.php en mi aplicación app/models/rating.php
También comenté todo el sistema que tiene de validación de campos.

<?php
/**
 * Model for the AJAX star rating plugin.
 *
 * @author Michael Schneidt <michael.schneidt@arcor.de>
 * @copyright Copyright 2009, Michael Schneidt
 * @license http://www.opensource.org/licenses/mit-license.php
 * @link http://bakery.cakephp.org/articles/view/ajax-star-rating-plugin-1
 * @version 2.3
 */
class Rating extends RatingAppModel {
  var $name = 'Rating';
  /*
  var $validate = array('user_id' => array('rule' => array('maxLength' => 36),
                                           'required' => true),
                        'model_id' => array('rule' => array('maxLength' => 36),
                                            'required' => true),
                        'model' => array('rule' => 'alphaNumeric',
                                         'required' => true));
*/
}
?>

Espero que os funcione a la primera! 😉

Fuente original: http://bakery.cakephp.org/articles/schneimi/2010/08/19/ajax-star-rating-plugin-1

Una respuesta a “Cakephp ajax start voting. Sistema de votaciones en ajax mediante estrellas”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *