Foros del Web » Programando para Internet » PHP »

consejo para star rating?

Estas en el tema de consejo para star rating? en el foro de PHP en Foros del Web. Hola me gustaria utilizar una valoracion por estrellas en mi pagina, y me gustaria si conoceis algun, normalita, ya que no estoy acostumbrado a trabajar ...
  #1 (permalink)  
Antiguo 23/02/2014, 11:49
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 10 años, 6 meses
Puntos: 1
consejo para star rating?

Hola me gustaria utilizar una valoracion por estrellas en mi pagina, y me gustaria si conoceis algun, normalita, ya que no estoy acostumbrado a trabajar cono ajax, o si no es una clase ya creada, como la hicisteis vosotros?
un saludo!
  #2 (permalink)  
Antiguo 23/02/2014, 13:42
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: consejo para star rating?

Hola, hay muchas en la web, si lo buscases en google verias montones de opciones.

No obstante, si quieres algo bien simple podrias usar algo como esto:

Código HTML:
Ver original
  1. <!-- Pagina a calificar -->
  2. <form action="rating.php" method="post">
  3. <input type="hidden" name="id_page" value="IDENTIFICADOR_PAGINA_A_VALORAR">
  4. <input type="number" name="calificacion">
  5. <input type="submit" value="Calificar!">
  6. </form>

Código PHP:
Ver original
  1. // rating.php
  2. if($_POST['id_page'] && $_POST['calificacion'])
  3. {
  4.      $sql = 'INSERT INTO calificaciones VALUES(NULL, NOW(), '.intval($_POST['id_page']).', '.intval($_POST['calificacion']).' );';
  5.      // Ejecutar el sql con lo que sea que estes usando en tu web.
  6.      ....
  7.      // Enviar algo de agradecimiento
  8.      ....
  9. } else
  10. {
  11.  // Error. No hay datos suficientes.
  12.  ....
  13. }

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `calificaciones` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `fecha` datetime NOT NULL,
  4.   `id_page` int(11) NOT NULL,
  5.   `calificacion` tinyint(4) NOT NULL,
  6.   PRIMARY KEY (`id`)

Como veras, no existe ninguna dificultad en un modulo de rating.
Podrias cambiar el input number por un grupo de radio options.
Podrias ocultar esos radio options y agregar labels con forma de estrellitas.
Podrias capturar el evento onsubmit del formulario y realizar con ajax el proceso.
O podrias no hacer nada de eso, y aun asi funcionaria.

Puedes obtener cualquier info de las calificaciones con simples y elementales SQL, usando la funciones:

COUNT() -> Cantidad de calificaciones.
AVG() -> Promedio de calificaciones
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 23/02/2014, 13:54
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: consejo para star rating?

