<?php
namespace WebBundle\Service;
use Exception;
use Symfony\Component\HttpFoundation\Request;
use WebBundle\Helper\App;
use WebBundle\Repository\ListCountryRepository;
use WebBundle\Repository\ReviewsCacheRepository;
class WidjetReviewService
{
private ReviewsService $serviceReviews;
private ListCountryRepository $listCountryRepository;
public function __construct(
ReviewsService $reviewsService,
ListCountryRepository $listCountryRepository
)
{
$this->serviceReviews = $reviewsService;
$this->listCountryRepository = $listCountryRepository;
}
/**
* Выводим данные отзывов
* @param Request $request
* @return array
* @throws Exception
*/
public function getReviews($request)
{
$locale = App::getCurLocale();
// Устанавливаем типы
if (!empty($request->get('service'))) {
$this->serviceReviews->setServiceType($request->get('service'));
}
if (!empty($request->get('type'))) {
$this->serviceReviews->setReviewsType($request->get('type'));
}
// Опции настроек
$options = [
'cleanTotal' => true,
'sku' => !empty($request->get('sku')) ? $request->get('sku') : null,
'count' => !empty($request->get('count')) ? $request->get('count') : false,
'current' => !empty($request->get('current')) ? $request->get('current') : 0,
'limit' => !empty($request->get('limit')) ? $request->get('limit') : 15
];
if ($request->get('lang')) {
$options['lang'] = $request->get('lang');
}
$dataReviews = $this->getData($options);
$result['status'] = is_array($dataReviews);
if ($result['status']) {
$result['resource'] = $dataReviews;
if ($this->serviceReviews->getReviewsType() === 'service') {
$result['resource']['langs'] = $this->getLangs(
$dataReviews['total'] // передаём дынные
);
$countries = $this->listCountryRepository->getListForReviewsAndProfile($locale, true);
$langs = !empty($result['resource']['langs']) ? $result['resource']['langs'] : [];
// Добвляем данные о странах
$result['resource']['langs'] = array_merge(
$langs,
['countries' => $countries] // Страны
);
}
} else {
$result['messages'] = explode(". ", App::getTranslator()->trans('error404.info1'))[0] . "...";
}
return $result;
}
/**
* Получаем данные
* @param $options
* @return array|null
*/
private function getData($options): ?array
{
// Получаем данные с БД
$total = $this->serviceReviews->getSummariesToDB($options);
$reviews = $this->serviceReviews->getListReviewsToDB($options);
// Проверяем доступность данных из кеша
$total = (count($total) > 0) ?
($this->serviceReviews->getReviewsType() === 'service') ? $total[0] : $total
: null;
$reviews = (count($reviews) > 0) ? $reviews : null;
// Если не равно, изменить кол-во
if ($options['count']) {
if ($total['count'] !== count($reviews)) {
$total['count'] = count($reviews);
}
}
// Получаем общее кол-во отзывов в БД
if ($this->serviceReviews->getReviewsType() === 'service') {
/** @var ReviewsCacheRepository $repoReviews */
$repoReviews = $this->serviceReviews->getRepoReviews();
$total['reviews'] = $repoReviews->getReviewsCount();
}
// отправляем данные
if (count($total) > 0 && count($reviews) > 0) {
// Чистим не нужное на выводе
if ($options['cleanTotal']) {
unset($total['hash']);
}
return [
'total' => $total,
'reviews' => $reviews,
];
}
return null;
}
/**
* Получаем данные для вставки в first-item
* @param $array
* @return array
* @throws Exception
*/
public function getLangs($array)
{
$trans = App::getTranslator();
// Возвращяем результат
return [
'reviews' => $trans->trans('reviews', ['%d%' => $array['count']]),
'wordscore' => $trans->trans('stars.' . $array['star']),
'businessinfo' => $trans->trans('businessinfo'),
];
}
}