autoRefresh->getValue(); * $settings->metric->getValue(); */ class MeasurableSettings extends \Piwik\Settings\Measurable\MeasurableSettings { /** @var Setting */ public $urls; /** @var Setting */ public $onlyTrackWhitelstedUrls; /** @var Setting */ public $keepPageUrlFragments; /** @var Setting */ public $excludeKnownUrls; /** @var Setting */ public $excludedUserAgents; /** @var Setting */ public $excludedIps; /** @var Setting */ public $siteSearch; /** @var Setting */ public $useDefaultSiteSearchParams; /** @var Setting */ public $siteSearchKeywords; /** @var Setting */ public $siteSearchCategory; /** @var Setting */ public $excludedParameters; /** @var Setting */ public $excludedReferrers; /** @var Setting */ public $ecommerce; /** * @var SitesManager\API */ private $sitesManagerApi; /** * @var Plugin\Manager */ private $pluginManager; /** * @var TypeManager */ private $typeManager; /** * @var bool */ private $unsetSiteSearchKeywords = false; public function __construct( SitesManager\API $api, Plugin\Manager $pluginManager, TypeManager $typeManager, $idSite, $idMeasurableType ) { $this->sitesManagerApi = $api; $this->pluginManager = $pluginManager; $this->typeManager = $typeManager; parent::__construct($idSite, $idMeasurableType); } protected function shouldShowSettingsForType($type) { $isWebsite = $type === Type::ID; if ($isWebsite) { return true; } // if no such type exists, we default to website properties return !$this->typeManager->isExistingType($type); } protected function init() { if (!$this->shouldShowSettingsForType($this->idMeasurableType)) { return; } $this->urls = new Urls($this->idSite); $this->addSetting($this->urls); $this->excludeKnownUrls = $this->makeExcludeUnknownUrls(); $this->keepPageUrlFragments = $this->makeKeepUrlFragments($this->sitesManagerApi); $this->excludedIps = $this->makeExcludeIps(); $this->excludedParameters = $this->makeExcludedParameters(); $this->excludedUserAgents = $this->makeExcludedUserAgents(); $this->excludedReferrers = $this->makeExcludedReferrers($this->sitesManagerApi); /** * SiteSearch */ $this->siteSearch = $this->makeSiteSearch(); $this->useDefaultSiteSearchParams = $this->makeUseDefaultSiteSearchParams($this->sitesManagerApi); $this->siteSearchKeywords = $this->makeSiteSearchKeywords(); $siteSearchKeywords = $this->siteSearchKeywords->getValue(); $areSiteSearchKeywordsEmpty = empty($siteSearchKeywords) || (is_array($siteSearchKeywords) && implode("", $siteSearchKeywords) == ""); $this->useDefaultSiteSearchParams->setDefaultValue($areSiteSearchKeywordsEmpty); $this->siteSearchCategory = $this->makeSiteSearchCategory($this->pluginManager); /** * SiteSearch End */ $this->ecommerce = $this->makeEcommerce(); } private function makeExcludeUnknownUrls(): MeasurableProperty { return $this->makeProperty('exclude_unknown_urls', $default = false, FieldConfig::TYPE_BOOL, function (FieldConfig $field) { $field->title = Piwik::translate('SitesManager_OnlyMatchedUrlsAllowed'); $field->inlineHelp = Piwik::translate('SitesManager_OnlyMatchedUrlsAllowedHelp') . '
' . Piwik::translate('SitesManager_OnlyMatchedUrlsAllowedHelpExamples'); $field->uiControl = FieldConfig::UI_CONTROL_CHECKBOX; }); } private function makeKeepUrlFragments(SitesManager\API $sitesManagerApi): MeasurableProperty { return $this->makeProperty('keep_url_fragment', $default = '0', FieldConfig::TYPE_STRING, function (FieldConfig $field) use ($sitesManagerApi) { $field->title = Piwik::translate('SitesManager_KeepURLFragmentsLong'); $field->uiControl = FieldConfig::UI_CONTROL_SINGLE_SELECT; if ($sitesManagerApi->getKeepURLFragmentsGlobal()) { $default = Piwik::translate('General_Yes'); } else { $default = Piwik::translate('General_No'); } $field->availableValues = [ '0' => $default . ' (' . Piwik::translate('General_Default') . ')', '1' => Piwik::translate('General_Yes'), '2' => Piwik::translate('General_No') ]; }); } private function makeExcludeIps(): MeasurableProperty { return $this->makeProperty('excluded_ips', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) { $ip = IP::getIpFromHeader(); $field->title = Piwik::translate('SitesManager_ExcludedIps'); $field->inlineHelp = Piwik::translate('SitesManager_HelpExcludedIpAddresses', ['1.2.3.4/24', '1.2.3.*', '1.2.*.*']) . '

' . Piwik::translate('SitesManager_YourCurrentIpAddressIs', ['' . $ip . '']); $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA; $field->uiControlAttributes = [ 'cols' => '20', 'rows' => '4', 'placeholder' => $ip, ]; $field->validate = function ($value) { if (!empty($value)) { $ips = array_map('trim', $value); $ips = array_filter($ips, 'strlen'); foreach ($ips as $ip) { if (IPUtils::getIPRangeBounds($ip) === null) { throw new Exception(Piwik::translate('SitesManager_ExceptionInvalidIPFormat', [$ip, "1.2.3.4, 1.2.3.*, or 1.2.3.4/5"])); } } } }; $field->transform = function ($value) { if (empty($value)) { return []; } $ips = array_map('trim', $value); $ips = array_filter($ips, 'strlen'); return $ips; }; }); } private function makeExcludedParameters(): MeasurableProperty { $self = $this; return $this->makeProperty('excluded_parameters', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) use ($self) { $field->title = Piwik::translate('SitesManager_ExcludedParameters'); $field->inlineHelp = Piwik::translate('SitesManager_ListOfQueryParametersToExclude', "/^sess.*|.*[dD]ate$/") . '

' . Piwik::translate('SitesManager_PiwikWillAutomaticallyExcludeCommonSessionParameters', ['phpsessid, sessionid, ...']); $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA; $field->uiControlAttributes = ['cols' => '20', 'rows' => '4']; $field->transform = function ($value) use ($self) { return $self->checkAndReturnCommaSeparatedStringList($value); }; }); } private function makeExcludedUserAgents(): MeasurableProperty { $self = $this; return $this->makeProperty('excluded_user_agents', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) use ($self) { $field->title = Piwik::translate('SitesManager_ExcludedUserAgents'); $field->inlineHelp = Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp1') . '

' . Piwik::translate('SitesManager_GlobalListExcludedUserAgents_Desc') . '
' . Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp2') . " " . Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp3', "/bot|spider|crawl|scanner/i") ; $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA; $field->uiControlAttributes = ['cols' => '20', 'rows' => '4']; $field->transform = function ($value) use ($self) { return $self->checkAndReturnCommaSeparatedStringList($value); }; }); } private function makeExcludedReferrers(SitesManager\API $sitesManagerApi): MeasurableProperty { $self = $this; return $this->makeProperty('excluded_referrers', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) use ($sitesManagerApi, $self) { $field->title = Piwik::translate('SitesManager_ExcludedReferrers'); $referrersGlobal = $sitesManagerApi->getExcludedReferrersGlobal(); $field->inlineHelp = Piwik::translate('SitesManager_ExcludedReferrersHelp') . '

