116 lines
2.9 KiB
PHP
Executable File
116 lines
2.9 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* Olegnax ProductReviewsSummary
|
|
*
|
|
* NOTICE OF LICENSE
|
|
*
|
|
* This source file is subject to the Olegnax.com license that is
|
|
* available through the world-wide-web at this URL:
|
|
* https://www.olegnax.com/license
|
|
*
|
|
* DISCLAIMER
|
|
*
|
|
* Do not edit or add to this file if you wish to upgrade this extension to newer
|
|
* version in the future.
|
|
*
|
|
* @category Olegnax
|
|
* @package Olegnax_ProductReviewsSummary
|
|
* @copyright Copyright (c) 2023 Olegnax (http://www.olegnax.com/)
|
|
* @license https://www.olegnax.com/license
|
|
*/
|
|
|
|
namespace Olegnax\ProductReviewsSummary\Block\Html;
|
|
|
|
use Magento\Review\Block\Product\View;
|
|
|
|
class ReviewSummary extends View {
|
|
|
|
protected function _construct() {
|
|
$_avg_arr = [];
|
|
$rating_votes = [];
|
|
$_items = $this->getReviewsItems();
|
|
if (count($_items)) {
|
|
foreach ($_items as $_review) {
|
|
$_rating_votes = $_review->getRatingVotes();
|
|
if (count($_rating_votes)) {
|
|
$_avg_arr_review = [];
|
|
foreach ($_rating_votes as $_vote) {
|
|
$_avg_arr_review[] = $_vote->getValue();
|
|
|
|
$_rating_id = $_vote->getRatingId();
|
|
if (array_key_exists($_rating_id, $rating_votes)) {
|
|
foreach (['percent', 'value'] as $field) {
|
|
$value = $rating_votes[$_rating_id]->getData($field);
|
|
$value[] = $_vote->getData($field);
|
|
$rating_votes[$_rating_id]->setData($field, $value);
|
|
}
|
|
} else {
|
|
foreach (['percent', 'value'] as $field) {
|
|
$_vote->setData($field, [$_vote->getData($field)]);
|
|
}
|
|
$rating_votes[$_rating_id] = $_vote;
|
|
}
|
|
}
|
|
$_avg_arr[] = $this->getAverage($_avg_arr_review);
|
|
}
|
|
}
|
|
}
|
|
$this->setRatingVotes($rating_votes);
|
|
$this->setNumberRatings($_avg_arr);
|
|
$this->setData('average_rating', round($this->getAverage($_avg_arr), 1));
|
|
}
|
|
|
|
public function getPercent() {
|
|
return round($this->getData('average_rating') * 100 / 5);
|
|
}
|
|
|
|
private function getAverage(array $array) {
|
|
$count = count($array);
|
|
if (!$count) {
|
|
return 0;
|
|
}
|
|
return array_sum($array) / $count;
|
|
}
|
|
|
|
private function setNumberRatings(array $array) {
|
|
$array = array_map('round', $array);
|
|
$array = array_map('intval', $array);
|
|
rsort($array, SORT_NUMERIC);
|
|
$_array = [
|
|
5 => 0,
|
|
4 => 0,
|
|
3 => 0,
|
|
2 => 0,
|
|
1 => 0,
|
|
];
|
|
foreach ($array as $vote) {
|
|
$_array[$vote] ++;
|
|
}
|
|
|
|
$this->setData('number_of_ratings', $_array);
|
|
}
|
|
|
|
private function setRatingVotes(array $rating_votes) {
|
|
foreach ($rating_votes as $_rating_id => $_vote) {
|
|
foreach (['percent', 'value'] as $field) {
|
|
$_vote->setData($field, $this->getAverage($_vote->getData($field)));
|
|
}
|
|
}
|
|
|
|
$this->setData('rating_votes', $rating_votes);
|
|
}
|
|
|
|
public function getReviewCount() {
|
|
return $this->getReviewsCollection()->getSize();
|
|
}
|
|
|
|
private function getReviewsItems() {
|
|
$this->getReviewsCollection()->load()->addRateVotes();
|
|
$_items = $this->getReviewsCollection()->getItems();
|
|
|
|
return $_items;
|
|
}
|
|
|
|
}
|