| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Plugins\Feedback; |
|
|
| use Piwik\Common; |
| use Piwik\Config; |
| use Piwik\Config\GeneralConfig; |
| use Piwik\Container\StaticContainer; |
| use Piwik\DataTable\Renderer\Json; |
| use Piwik\Date; |
| use Piwik\Mail; |
| use Piwik\Piwik; |
| use Piwik\SettingsServer; |
| use Piwik\Url; |
| use Piwik\Version; |
|
|
| |
| |
| |
| |
| |
| class API extends \Piwik\Plugin\API |
| { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function sendFeedbackForFeature(string $featureName, ?bool $like = null, ?string $choice = null, ?string $message = null) |
| { |
| Piwik::checkUserIsNotAnonymous(); |
| Piwik::checkUserHasSomeViewAccess(); |
|
|
| if (empty($message) || $message === 'undefined' || strlen($message) < 4) { |
| return Piwik::translate("Feedback_FormNotEnoughFeedbackText"); |
| } |
|
|
| $featureName = $this->getEnglishTranslationForFeatureName($featureName); |
|
|
| $likeText = 'Yes'; |
| if (empty($like)) { |
| $likeText = 'No'; |
| } |
|
|
| $body = sprintf("Feature: %s\nLike: %s\n", $featureName, $likeText); |
|
|
| if (!empty($choice) && $choice !== 'undefined') { |
| $body .= "Choice: " . $choice . "\n"; |
| } |
|
|
| $body .= sprintf("Feedback:\n%s\n", trim($message)); |
|
|
| $subject = sprintf( |
| "%s for %s", |
| empty($like) ? "-1" : "+1", |
| $featureName |
| ); |
|
|
| |
| if (Config::getHostname() === 'demo.matomo.cloud') { |
| $source = 'Demo'; |
| } elseif (SettingsServer::isMatomoForWordPress()) { |
| $source = 'Wordpress'; |
| } else { |
| $source = 'On-Premise'; |
| } |
| $body .= "Source: " . $source . "\n"; |
|
|
| $this->sendMail($subject, $body); |
|
|
| return 'success'; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public function sendFeedbackForSurvey(string $question, $message = false): string |
| { |
| Piwik::checkUserIsNotAnonymous(); |
| Piwik::checkUserHasSomeViewAccess(); |
|
|
| if (empty($message) || strlen($message) < 10) { |
| return Piwik::translate("Feedback_MessageBodyValidationError"); |
| } |
|
|
| $featureName = $this->getEnglishTranslationForFeatureName($question); |
| $body = sprintf("Question: %s\n", $featureName); |
| $body .= sprintf("Answer:\n%s\n", trim($message)); |
|
|
| $subject = sprintf( |
| "-1 for %s (w/ feedback Survey)", |
| $featureName |
| ); |
|
|
| $this->sendMail($subject, $body); |
|
|
| |
| $nextReminder = Date::now()->getStartOfDay()->addMonth(6)->toString('Y-m-d'); |
| $feedbackReminder = new FeedbackReminder(); |
| $feedbackReminder->setUserOption($nextReminder); |
|
|
| return 'success'; |
| } |
|
|
| |
| |
| |
| |
| |
| public function updateFeedbackReminderDate(): string |
| { |
| Piwik::checkUserIsNotAnonymous(); |
|
|
| |
| $nextReminder = Date::now()->getStartOfDay()->addMonth(6)->toString('Y-m-d'); |
| $feedbackReminder = new FeedbackReminder(); |
| $feedbackReminder->setUserOption($nextReminder); |
|
|
| Json::sendHeaderJSON(); |
| return json_encode(['Next reminder date: ' . $nextReminder]) ?: ''; |
| } |
|
|
| private function sendMail(string $subject, string $body): void |
| { |
| |
| $feedbackEmailAddress = GeneralConfig::getConfigValue('feedback_email_address'); |
|
|
| $subject = '[ Feedback Feature - Matomo ] ' . $subject; |
| $body = Common::unsanitizeInputValue($body) . "\n" |
| . 'Matomo ' . Version::VERSION . "\n" |
| . 'URL: ' . Url::getReferrer() . "\n"; |
|
|
| $mail = new Mail(); |
| $mail->setDefaultFromPiwik(); |
| $mail->addReplyTo(Piwik::getCurrentUserEmail()); |
| $mail->addTo($feedbackEmailAddress, 'Matomo Team'); |
| $mail->setSubject($subject); |
| $mail->setBodyText($body); |
| @$mail->send(); |
| } |
|
|
| private function getEnglishTranslationForFeatureName(string $featureName): string |
| { |
| $translator = StaticContainer::get('Piwik\Translation\Translator'); |
|
|
| if ($translator->getCurrentLanguage() === 'en') { |
| return $featureName; |
| } |
|
|
| $translationKeyForFeature = $translator->findTranslationKeyForTranslation($featureName); |
|
|
| return Piwik::translate($translationKeyForFeature ?? '', [], 'en'); |
| } |
| } |
|
|