O si l prefieres como una clase
Código PHP:
Ver original
  1. <?php
  2. class rating_page
  3. {
  4.     public id_calificacion;
  5.     public id_page;
  6.     public rating;
  7.    
  8.     public function reset()
  9.     {
  10.         $this->id_calificacion = 0;
  11.         $this->id_page = 0;
  12.         $this->rating = 0;
  13.     }
  14.    
  15.     public function printForm()
  16.     {
  17.         echo('
  18.         <!-- Pagina a calificar -->
  19.         <form action="rating.php" method="post">
  20.         <input type="hidden" name="id_calificacion" value="'.$this->id_calificacion.'">
  21.         <input type="hidden" name="id_page" value="'.$this->id_page.'">
  22.         <input type="number" name="calificacion" value="'.$this->rating.'">
  23.         <input type="submit" value="Calificar!">
  24.         </form>');
  25.     }
  26.    
  27.     public function save()
  28.     {
  29.         if($this->id_calificacion)
  30.             $sql = 'UPDATE calificaciones SET fecha=NOW(), id_page='.intval($_POST['id_page']).', calificacion='.intval($_POST['calificacion']).' WHERE id='.intval($this->id_calificacion).';';
  31.         else
  32.             $sql = 'INSERT INTO calificaciones VALUES(NULL, NOW(), '.intval($_POST['id_page']).', '.intval($_POST['calificacion']).' );';
  33.        
  34.         // Ejecutar
  35.         ...
  36.     }
  37.    
  38.     public function load()
  39.     {
  40.         // Hacer el select por id y cargar las propiedades
  41.     }
  42.    
  43.     public function countRating()
  44.     {
  45.         // Hacer un count por id_page y retornar el resultado
  46.     }
  47.    
  48.     public function avgRating()
  49.     {
  50.         // Hacer un avg por id_page y retornar el resultado
  51.     }
  52. }
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 25/02/2014, 08:41
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 10 años, 6 meses
Puntos: 1
Respuesta: consejo para star rating?

no hay ninguna clase o codigo ya resuelto que me valga, he probado muchos y aun asi acomplandolos no me valen
  #5 (permalink)  
Antiguo 25/02/2014, 10:59
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: consejo para star rating?

Cita:
no hay ninguna clase o codigo ya resuelto que me valga, he probado muchos y aun asi acomplandolos no me valen
El codigo que te puse no esta resuelto, es simplemente la estructura, si es verdad que has visto muchos no te costara adaptarlo, son solo 50 lineas.

Por otro lado, si a la clase que escribi, le incorporas una propiedad mas, te puede servir para calificar cualquier cosa, la web, una pagina, una imagen, una publicacion, un usuario, una seccion, un color, una encuesta, lo que se te antoje.

El codigo completo final de una clase asi, dudo que sobrepase las 100 lineas. No usa ajax pero incorporarlo luego no seran mas que unas pocas lineas js (ni hablar si usas jquery u otro fw).. Vamos que no es tan dificil...
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 25/02/2014, 11:11
 
Fecha de Ingreso: febrero-2014
Ubicación: Murcia
Mensajes: 119
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: consejo para star rating?

Crea en la BD

id | rating_id | rating_num | IP

y donde vayas a poner las estrellitas:

Código PHP:
<?php
//Query que retorna el numero de votos para un producto o servicio
$query_num_ratings =  mysql_query("SELECT COUNT(*) as num FROM services_rating WHERE rating_id=".$row_services['service_id'], $conexion);
//Numero de votos de un producto o registro
$num_ratings mysql_result($query_num_ratings0"num");

//Query que retorna la suma, el total de votos de un producto o servicio
$query_sum_ratings =  mysql_query("SELECT SUM(rating_num) as sum FROM services_rating WHERE rating_id=".$row_services['service_id'], $conexion);

//Si los votos son positivos
if(mysql_result($query_sum_ratings0"sum") > 0)
   
//Guardamos la suma
   
$sum_ratings mysql_result($query_sum_ratings0"sum");
else
   
//La suma vale 0
   
$sum_ratings 0;

$rating 0;    

//Si la suma de votos es mayor que 0
if ($num_ratings 0) {
   
//Calculamos el número de estrellas a pintar
   
$rating round($sum_ratings $num_ratings);
}
?>

<div id="rating<?=$row_services['service_id']?>" data="<?=$row_services['service_id']?>">
   <?php
   
//Por cada estrella
   
for ($i=1$i<=5$i++) {
      
//Si toca pintarla de verde
      
if ($i <= $rating)
         
//Mostramos estrella verde
         
echo '<div id="rating'.$row_services['service_id'].'_'.$i.'" data='.$i.'>&nbsp;</div>';
      else
         
//Mostramos estrella gris
         
echo '<div id="rating'.$row_services['service_id'].'_'.$i.'" data='.$i.'>&nbsp;</div>';
   }
   
?>

   <div id="sumrating" data="<?=$sum_ratings?>" style="display:none">&nbsp;</div>
   <div id="numrating" data="<?=$num_ratings?>" style="display:none">&nbsp;</div>
   <div id="actual" data="<?=$rating?>" style="display:none;">&nbsp;</div>
   <div class="ok" style="display:none;">&nbsp;</div>
</div>
y ya en el head

Código HTML:
<script type="text/javascript">
$(document).ready(function() {
    $('.estrella').click(function(){

        var parent = $(this).parent().attr('id');
        var service = $(this).parent().attr('data');
        var rating = $(this).attr('data');

        var dataString = 'id='+service+'&rating='+rating;

        $.ajax({
            type: "POST",
            url: "includes/addvote.php",
            data: dataString,
            success: function() {        
                var new_sum_rating = parseInt($('#'+parent+' #sumrating').attr('data')) + parseInt(rating);
                var new_num_rating = parseInt($('#'+parent+' #numrating').attr('data')) + 1;
                var new_rating = Math.round(new_sum_rating / new_num_rating);

                for(i=1;i<=new_rating;i++){
                    $('#'+parent+'_'+i+' .estrella').removeClass("estrella");
                    $('#'+parent+'_'+i+' .estrella').addClass("selected");
                }

                $('#'+parent+' .ok').empty();
                $('#'+parent+' #actual').empty();
                $('#'+parent+' #actual').append('('+new_rating+'/5) basado en '+new_num_rating+' votos!').fadeIn("slow");
                $('#'+parent+' .ok').append('Gracias por enviar tu voto!').fadeIn("slow");
                $('#'+parent+' #actual').fadeOut(5000);
                $('#'+parent+' .ok').fadeOut(5000);
            }

        });

    });  

    $('.estrella').hover(function(){
         var parent = $(this).parent().attr('id');

        $('#'+parent+' .estrella').css('background-image', 'url(images/estrella-gris.png)');

        for(i=1;i<=$(this).attr('data');i++){
            $('#'+parent+'_'+i).css('background-image', 'url(images/estrella-verde.png)');
        }

    });  
});    
</script> 
El archivo php que recibe los datos addvote.php simplemente hace un require de un archivo que conecta con la base de datos, recibe los datos mediante POST y los inserta en la tabla “rating_services” de la BD

Código PHP:
<?php
require('config.php');
$service $_POST['id'];
$rating $_POST['rating'];
$insert mysql_query("INSERT INTO services_rating (rating_id, rating_num) VALUES ('$service', '$rating')"$conexion);
?>
No se si te servira de algo
  #7 (permalink)  
Antiguo 26/02/2014, 13:51
Avatar de warywin  
Fecha de Ingreso: octubre-2013
Mensajes: 155
Antigüedad: 10 años, 6 meses
Puntos: 1
Respuesta: consejo para star rating?

Hola Raul, me dan un par de errores, he añadido a mi tabla las columnas rating_id , rating_num y IP. Los errores que me muestra la pag son:
-$row_services indefinida
-mysql_query() expects parameter 2 to be resource, object given in C:\\....videos.php
-mysql_result() expects parameter 1 to be resource, boolean given in C:\\....videos.php

no tengo muy claro que es la variable $row_services cuando la nombras en
Código PHP:
Ver original
  1. WHERE rating_id=".$row_services['service_id'], $con);

y la columna IP no se usa no?

Última edición por warywin; 26/02/2014 a las 14:12

Etiquetas: consejo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:02.