site-accueil-insa/matomo/plugins/Feedback/Feedback.php

175 lines
7 KiB
PHP

<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\Feedback;
use Piwik\Date;
use Piwik\View;
use Piwik\Piwik;
use Piwik\Common;
use Piwik\Plugins\Feedback\FeedbackReminder;
/**
*
*/
class Feedback extends \Piwik\Plugin
{
const NEVER_REMIND_ME_AGAIN = "-1";
/**
* @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
return array(
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
'Controller.CoreHome.index.end' => 'renderViewsAndAddToPage'
);
}
public function getStylesheetFiles(&$stylesheets)
{
$stylesheets[] = "plugins/Feedback/stylesheets/feedback.less";
$stylesheets[] = "plugins/Feedback/vue/src/RateFeature/RateFeature.less";
$stylesheets[] = "plugins/Feedback/vue/src/ReviewLinks/ReviewLinks.less";
$stylesheets[] = "plugins/Feedback/vue/src/FeedbackQuestion/FeedbackQuestion.less";
}
public function getJsFiles(&$jsFiles)
{
}
public function getClientSideTranslationKeys(&$translationKeys)
{
$translationKeys[] = 'Feedback_ThankYouHeart';
$translationKeys[] = 'Feedback_ThankYouForSpreading';
$translationKeys[] = 'Feedback_RateFeatureTitle';
$translationKeys[] = 'Feedback_RateFeatureThankYouTitle';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageLike';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeNamedFeature';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtra';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtraConfigurable';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtraEasy';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageLikeExtraUseful';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislike';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeNamedFeature';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtra';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraBugs';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraMissing';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraSpeed';
$translationKeys[] = 'Feedback_RateFeatureLeaveMessageDislikeExtraEasier';
$translationKeys[] = 'Feedback_RateFeatureOtherReason';
$translationKeys[] = 'Feedback_SendFeedback';
$translationKeys[] = 'Feedback_RateFeatureSendFeedbackInformation';
$translationKeys[] = 'Feedback_RateFeatureUsefulInfo';
$translationKeys[] = 'Feedback_RateFeatureEasyToUse';
$translationKeys[] = 'Feedback_RateFeatureConfigurable';
$translationKeys[] = 'Feedback_RateFeatureDislikeAddMissingFeatures';
$translationKeys[] = 'Feedback_RateFeatureDislikeMakeEasier';
$translationKeys[] = 'Feedback_RateFeatureDislikeSpeedUp';
$translationKeys[] = 'Feedback_RateFeatureDislikeFixBugs';
$translationKeys[] = 'Feedback_ReviewMatomoTitle';
$translationKeys[] = 'Feedback_PleaseLeaveExternalReviewForMatomo';
$translationKeys[] = 'Feedback_RemindMeLater';
$translationKeys[] = 'Feedback_NeverAskMeAgain';
$translationKeys[] = 'Feedback_WontShowAgain';
$translationKeys[] = 'Feedback_AppreciateFeedback';
$translationKeys[] = 'Feedback_Policy';
$translationKeys[] = 'General_Ok';
$translationKeys[] = 'General_Cancel';
$translationKeys[] = 'Feedback_Question0';
$translationKeys[] = 'Feedback_Question1';
$translationKeys[] = 'Feedback_Question2';
$translationKeys[] = 'Feedback_Question3';
$translationKeys[] = 'Feedback_Question4';
$translationKeys[] = 'Feedback_FeedbackTitle';
$translationKeys[] = 'Feedback_FeedbackSubtitle';
$translationKeys[] = 'Feedback_Policy';
$translationKeys[] = 'Feedback_ThankYourForFeedback';
$translationKeys[] = 'Feedback_ThankYou';
$translationKeys[] = 'Feedback_MessageBodyValidationError';
}
public function renderViewsAndAddToPage(&$pageHtml)
{
//only show on superuser
if (!Piwik::hasUserSuperUserAccess()) {
return $pageHtml;
}
$feedbackQuestionBanner = $this->renderFeedbackQuestion();
$matches = preg_split('/(<body.*?>)/i', $pageHtml, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$pageHtml = $matches[0] . $matches[1] . $feedbackQuestionBanner . $matches[2];
}
public function renderFeedbackQuestion()
{
$feedbackQuestionBanner = new View('@Feedback/feedbackQuestionBanner');
$feedbackQuestionBanner->showQuestionBanner = (int)$this->showQuestionBanner();
return $feedbackQuestionBanner->render();
}
public function showQuestionBanner()
{
if (Piwik::isUserIsAnonymous()) {
return false;
}
// Hide Feedback popup in all tests except if forced
if ($this->isDisabledInTestMode()) {
return false;
}
$shouldShowQuestionBanner = true;
Piwik::postEvent('Feedback.showQuestionBanner', [&$shouldShowQuestionBanner]);
if (!$shouldShowQuestionBanner) {
return false;
}
$feedbackReminder = new FeedbackReminder();
$nextReminderDate = $feedbackReminder->getUserOption();
$now = Date::now()->getTimestamp();
// If there isn't any reminder date set, or never remind me was selected previously (-1) we determine a new date
if ($nextReminderDate === false || $nextReminderDate <= 0) {
// if user was created within the last 6 months, we set the date to 6 months after his creation date
$userCreatedDate = Piwik::getCurrentUserCreationDate();
if (!empty($userCreatedDate) && Date::factory($userCreatedDate)->addMonth(6)->getTimestamp() > $now) {
$nextReminder = Date::factory($userCreatedDate)->addMonth(6)->toString('Y-m-d');
$feedbackReminder->setUserOption($nextReminder);
return false;
}
// Otherwise we set the date to somewhen within the next 6 months
$nextReminder = Date::now()->getStartOfDay()->addDay(Common::getRandomInt(1, 6*30))->toString('Y-m-d');
$feedbackReminder->setUserOption($nextReminder);
return false;
}
$nextReminderDate = Date::factory($nextReminderDate);
if ($nextReminderDate->getTimestamp() > $now) {
return false;
}
return true;
}
// needs to be protected not private for testing purpose
protected function isDisabledInTestMode()
{
return defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE && !Common::getRequestVar('forceFeedbackTest', false);
}
}