Modificar rating php

  • Autor Autor xaiborweb
  • Fecha de inicio Fecha de inicio
xaiborweb

xaiborweb

Dseda
Programador
No recomendado
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
hola estoy modificando un script codeigniter, que tiene un sistema de rating que guarda los datos en una tabla con muchas columnas así imagen pero necesito que solo guarde en base de datos dos columnas: rating y el numero de votos, ademas para evitar que voten mas de una vez pero sin guardar la ip del usuario o algún otro dato en db me preguntaba si se podría hacer con las cookies del navegador del usuario así como funcionan el mensaje de política de cookies o de alguna otra manera.

pero no e logrado modificarlo para como lo necesito, comparto el code del rating actual por si alguien me puede dar una mano muchas gracias 😉

jquery
HTML:
$('#tvglu-rating').on('rating.change', function(event, value, caption) {
var id = $('#id-source').val();
var type = $('#type-source').val();

var post_data = {
    'vote': value,
    'id': id,
    'type': type
};

$.ajax({
    type: "POST",
    url: "/user/vote",
    data: post_data,
    success: function(data) {
    // return success
    if (data.length > 0) {
        var response = JSON.parse(data);
        $('#tvglu-rating-num').html(response.rating);
        $('#tvglu-rating-num1').html(response.rating);
        $('#tvglu-rating-votes').html(response.votes);
        var f = '<div class="toast toast-success"><button class="toast-close-button" role="button">×</button><div class="toast-message"><strong>' + response.msg + '</strong></div></div>';
        $("#toast-container").html(f), $("#toast-container").fadeIn("slow").show(), setTimeout(function() {
            $("#toast-container").fadeOut("slow").hide()
        }, 3e3)
    }
    }
});
})
vista
PHP:
<li>
              <div class="rating"><?php if($rating == 0){ echo $p->tmdb_rating; }else{ echo $rating; } ?></div>
              <div class="number">
                <input type="hidden" id="id-source" value="<?=$p->id?>">
                <input type="hidden" id="type-source" value="2">
                <input id="tvglu-rating" value="<?php if($rating == 0){ echo $p->tmdb_rating; }else{ echo $rating; } ?>" class="rating-loading">
                <div class="rating-info">TVGLU: <span id="tvglu-rating-num1" itemprop="ratingValue"><?php if($rating == 0){ echo $p->tmdb_rating; }else{ echo $rating; } ?></span> / <span itemprop="bestRating">10</span> &nbsp; <span id="tvglu-rating-votes" itemprop="ratingCount"><?=$votes?></span> <?=$this->lang->line('votes')?></div>
              </li>
controller
PHP:
 $votes = $this->movies_model->getvotes($id,2); // + voto
        if(!empty($votes)){ // rating
			$s1 = $votes[0]->star_1;
			$s2 = $votes[0]->star_2;
			$s3 = $votes[0]->star_3;
			$s4 = $votes[0]->star_4;
			$s5 = $votes[0]->star_5;
			$s6 = $votes[0]->star_6;
			$s7 = $votes[0]->star_7;
			$s8 = $votes[0]->star_8;
			$s9 = $votes[0]->star_9;
			$s10 = $votes[0]->star_10;

			$rating = (1 * $s1 + 2 * $s2 + 3 * $s3 + 4 * $s4 + 5 * $s5 + 6 * $s6 + 7 * $s7 + 8 * $s8 + 9 * $s9 + 10 * $s10) / ($s1 + $s2 + $s3 + $s4 + $s5 + $s6 + $s7 + $s8 + $s9 + $s10);
			$data['votes'] = ($s1 + $s2 + $s3 + $s4 + $s5 + $s6 + $s7 + $s8 + $s9 + $s10);
			$data['rating'] = round($rating,1);
		}else{
			$data['votes'] = 0;
			$data['rating'] = 0;
		}
petición model
public function getvotes($id,$type)
{
return $this->db
->select('*')
->from('votes')
->where('id_source',$id)
->where('type',$type)
->get()
->result();
}
 
Última edición:
PAra poder hacer que no vote mas de una vez desde el mismo navegador podrías utilizar LocalStorage. Aunque eso no te asegura que el usuario vote mas de una vez el mismo enlace.

Te dejo info sobre localStorage. HTML5 Web Storage

Vos podrias armar el indice con el ID y el value con 0 o 1. 0 ( cero ) no si votó o 1 si lo hizo :encouragement:. Nosé si es la ideal pero sería bueno asi no utilizás PHP ni base en este punto.

Si votó entonces bloqueas las estrellas, y antes de enviar el voto tambien armás una sentencia de si votó que no se envíe el form.
 
PAra poder hacer que no vote mas de una vez desde el mismo navegador podrías utilizar LocalStorage. Aunque eso no te asegura que el usuario vote mas de una vez el mismo enlace.

Te dejo info sobre localStorage. HTML5 Web Storage

Vos podrias armar el indice con el ID y el value con 0 o 1. 0 ( cero ) no si votó o 1 si lo hizo :encouragement:. Nosé si es la ideal pero sería bueno asi no utilizás PHP ni base en este punto.

Si votó entonces bloqueas las estrellas, y antes de enviar el voto tambien armás una sentencia de si votó que no se envíe el form.

la cosa es que no soy programador y todo lo que logro modificar es de pura malicia indígena y la ley de prueba y error, te agradecería inmensamente si pudieras compartir un ejemplo rápido funcional de código.

y con respecto a que guarda en una tabla cada estrella y solo quiero que guarde por ejemplo rating = 8.5 y votos = 20, y que cuando alguien mas vote en una función haga el calculo del nuevo rating.

gracias por comentar bro.
 
Yo hace unos días hice algo así pero mucho más sencillo, lo q hacía era almacenar el ID del post, votó (es decir si el usuario seleccionó 1,3, etc estrellas) y por último la IP del usuario.

De esta manera cálculo el ratón al momento de mostrarlo (sumatoria de todos los votos entre la cantidad total de votos que tiene ese ID de post) y para evitar que voten doble vez hacía una comprobación con la IP, si la IP ya existía entonces de igual forma el usuario podía "volver a votar" con la diferencia q en este caso el voto se actualizaba, mientras que si la IP no existe, se inserta un nuevo registro.

Espero haya podido darte una idea... saludos
 
Atrás
Arriba