Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@gmail.com>2016-03-10 00:55:45 +0300
committerThomas Steur <thomas.steur@gmail.com>2016-04-11 05:11:33 +0300
commitb52ae4e7e488e0474d67c54578e1d6c1aa066bff (patch)
treef94b02f774cbc24faaa18f29ee1e19fef8b338af /plugins/WebsiteMeasurable
parent6ba622a68a26792af8cc22131f488f7ff5189d2c (diff)
refs #7983 let plugins add or remove fields to websites and better settings api
Diffstat (limited to 'plugins/WebsiteMeasurable')
-rw-r--r--plugins/WebsiteMeasurable/MeasurableSettings.php314
-rw-r--r--plugins/WebsiteMeasurable/Settings/Urls.php141
-rw-r--r--plugins/WebsiteMeasurable/Type.php1
3 files changed, 456 insertions, 0 deletions
diff --git a/plugins/WebsiteMeasurable/MeasurableSettings.php b/plugins/WebsiteMeasurable/MeasurableSettings.php
new file mode 100644
index 0000000000..625007238f
--- /dev/null
+++ b/plugins/WebsiteMeasurable/MeasurableSettings.php
@@ -0,0 +1,314 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\WebsiteMeasurable;
+use Piwik\IP;
+use Piwik\Network\IPUtils;
+use Piwik\Piwik;
+use Piwik\Plugin;
+use Piwik\Plugins\WebsiteMeasurable\Settings\Urls;
+use Piwik\Settings\Setting;
+use Piwik\Settings\FieldConfig;
+use Piwik\Plugins\SitesManager;
+use Exception;
+
+/**
+ * Defines Settings for ExampleSettingsPlugin.
+ *
+ * Usage like this:
+ * $settings = new MeasurableSettings($idSite);
+ * $settings->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 $ecommerce;
+
+ /**
+ * @var SitesManager\API
+ */
+ private $sitesManagerApi;
+
+ /**
+ * @var Plugin\Manager
+ */
+ private $pluginManager;
+
+ public function __construct(SitesManager\API $api, Plugin\Manager $pluginManager, $idSite, $idMeasurableType)
+ {
+ $this->sitesManagerApi = $api;
+ $this->pluginManager = $pluginManager;
+
+ parent::__construct($idSite, $idMeasurableType);
+ }
+
+ protected function init()
+ {
+ $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();
+
+ /**
+ * SiteSearch
+ */
+ $this->siteSearch = $this->makeSiteSearch();
+ $this->useDefaultSiteSearchParams = $this->makeUseDefaultSiteSearchParams($this->sitesManagerApi);
+ $this->siteSearchKeywords = $this->makeSiteSearchKeywords();
+
+ $siteSearchKeywords = $this->siteSearchKeywords->getValue();
+ $this->useDefaultSiteSearchParams->setDefaultValue(empty($siteSearchKeywords));
+
+ $this->siteSearchCategory = $this->makeSiteSearchCategory($this->pluginManager);
+ /**
+ * SiteSearch End
+ */
+
+ $this->ecommerce = $this->makeEcommerce();
+ }
+
+ private function makeExcludeUnknownUrls()
+ {
+ 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')
+ . '<br />'
+ . Piwik::translate('SitesManager_OnlyMatchedUrlsAllowedHelpExamples');
+ $field->uiControl = FieldConfig::UI_CONTROL_CHECKBOX;
+ });
+ }
+
+ private function makeKeepUrlFragments(SitesManager\API $sitesManagerApi)
+ {
+ 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 = array(
+ '0' => $default . ' (' . Piwik::translate('General_Default') . ')',
+ '1' => Piwik::translate('General_Yes'),
+ '2' => Piwik::translate('General_No')
+ );
+ });
+ }
+
+ private function makeExcludeIps()
+ {
+ return $this->makeProperty('excluded_ips', $default = array(), FieldConfig::TYPE_ARRAY, function (FieldConfig $field) {
+ $ip = IP::getIpFromHeader();
+
+ $field->title = Piwik::translate('SitesManager_ExcludedIps');
+ $field->inlineHelp = Piwik::translate('SitesManager_HelpExcludedIps', array('1.2.3.*', '1.2.*.*'))
+ . '<br /><br />'
+ . Piwik::translate('SitesManager_YourCurrentIpAddressIs', array('<i>' . $ip . '</i>'));
+ $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA;
+ $field->uiControlAttributes = array('cols' => '20', 'rows' => '4');
+
+ $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', array($ip, "1.2.3.4, 1.2.3.*, or 1.2.3.4/5")));
+ }
+ }
+ }
+ };
+ $field->transform = function ($value) {
+ if (empty($value)) {
+ return array();
+ }
+
+ $ips = array_map('trim', $value);
+ $ips = array_filter($ips, 'strlen');
+ return $ips;
+ };
+ });
+ }
+
+ private function makeExcludedParameters()
+ {
+ $self = $this;
+ return $this->makeProperty('excluded_parameters', $default = array(), FieldConfig::TYPE_ARRAY, function (FieldConfig $field) use ($self) {
+ $field->title = Piwik::translate('SitesManager_ExcludedParameters');
+ $field->inlineHelp = Piwik::translate('SitesManager_ListOfQueryParametersToExclude')
+ . '<br /><br />'
+ . Piwik::translate('SitesManager_PiwikWillAutomaticallyExcludeCommonSessionParameters', array('phpsessid, sessionid, ...'));
+ $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA;
+ $field->uiControlAttributes = array('cols' => '20', 'rows' => '4');
+ $field->transform = function ($value) use ($self) {
+ return $self->checkAndReturnCommaSeparatedStringList($value);
+ };
+ });
+ }
+
+ private function makeExcludedUserAgents()
+ {
+ $self = $this;
+ return $this->makeProperty('excluded_user_agents', $default = array(), FieldConfig::TYPE_ARRAY, function (FieldConfig $field) use ($self) {
+ $field->title = Piwik::translate('SitesManager_ExcludedUserAgents');
+ $field->inlineHelp = Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp1')
+ . '<br /><br />'
+ . Piwik::translate('SitesManager_GlobalListExcludedUserAgents_Desc')
+ . '<br />'
+ . Piwik::translate('SitesManager_GlobalExcludedUserAgentHelp2');
+ $field->uiControl = FieldConfig::UI_CONTROL_TEXTAREA;
+ $field->uiControlAttributes = array('cols' => '20', 'rows' => '4');
+ $field->transform = function ($value) use ($self) {
+ return $self->checkAndReturnCommaSeparatedStringList($value);
+ };
+ });
+ }
+
+ private function makeSiteSearch()
+ {
+ 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 = array(
+ 1 => Piwik::translate('SitesManager_EnableSiteSearch'),
+ 0 => Piwik::translate('SitesManager_DisableSiteSearch')
+ );
+ });
+ }
+
+ private function makeUseDefaultSiteSearchParams(SitesManager\API $sitesManagerApi)
+ {
+ return $this->makeSetting('use_default_site_search_params', $default = true, FieldConfig::TYPE_BOOL, function (FieldConfig $field) use ($sitesManagerApi) {
+
+ if (Piwik::hasUserSuperUserAccess()) {
+ $title = Piwik::translate('SitesManager_SearchUseDefault', array("<a href='#globalSettings'>","</a>"));
+ } else {
+ $title = Piwik::translate('SitesManager_SearchUseDefault', array('', ''));
+ }
+
+ $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 () {
+ return null;// never actually save a value for this
+ };
+ });
+ }
+
+ private function makeSiteSearchKeywords()
+ {
+ return $this->makeProperty('sitesearch_keyword_parameters', $default = array(), FieldConfig::TYPE_ARRAY, function (FieldConfig $field) {
+ $field->title = Piwik::translate('SitesManager_SearchKeywordLabel');
+ $field->uiControl = FieldConfig::UI_CONTROL_TEXT;
+ $field->inlineHelp = Piwik::translate('SitesManager_SearchKeywordParametersDesc');
+ $field->condition = Piwik::translate('sitesearch && !use_default_site_search_params');
+ });
+ }
+
+ private function makeSiteSearchCategory(Plugin\Manager $pluginManager)
+ {
+ return $this->makeProperty('sitesearch_category_parameters', $default = array(), 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')
+ . '<br /><br />'
+ . Piwik::translate('SitesManager_SearchCategoryParametersDesc');
+
+ $hasCustomVars = (int) $pluginManager->isPluginActivated('CustomVariables');
+ $field->condition = $hasCustomVars . ' && 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')
+ . '<br />'
+ . Piwik::translate('SitesManager_PiwikOffersEcommerceAnalytics',
+ array("<a href='http://piwik.org/docs/ecommerce-analytics/' target='_blank'>", '</a>'));
+ $field->uiControl = FieldConfig::UI_CONTROL_SINGLE_SELECT;
+ $field->availableValues = array(
+ 0 => Piwik::translate('SitesManager_NotAnEcommerceSite'),
+ 1 => Piwik::translate('SitesManager_EnableEcommerce')
+ );
+ });
+ }
+
+ public function checkAndReturnCommaSeparatedStringList($parameters)
+ {
+ if (empty($parameters)) {
+ return array();
+ }
+
+ $parameters = array_map('trim', $parameters);
+ $parameters = array_filter($parameters, 'strlen');
+ $parameters = array_unique($parameters);
+ return $parameters;
+ }
+
+}
diff --git a/plugins/WebsiteMeasurable/Settings/Urls.php b/plugins/WebsiteMeasurable/Settings/Urls.php
new file mode 100644
index 0000000000..3aa023c1e0
--- /dev/null
+++ b/plugins/WebsiteMeasurable/Settings/Urls.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\WebsiteMeasurable\Settings;
+use Piwik\Common;
+use Piwik\Piwik;
+use Piwik\Plugin;
+use Piwik\Settings\FieldConfig;
+use Piwik\Plugins\SitesManager;
+use Exception;
+use Piwik\UrlHelper;
+
+class Urls extends \Piwik\Settings\Measurable\MeasurableProperty
+{
+
+ public function __construct($idSite)
+ {
+ $name = 'urls';
+ $pluginName = 'WebsiteMeasurable';
+ $defaultValue = array('http://siteUrl.com/', 'http://siteUrl2.com/');
+ $type = FieldConfig::TYPE_ARRAY;
+
+ parent::__construct($name, $defaultValue, $type, $pluginName, $idSite);
+ }
+
+ public function configureField()
+ {
+ if ($this->config) {
+ return $this->config;
+ }
+
+ $config = new FieldConfig();
+ $config->title = Piwik::translate('SitesManager_Urls');
+ $config->inlineHelp = Piwik::translate('SitesManager_AliasUrlHelp');
+ $config->uiControl = FieldConfig::UI_CONTROL_TEXTAREA;
+ $config->uiControlAttributes = array('cols' => '25', 'rows' => '3');
+
+ $self = $this;
+ $config->validate = function ($urls) use ($self) {
+ $self->checkUrls($urls);
+ $self->checkAtLeastOneUrl($urls);
+ };
+
+ $config->transform = function ($urls) use ($self) {
+ return $this->cleanParameterUrls($urls);
+ };
+
+ $this->config = $config;
+ return $this->config;
+ }
+
+ /**
+ * Checks that the array has at least one element
+ *
+ * @param array $urls
+ * @throws Exception
+ */
+ public function checkAtLeastOneUrl($urls)
+ {
+ $urls = $this->cleanParameterUrls($urls);
+
+ if (!is_array($urls)
+ || count($urls) == 0
+ ) {
+ throw new Exception(Piwik::translate('SitesManager_ExceptionNoUrl'));
+ }
+ }
+
+ /**
+ * Check that the array of URLs are valid URLs
+ *
+ * @param array $urls
+ * @throws Exception if any of the urls is not valid
+ */
+ public function checkUrls($urls)
+ {
+ $urls = $this->cleanParameterUrls($urls);
+
+ foreach ($urls as $url) {
+ if (!UrlHelper::isLookLikeUrl($url)) {
+ throw new Exception(sprintf(Piwik::translate('SitesManager_ExceptionInvalidUrl'), $url));
+ }
+ }
+ }
+
+ /**
+ * Clean the parameter URLs:
+ * - if the parameter is a string make it an array
+ * - remove the trailing slashes if found
+ *
+ * @param string|array urls
+ * @return array the array of cleaned URLs
+ */
+ public function cleanParameterUrls($urls)
+ {
+ if (!is_array($urls)) {
+ $urls = array($urls);
+ }
+
+ $urls = array_filter($urls);
+ $urls = array_map('urldecode', $urls);
+
+ foreach ($urls as &$url) {
+ $url = $this->removeTrailingSlash($url);
+ $scheme = parse_url($url, PHP_URL_SCHEME);
+ if (empty($scheme)
+ && strpos($url, '://') === false
+ ) {
+ $url = 'http://' . $url;
+ }
+ $url = trim($url);
+ $url = Common::sanitizeInputValue($url);
+ }
+
+ $urls = array_unique($urls);
+ return $urls;
+ }
+
+ /**
+ * Remove the final slash in the URLs if found
+ *
+ * @param string $url
+ * @return string the URL without the trailing slash
+ */
+ private function removeTrailingSlash($url)
+ {
+ // if there is a final slash, we take the URL without this slash (expected URL format)
+ if (strlen($url) > 5
+ && $url[strlen($url) - 1] == '/'
+ ) {
+ $url = substr($url, 0, strlen($url) - 1);
+ }
+
+ return $url;
+ }
+}
diff --git a/plugins/WebsiteMeasurable/Type.php b/plugins/WebsiteMeasurable/Type.php
index 714b9dd580..0552f47103 100644
--- a/plugins/WebsiteMeasurable/Type.php
+++ b/plugins/WebsiteMeasurable/Type.php
@@ -15,5 +15,6 @@ class Type extends \Piwik\Measurable\Type
protected $namePlural = 'SitesManager_Sites'; // translated into more languages
protected $description = 'WebsiteMeasurable_WebsiteDescription';
protected $howToSetupUrl = '?module=CoreAdminHome&action=trackingCodeGenerator';
+
}