File manager - Edit - /home/verseaumee/ptitsanes/plugins/solidres/feedback/feedback.php
Back
<?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; } }
| ver. 1.4 |
Github
|
.
| PHP 8.5.7 | Generation time: 0 |
proxy
|
phpinfo
|
Settings