' . Piwik::translate('SitesManager_ExcludedReferrersHelpDetails') . '
' . Piwik::translate('SitesManager_ExcludedReferrersHelpExamples', [ 'www.example.org', 'http://example.org/mypath', 'https://www.example.org/?param=1', 'https://sub.example.org/' ]) . '

' . Piwik::translate('SitesManager_ExcludedReferrersHelpSubDomains', [ '.sub.example.org', 'http://sub.example.org/mypath', 'https://new.sub.example.org/' ]) ; if (!empty($referrersGlobal)) { $field->inlineHelp .= '

' . '' . Piwik::translate('SitesManager_GlobalListExcludedReferrers') . '
' . $referrersGlobal; } $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA; $field->uiControlAttributes = ['cols' => '20', 'rows' => '4']; $field->validate = function ($value) { if (!empty($value)) { $urls = array_map('trim', $value); $urls = array_filter($urls, 'strlen'); foreach ($urls as $url) { // We allow urls to be provided: // - fully qualified like http://example.url/path // - without protocol like example.url/path // - with subdomain wildcard like .example.url/path $prefixedUrl = 'https://' . ltrim(preg_replace('/^https?:\/\//', '', $url), '.'); $parsedUrl = @parse_url($prefixedUrl); if (false === $parsedUrl || !UrlHelper::isLookLikeUrl($prefixedUrl)) { throw new Exception(Piwik::translate('SitesManager_ExceptionInvalidUrl', [$url])); } } } }; $field->transform = function ($value) use ($self) { return $self->checkAndReturnCommaSeparatedStringList($value); }; }); } private function makeSiteSearch(): MeasurableProperty { return $this->makeProperty('sitesearch', $default = 1, FieldConfig::TYPE_INT, function (FieldConfig $field) { $field->title = Piwik::translate('Actions_SubmenuSitesearch'); $field->inlineHelp = Piwik::translate('SitesManager_SiteSearchUse'); $field->uiControl = FieldConfig::UI_CONTROL_SINGLE_SELECT; $field->availableValues = [ 1 => Piwik::translate('SitesManager_EnableSiteSearch'), 0 => Piwik::translate('SitesManager_DisableSiteSearch') ]; }); } private function makeUseDefaultSiteSearchParams(SitesManager\API $sitesManagerApi) { $settings = $this; return $this->makeSetting('use_default_site_search_params', $default = true, FieldConfig::TYPE_BOOL, function (FieldConfig $field) use ($sitesManagerApi, $settings) { if (Piwik::hasUserSuperUserAccess()) { $title = Piwik::translate('SitesManager_SearchUseDefault', ["",""]); } else { $title = Piwik::translate('SitesManager_SearchUseDefault', ['', '']); } $field->title = $title; $field->uiControl = FieldConfig::UI_CONTROL_CHECKBOX; $searchKeywordsGlobal = $sitesManagerApi->getSearchKeywordParametersGlobal(); $hasParams = (int) !empty($searchKeywordsGlobal); $field->condition = $hasParams . ' && sitesearch'; $searchKeywordsGlobal = $sitesManagerApi->getSearchKeywordParametersGlobal(); $searchCategoryGlobal = $sitesManagerApi->getSearchCategoryParametersGlobal(); $field->description = Piwik::translate('SitesManager_SearchKeywordLabel'); $field->description .= ' (' . Piwik::translate('General_Default') . ')'; $field->description .= ': '; $field->description .= $searchKeywordsGlobal; $field->description .= ' & '; $field->description .= Piwik::translate('SitesManager_SearchCategoryLabel'); $field->description .= ': '; $field->description .= $searchCategoryGlobal; $field->transform = function ($value) use ($settings) { if ($value) { $settings->unsetSiteSearchKeywords = true; } return null; // never actually save a value for this }; }); } private function makeSiteSearchKeywords() { $settings = $this; return $this->makeProperty('sitesearch_keyword_parameters', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) use ($settings) { $field->title = Piwik::translate('SitesManager_SearchKeywordLabel'); $field->uiControl = FieldConfig::UI_CONTROL_TEXT; $field->inlineHelp = Piwik::translate('SitesManager_SearchKeywordParametersDesc'); $field->condition = 'sitesearch && !use_default_site_search_params'; $field->transform = function ($value) use ($settings) { if ($settings->unsetSiteSearchKeywords) { return ''; } return $value; }; }); } private function makeSiteSearchCategory(Plugin\Manager $pluginManager) { return $this->makeProperty('sitesearch_category_parameters', $default = [], FieldConfig::TYPE_ARRAY, function (FieldConfig $field) use ($pluginManager) { $field->title = Piwik::translate('SitesManager_SearchCategoryLabel'); $field->uiControl = FieldConfig::UI_CONTROL_TEXT; $field->inlineHelp = Piwik::translate('Goals_Optional') . '

' . Piwik::translate('SitesManager_SearchCategoryParametersDesc'); $field->condition = 'sitesearch && !use_default_site_search_params'; }); } private function makeEcommerce() { return $this->makeProperty('ecommerce', $default = 0, FieldConfig::TYPE_INT, function (FieldConfig $field) { $field->title = Piwik::translate('Goals_Ecommerce'); $field->inlineHelp = Piwik::translate('SitesManager_EcommerceHelp') . '
' . Piwik::translate( 'SitesManager_PiwikOffersEcommerceAnalytics', ["", ''] ); $field->uiControl = FieldConfig::UI_CONTROL_SINGLE_SELECT; $field->availableValues = [ 0 => Piwik::translate('SitesManager_NotAnEcommerceSite'), 1 => Piwik::translate('SitesManager_EnableEcommerce') ]; }); } public function checkAndReturnCommaSeparatedStringList($parameters) { if (empty($parameters)) { return []; } $parameters = array_map('trim', $parameters); $parameters = array_filter($parameters, 'strlen'); $parameters = array_unique($parameters); return $parameters; } }