1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\SitesManager\SiteContentDetection;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
use Piwik\Plugins\CustomVariables\CustomVariables;
use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker;
use Piwik\Site;
use Piwik\SiteContentDetector;
use Piwik\Url;
use Piwik\View;
class Matomo extends SiteContentDetectionAbstract
{
public static function getName(): string
{
return Piwik::translate('CoreAdminHome_JavaScriptCode');
}
public static function getIcon(): string
{
return './plugins/SitesManager/images/code.svg';
}
public static function getContentType(): int
{
return self::TYPE_TRACKER;
}
public static function getPriority(): int
{
return 1;
}
public function isDetected(?string $data = null, ?array $headers = null): bool
{
$tests = ['/matomo\.js/i', '/piwik\.js/i', '/_paq\.push/i'];
foreach ($tests as $test) {
if (preg_match($test, $data) === 1) {
return true;
}
}
return false;
}
public function renderInstructionsTab(SiteContentDetector $detector): string
{
$view = new View('@SitesManager/_matomoTabInstructions');
$dntChecker = new DoNotTrackHeaderChecker();
$maxCustomVariables = 0;
$matomoUrl = Url::getCurrentUrlWithoutFileName();
$idSite = \Piwik\Request::fromRequest()->getIntegerParameter('idSite');
$jsTag = Request::processRequest('SitesManager.getJavascriptTag', ['idSite' => $idSite, 'piwikUrl' => $matomoUrl]);
if (Manager::getInstance()->isPluginActivated('CustomVariables')) {
$maxCustomVariables = CustomVariables::getNumUsableCustomVariables();
}
$view->jsTag = $jsTag;
$view->isJsTrackerInstallCheckAvailable = Manager::getInstance()->isPluginActivated('JsTrackerInstallCheck');
$view->serverSideDoNotTrackEnabled = $dntChecker->isActive();
$view->maxCustomVariables = $maxCustomVariables;
$view->defaultSiteDecoded = [
'id' => $idSite,
'name' => Common::unsanitizeInputValue(Site::getNameFor($idSite)),
];
$view->notificationMessage = $this->getConsentManagerNotification($detector);
return $view->render();
}
public function isRecommended(SiteContentDetector $detector): bool
{
return false; // do not recommend this, as it's used as fall back
}
public function getRecommendationDetails(SiteContentDetector $detector): array
{
$details = parent::getRecommendationDetails($detector);
$details['text'] = Piwik::translate('SitesManager_SetupMatomoTracker');
return $details;
}
private function getConsentManagerNotification(SiteContentDetector $detector): string
{
$consentManagers = $detector->getDetectsByType(SiteContentDetectionAbstract::TYPE_CONSENT_MANAGER);
if (empty($consentManagers)) {
return '';
}
$consentManagerId = reset($consentManagers);
$consentManager = $detector->getSiteContentDetectionById($consentManagerId);
if (empty($consentManager)) {
return '';
}
$consentManagerName = $consentManager::getName();
$consentManagerUrl = $consentManager::getInstructionUrl();
$consentManagerIsConnected = in_array($consentManagerId, $detector->connectedConsentManagers);
$notificationMessage = '<p>' . Piwik::translate('PrivacyManager_ConsentManagerDetected', [$consentManagerName, Url::getExternalLinkTag($consentManagerUrl), '</a>']) . '</p>';
if (!empty($consentManagerIsConnected)) {
$notificationMessage .= '<p>' . Piwik::translate('SitesManager_ConsentManagerConnected', [$consentManagerName]) . '</p>';
}
return $notificationMessage;
}
}
|