| Server IP : 46.105.57.169 / Your IP : 216.73.216.67 Web Server : Apache System : Linux webm002.cluster120.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64 User : verseaumee ( 152031) PHP Version : 8.5.7 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/verseaumee/ptitsanes/plugins/solidres/feedback/ |
Upload File : |
<?php
/* ------------------------------------------------------------------------
Solidres - Hotel booking extension for Joomla
------------------------------------------------------------------------
@Author Solidres Team
@Website http://www.solidres.com
@Copyright Copyright (C) 2013 - 2017 Solidres. All Rights Reserved.
@License GNU General Public License version 3, or later
------------------------------------------------------------------------ */
defined('_JEXEC') or die;
/**
* Solidres Feedback
*
* @package Solidres
* @subpackage Feedback
* @since 0.8.0
*/
class plgSolidresFeedback extends SRPlugin
{
protected $db;
public function __construct(&$subject, $config = array())
{
parent::__construct($subject, $config);
jimport('joomla.filesystem.file');
JLoader::register('SRLayoutHelper', JPATH_ADMINISTRATOR . '/components/com_solidres/helpers/layout.php');
SRLayoutHelper::addIncludePath($this->_getSitePath() . '/layouts');
JHtml::_('stylesheet', 'plg_solidres_feedback/assets/flags.css', array(), true);
JHtml::_('stylesheet', 'plg_solidres_feedback/assets/feedbacks.css', array(), true);
}
public function onSolidresSendRequestFeedback($scope, $reservationId, $forceSend = false)
{
$params = JComponentHelper::getParams('com_solidres');
if ($scope)
{
if (!SRPlugin::isEnabled('experience'))
{
return;
}
JTable::addIncludePath(SRPlugin::getAdminPath('experience') . '/tables');
$table = 'ExpReservation';
$checkState = $params->get('exp_status_trigger_feedback_email', 0);
}
else
{
$table = 'Reservation';
$checkState = $params->get('asset_status_trigger_feedback_email', 2);
}
$reservation = JTable::getInstance($table, 'SolidresTable');
$reservation->load($reservationId);
if ($reservation->state != $checkState && !$forceSend)
{
return;
}
if ($scope)
{
$experience = SRExperienceHelper::getItem($reservation->experience_id);
if (!$experience->id)
{
return;
}
$token = $this->getToken($reservation);
$subjectArray = ['SR_EMAIL_REQUEST_FOR_EXPERIENCE_SUBJECT', $experience->name];
$layoutId = 'emails.request_customer_exp_feedback_html_inliner';
$customerFields = array();
$fieldContext = SRExperienceHelper::getCustomFieldContext($reservation->id);
if ($fields = SRCustomFieldHelper::getValues(array('context' => $fieldContext)))
{
foreach ($fields as $field)
{
$fieldName = $field->field->get('field_name');
$customerFields[$fieldName] = $field->value;
if ($fieldName == 'customer_email')
{
$customerEmail = $field->value;
break;
}
}
}
$customer = new stdClass;
$customer->fields = $customerFields;
$customer->name = $reservation->customer_name;
$displayData = array(
'experience' => $experience,
'customer' => $customer,
);
$reservation->set('token', $token);
}
else
{
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_solidres/models', 'SolidresModel');
$model = JModelLegacy::getInstance('ReservationAsset', 'SolidresModel');
$asset = $model->getItem($reservation->reservation_asset_id);
if (!$asset->id)
{
return;
}
$displayData = array('asset' => $asset);
$token = $this->getToken($reservation);
$subjectArray = ['SR_EMAIL_REQUEST_FOR_FEEDBACK_SUBJECT', $asset->name];
$layoutId = 'emails.request_customer_feedback_html_inliner';
$customerEmail = $reservation->customer_email;
$reservation->set('token', $token);
}
if (empty($customerEmail))
{
return;
}
$cmsLanguage = JFactory::getLanguage();
$cmsLangTag = $cmsLanguage->getTag();
if ($reservation->store())
{
try
{
if (!empty($reservation->customer_language)
&& $reservation->customer_language != $cmsLangTag
)
{
$lang = JLanguage::getInstance($reservation->customer_language);
foreach ($cmsLanguage->getPaths() as $extension => $langPaths)
{
foreach ($langPaths as $langFile => $loaded)
{
$lang->load($extension, preg_replace('#/language/' . $cmsLangTag . '/.*$#', '', $langFile));
}
}
// Override CMS language
JFactory::$language = $lang;
}
$feedbackURL = JUri::getInstance()->toString(['scheme', 'host', 'port']) . JRoute::link('site', 'index.php?option=com_solidres&view=feedback&filter_scope=' . (int) $scope . '&feedbackToken=' . $token . '&lang=' . JFactory::getLanguage()->getTag(), false);
$displayData['reservation'] = $reservation;
$displayData['feedbackURL'] = $feedbackURL;
$body = SRLayoutHelper::render($layoutId, $displayData);
$sender = array(
0 => $this->app->get('mailfrom'),
1 => $this->app->get('fromname'),
);
$mail = JFactory::getMailer();
$mail->setSender($sender)
->isHtml(true)
->addRecipient($customerEmail)
->setSubject(JText::sprintf($subjectArray[0], $subjectArray[1]))
->setBody($body)
->Send();
if (isset($lang))
{
JFactory::$language = $cmsLanguage;
}
}
catch (RuntimeException $ex)
{
$options = array(
'format' => '{DATE}\t{TIME}\t{LEVEL}\t{CODE}\t{MESSAGE}',
'text_file' => 'solidres_feedback.php',
);
JLog::addLogger($options, JLog::ALL, array('feedback'));
JLog::add($ex->getMessage(), JLog::DEBUG, 'feedback');
if (isset($lang))
{
JFactory::$language = $cmsLanguage;
}
return false;
}
}
return true;
}
public function onReservationChangeState($context, $pks, $value, $oldValue = 0)
{
if ($context == 'com_solidres.experience')
{
$this->onSolidresSendRequestFeedback($context === 'com_solidres.experience', $pks[0], false);
}
}
public function onAjaxFeedback()
{
$scope = (int) $this->app->input->getInt('scope');
$itemName = $this->app->input->getString('itemName', '');
$buffer = $this->onSolidresFeedbackLoadForm($scope, $itemName);
echo json_encode(array($buffer));
$this->app->close();
}
public function onSolidresFeedbackLoadForm($scope = 0, $itemName = '')
{
$this->loadLanguage('com_solidres', JPATH_SITE . '/components/com_solidres');
$this->loadLanguage('com_solidres', JPATH_ADMINISTRATOR . '/components/com_solidres');
JForm::addFormPath(SRPlugin::getSitePath('feedback') . '/models/forms');
JForm::addFieldPath(SRPlugin::getAdminPath('feedback') . '/models/fields');
$form = JForm::getInstance('plg_solidres_feedback.feedback', 'feedbackguest', array('control' => 'jform'));
$form->setValue('scope', null, $scope);
$form->setFieldAttribute('feedback_type_value_id', 'scope', $scope);
$form->setFieldAttribute('feedback_score_rate', 'scope', $scope);
SRLayoutHelper::addIncludePath(SRPlugin::getSitePath('feedback') . '/layouts');
$buffer = SRLayoutHelper::render('feedbacks.form', array(
'form' => $form,
'itemName' => $itemName,
'scope' => $scope,
));
return $buffer;
}
private function getToken(JTable $reservation)
{
$secret = join(':', $reservation->getProperties()) . ':' . time();
return sha1($secret);
}
public function onContentPrepare($context, &$item, &$params)
{
$this->onSolidresFeedbackPrepare($context, $item);
}
public function onSolidresFeedbackPrepare($context, $item)
{
$allowContexts = [
'com_solidres.asset',
'com_solidres.experience',
'com_solidres.hubFilter',
'com_solidres.search',
];
if (!in_array($context, $allowContexts)
|| $this->app->isClient('administrator')
|| empty($item->id)
)
{
return;
}
JModelLegacy::addIncludePath($this->_getSitePath() . '/models', 'SolidresModel');
JModelLegacy::addIncludePath($this->_getAdminPath() . '/models', 'SolidresModel');
JTable::addIncludePath($this->_getAdminPath() . '/tables');
JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_solidres/tables');
$scope = $context == 'com_solidres.experience' && SRPlugin::isEnabled('experience') ? 1 : 0;
$modelFeedbacks = JModelLegacy::getInstance('FeedbackList', 'SolidresModel', array('ignore_request' => true));
$modelFeedbacks->setState('filter.state', 1);
$modelFeedbacks->setState('filter.scope', $scope);
if ($scope)
{
$modelFeedbacks->setState('filter.experience_id', $item->id);
}
else
{
$modelFeedbacks->setState('filter.reservation_asset_id', $item->id);
}
$modelFeedbacks->setListStart($item->id, $scope);
$feedbacks = $modelFeedbacks->getItems();
$scoreList = $modelFeedbacks->getScores($item->id, $scope);
$countAll = $modelFeedbacks->getCountCondition($item->id, $scope);
if ($feedbacks && $scoreList)
{
$maxScore = (int) JComponentHelper::getParams('com_solidres')->get('feedback_max_scores', 10);
$scores = array();
foreach ($scoreList as $val)
{
if (!isset($scores[$val->field]))
{
$scores[$val->field] = array();
}
$scores[$val->field][] = (int) $val->score;
}
foreach ($scores as $field => $score)
{
$scores[$field] = array_sum($score) / count($score);
}
$totalScore = array_sum(array_values($scores)) / count($scores);
$displayData = array(
'items' => $feedbacks,
'itemId' => $item->id,
'scope' => $scope,
'start' => $modelFeedbacks->getState('list.start'),
'limit' => $modelFeedbacks->getState('list.limit'),
'total' => $modelFeedbacks->getTotal(),
'scores' => $scores,
'maxScore' => $maxScore,
'totalScore' => $totalScore,
);
if (!$scope)
{
$this->__prepareDocument($item, $maxScore, $totalScore, $countAll);
}
SRLayoutHelper::addIncludePath(SRPlugin::getSitePath('feedback') . '/layouts');
$modelFeedbacks->render = SRLayoutHelper::render('feedbacks.listasset', $displayData);
$modelFeedbacks->scores = SRLayoutHelper::render('feedbacks.scores', $displayData);
$item->feedbacks = $modelFeedbacks;
$item->feedbackMaxScore = $maxScore;
$item->feedbackTotalScore = $totalScore;
$item->feedbackCount = $countAll;
$item->reviewFields = $scores;
$item->reviewCount = (int) $displayData['total'];
$item->reviewScores = round($totalScore, 1);
$item->reviewComment = $this->displayScore($maxScore, $item->reviewScores);
$item->reviewWidget = SRLayoutHelper::render('feedbacks.reviewwidget_style1', array(
'reviewScores' => $item->reviewScores,
'reviewComment' => $item->reviewComment,
'reviewCount' => $item->reviewCount,
'scope' => $scope,
));
}
}
protected function __prepareDocument($asset, $bestRating, $rating_value, $ratingCount)
{
$document = JFactory::getDocument();
if ($document->getType() == 'html')
{
$jsonLD = array(
'@context' => 'http://schema.org/',
'@type' => 'Hotel',
'name' => htmlspecialchars($asset->name),
'description' => htmlspecialchars(strip_tags($asset->description)),
'aggregateRating' => array(
'@type' => 'AggregateRating',
'ratingValue' => number_format($rating_value, 1),
'bestRating' => (int) $bestRating,
'ratingCount' => (int) $ratingCount,
)
);
if (!empty($asset->media[0]))
{
$jsonLD['image'] = SRURI_MEDIA . '/assets/images/system/thumbnails/1/' . $asset->media[0]->value;
}
$jsonLD['address'] = $asset->address_1 . ', ' .
(!empty($asset->city) ? $asset->city . ', ' : '') .
(!empty($asset->postcode) ? $asset->postcode . ', ' : '') .
$asset->country_name;
if (!empty($asset->phone))
{
$jsonLD['telephone'] = $asset->phone;
}
$document->addScriptDeclaration('
(function(){
var script = document.createElement("script");
script.type = "application/ld+json";
script.innerHTML = JSON.stringify(' . json_encode($jsonLD) . ');
document.getElementsByTagName("head")[0].appendChild(script);
})(document);
');
}
}
protected function displayScore($maxScore, $value)
{
switch ($maxScore)
{
case 5:
if ($value >= 2.5 && $value < 3.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_QUITE_GOOD');
}
if ($value >= 3.0 && $value < 4.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_GOOD');
}
if ($value >= 4.0 && $value < 4.5)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_VERY_GOOD');
}
if ($value >= 4.5)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_EXCELLENT');
}
case 100:
if ($value >= 60.0 && $value < 70.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_QUITE_GOOD');
}
if ($value >= 70.0 && $value < 80.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_GOOD');
}
if ($value >= 80.0 && $value < 90)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_VERY_GOOD');
}
if ($value >= 90.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_EXCELLENT');
}
default:
if ($value >= 6.0 && $value < 7.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_QUITE_GOOD');
}
if ($value >= 7.0 && $value < 8.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_GOOD');
}
if ($value >= 8.0 && $value < 9.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_VERY_GOOD');
}
if ($value >= 9.0)
{
return JText::_('SR_FEEDBACK_REVIEW_COMMENT_EXCELLENT');
}
}
return '';
}
public static function getReviewRange()
{
$maxScore = (int) JComponentHelper::getParams('com_solidres')->get('feedback_max_scores', 10);
switch ($maxScore)
{
case 5:
$reviewRange = array(
'4.5-0.0' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_EXCELLENT', '4.5+'),
'4.0-4.4' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_VERY_GOOD', '4.0+'),
'3.0-3.9' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_GOOD', '3.0+'),
'2.5-2.9' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_QUITE_GOOD', '2.5+'),
);
break;
case 100:
$reviewRange = array(
'90.0-0.0' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_EXCELLENT', '90+'),
'80.0-89.0' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_VERY_GOOD', '80+'),
'70.0-79.0' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_GOOD', '70+'),
'60.0-69.0' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_QUITE_GOOD', '60+'),
);
break;
default:
$reviewRange = array(
'9.0-0.0' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_EXCELLENT', '9+'),
'8.0-8.9' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_VERY_GOOD', '8+'),
'7.0-7.9' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_GOOD', '7+'),
'6.0-6.9' => JText::sprintf('SR_FEEDBACK_REVIEW_COMMENT_QUITE_GOOD', '6+'),
);
break;
}
return $reviewRange;
}
}