| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| 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 |
| { |
| public const NEVER_REMIND_ME_AGAIN = "-1"; |
|
|
| |
| |
| |
| 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_ThankYourForFeedback'; |
| $translationKeys[] = 'Feedback_ThankYou'; |
| $translationKeys[] = 'Feedback_MessageBodyValidationError'; |
| } |
|
|
| public function renderViewsAndAddToPage(&$pageHtml) |
| { |
| |
| 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; |
| } |
|
|
| |
| 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 ($nextReminderDate === false || $nextReminderDate <= 0) { |
| |
| $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; |
| } |
|
|
| |
| $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; |
| } |
|
|
| |
| protected function isDisabledInTestMode() |
| { |
| return defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE && !Common::getRequestVar('forceFeedbackTest', false); |
| } |
| } |
|
|