简体   繁体   中英

how to fill the star rating according to the votes

how do I fill the stars of a star rating already everything running the calculation and it took a echo in the variable calculation to see the result he would return me and he is me returning right however I am unable to leave it filled for example to note that 3.3 product and fill it three stars and 30% of the fourth as I do it? where I have to play my variable to show it in the stars? code:

<form id="rating" action"rating.php" method="post">

       <input type="hidden" name="id" id="idd" value="$idprod" />
        <div class="vote">
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="1" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="2" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="3" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="4" />
          <i class="fa" id="fa"></i>
         </label>
         <label>
          <input id="stars" class="radioo" type="radio" name="fb" value="5" />
          <i class="fa" id="fa"></i>
         </label>
       </div>
  </form>

jquery:

$('.vote label i.fa').on('click mouseover',function(){
    // remove classe ativa de todas as estrelas
    $('.vote label i.fa').removeClass('active');
    // pegar o valor do input da estrela clicada
    var val = $(this).prev('input').val();
    //percorrer todas as estrelas
    $('.vote label i.fa').each(function(){
        /* checar de o valor clicado é menor ou igual do input atual
        *  se sim, adicionar classe active
        */
        var $input = $(this).prev('input');
        if($input.val() <= val){
            $(this).addClass('active');
        }
    });
    $("#voto").html(val); // somente para teste
});
//Ao sair da div vote
$('.vote').mouseleave(function(){
    //pegar o valor clicado
    var val = $(this).find('input:checked').val();
    //se nenhum foi clicado remover classe de todos
    if(val == undefined ){
        $('.vote label i.fa').removeClass('active');
    } else { 
        //percorrer todas as estrelas
        $('.vote label i.fa').each(function(){
            /* Testar o input atual do laço com o valor clicado
            *  se maior, remover classe, senão adicionar classe
            */
            var $input = $(this).prev('input');
            if($input.val() > val){
                $(this).removeClass('active');
            } else {
                $(this).addClass('active');
            }
        });
    }
    $("#voto").html(val); // somente para teste
});

php:

$id = $_GET['cod'];
$sql = mysql_query("SELECT * FROM produtos WHERE id_produto = $id");
$test = mysql_query("SELECT votos, pontos FROM produtos WHERE id_produto = $id");
$aux = mysql_fetch_array($sql);
$idprod = $aux['id_produto'];
$row = mysql_fetch_array($test);
$voto = $row['votos'];
$ponto = $row['pontos'];
$calc = round(($ponto/$voto),1);

If I understand your question correctly, you are not sure how to fill stars dynamically from a PHP value for a calculated rating.

I put together this solution, the fiddle is here . The best way to do this (outside of AJAX) is to pass the calculated rating into a data attribute on the rating element. Then have your JS fill stars based on that as is shown in the jQuery. I also shown how you can use a click event to fill a hidden input field and re-evalulate the star filling to represent what was clicked.

If later a form is not submitted, you can post the new rating via ajax (best solution really to avoid a page change just to add a new rating). Or if a form is submitted, just make sure the divs are inside the element.

Here the code:

PHP:

//Do your calcuations
$calc = round(($ponto/$voto),1);

HTML

<div class="rating" data-calc="<?php echo $calc; ?>">
    <div class="star" data-seq="1">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />

    </div>
    <div class="star" data-seq="2" >
        <div class="cnt">
            <img class="full2" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <div class="star" data-seq="3">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <div class="star" data-seq="4">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <div class="star" data-seq="5">
        <div class="cnt">
            <img class="full" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Stj%C3%A4rna.svg/2000px-Stj%C3%A4rna.svg.png" />
        </div>
        <img class="empty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Five-pointed_star.svg/1088px-Five-pointed_star.svg.png" />
    </div>
    <input type="hidden" name="rating" value="" />
</div>

jQuery

function fillStarOnPercent(star, percent)
{   var fill = 25 *  percent;
    star.children('.cnt').css({'width' : fill +'px'});
}

function fillStars(parent, fullStars, percent){
    for(var i = 1; i < 6; i++)
    {
        var star = parent.find('.star[data-seq="'+i+'"]');
        if(i < fullStars)
            fillStarOnPercent(star, 1);

        if(i == fullStars)
            fillStarOnPercent(star, percent);

        if(i > fullStars)
            fillStarOnPercent(star, 0);
    }
}

$(document).ready(function() {

    jQuery('.rating').each(function() {

        var calc   = jQuery(this).data('calc');
        var fullStars = Math.floor(calc);
        if(fullStars == calc)
            var percent = 1
        else
            var percent = calc - fullStars;

        fillStars( jQuery(this), fullStars, percent );

    });

    jQuery('.rating').on('click', '.star', function() {
       var rating = jQuery(this).data('seq');
        fillStars(jQuery(this).parent(), rating, 1 );

       jQuery(this).parent().children('input[name="rating"]').val(rating);
    });
});

CSS

.star {width:25px;height:25px; position:relative; float:left;}
.star img {display:block; position:absolute; top:0; left:0; width:25px; height:25px;}
.cnt {position:absolute; top:0; left:0; overflow:hidden; width:25px; height:25px}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM