Search code examples
phpjoomlarating-systemjoomla-k2

Joomla Rating, intead of showing % i want it to view '8.2/10'?


Im using the component K2, and it's voting/rating system. Currently it displays the rating as a percentage, with some css to view stars. But instead of showing the stars, I want it to say for example, 4.5/5

This is the code for viewing it:

<?php if($this->item->params->get('catItemRating')): ?>
<div id="catItemRatingBlock">
 <div class="itemRatingForm">
   <ul class="itemRatingList">
     <li class="itemCurrentRating" id="itemCurrentRating<?php echo $this->item->id; ?>" style="width:<?php echo $this->item->votingPercentage; ?>%;"></li>
     <li><a href="#" rel="<?php echo $this->item->id;  ?>" class="one-star">1</a></li>
     <li><a href="#" rel="<?php echo $this->item->id;  ?>" class="two-stars">2</a></li>
     <li><a href="#" rel="<?php echo $this->item->id;  ?>" class="three-stars">3</a></li>
     <li><a href="#" rel="<?php echo $this->item->id;  ?>" class="four-stars">4</a></li>
     <li><a href="#" rel="<?php echo $this->item->id;  ?>" class="five-stars">5</a></li>
   </ul>
 </div>
</div>
<?php endif; ?>

And this is the code that found in 'com_k2/models/item.php':

function getVotesPercentage($itemID = NULL)
{

    $mainframe = &JFactory::getApplication();
    $user = JFactory::getUser();
    $db = &JFactory::getDBO();
    $xhr = false;
    $result = 0;
    if (is_null($itemID))
    {

        $itemID = JRequest::getInt('itemID');
        $xhr = true;
    }

    $vote = K2ModelItem::getRating($itemID);

    if (!is_null($vote) && $vote->rating_count != 0)
    {
        $result = number_format(intval($vote->rating_sum) / intval($vote->rating_count), 2) * 20;
    }
    if ($xhr)
    {
        echo $result;
        $mainframe->close();
    }
    else
        return $result;
}

What should I do?


Solution

  • In summary, take the percentage shown in: $this->item->votingPercentage ( 0 to 100) and convert it to a number in the range of 0 to 5 by dividing it by 20. You'll probably want to keep 1 decimal place of accuracy when displaying the number as x out of 5.

    Since you don't know whether votingPercentage is a string or a numeric, I would test it to make sure it has a valid numeric value before doing any calculations:

    <?php
    
    if (!isnumeric($this->item->votingPercentage) {
    
       $numericRating = 0;
    
    // If the value cannot be interpreted as a numeric, we assume a value of 0.
    
    }
    
    else {
    
       $numericRating = round(($this->item->votingPercentage / 2), 0);  
    
    // The statement above is equivalent to dividing the percentage by 20 (to get a number from 0 to 5); and then multiplying by 10 to get a number from 0 to 50.  Since this final number could have a decimal component (for example 42.55 out of 50), we round to 0 decimal places to get rid of the decimal remainder - in this example, resulting in the number 43
    
       $numericRating = round(($numericRating / 10), 1);
    
    // The statement above divides the number from the previous step by 10 (to shift the decimal point), and just for good measure, applies the rounding function one more time in case the division yields a number like 4.300000001 or 4.29999999
    
    }
    
    echo $numericRating . "/5";
    
    // Finally, the resulting numeric value is rendered as a number from 0 to 5 with 1 decimal place, followed by the characters "/5"  (i.e. out of 5)
    ?>