VvebOIDC/app/component/reviews.php

104 lines
3.0 KiB
PHP

<?php
/**
* Vvveb
*
* Copyright (C) 2022 Ziadin Givan
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Vvveb\Component;
use Vvveb\Sql\Product_Review_MediaSQL;
use Vvveb\System\Images;
class Reviews extends Comments {
protected $type = 'product_review';
protected $route = 'product/product/index';
protected $modelName = 'product_review';
public static $defaultOptions = [
'product_id' => 'url',
'slug' => 'url',
'product_title' => NULL, //include product title (for recent reviews etc)
'user_id' => NULL,
'status' => 1, //approved reviews
'start' => 0,
'limit' => 10,
'image_size' => 'thumb',
'order' => 'asc', //desc
];
public $cacheExpire = 0; //no cache
function results() {
$results = parent::results();
//review images
foreach ($results['product_review'] as $id => &$review) {
if (isset($review['images'])) {
$review['images'] = json_decode($review['images'], true);
foreach ($review['images'] as &$image) {
$image['thumb'] = Images::image($image['image'], 'product', $this->options['image_size']);
$image['image'] = Images::image($image['image'], 'product', 'xlarge');
}
}
}
//all product reviews images
$media = new Product_Review_MediaSQL();
$gallery = $media->getAll($this->options + ['status' => 1])['product_review_media'] ?? [];
if ($gallery) {
//$gallery = Images::images($gallery, 'product', $this->options['image_size']);
foreach ($gallery as &$image) {
$image['thumb'] = Images::image($image['image'], 'product', $this->options['image_size']);
$image['image'] = Images::image($image['image'], 'product', 'xlarge');
}
}
$results['images'] = $gallery;
$stats = $this->modelInstance->getProductStats($this->options);
if ($stats) {
$results += $stats;
}
$results['rating'] = number_format($results['rating'] ?? 0, 1);
//compute width and fill missing ratings
foreach ([1, 2, 3, 4, 5] as $rating) {
if (isset($results['summary'][$rating])) {
$summary = &$results['summary'][$rating];
$summary['percent'] = ceil($summary['count'] * 100 / $results['count']);
} else {
$results['summary'][$rating]['rating'] = $rating;
$results['summary'][$rating]['percent'] = 0;
$results['summary'][$rating]['count'] = 0;
}
}
//$results['buyers'] = 5;
//$results['recommendations'] = 100;
return $results;
}
}