From 2884da2b668cd0844e090982643dc4b0f1ef4517 Mon Sep 17 00:00:00 2001 From: Thomas Steur Date: Thu, 17 Mar 2016 13:13:08 +1300 Subject: fix #9896 Keep Page URL fragments when tracking Page URLs" not persistent --- core/Access.php | 13 ++- core/AssetManager.php | 13 ++- core/BaseFactory.php | 7 +- core/Twig.php | 117 +++++++++++++++++---- core/Unzip.php | 4 + core/UpdateCheck.php | 3 +- core/WidgetsList.php | 8 +- plugins/CoreHome/templates/_dataTableCell.twig | 15 ++- plugins/Live/templates/getLastVisitsStart.twig | 35 ++++-- plugins/SitesManager/Controller.php | 1 - plugins/SitesManager/Menu.php | 1 + plugins/SitesManager/Model.php | 34 +++--- .../sites-manager/multiline-field.directive.html | 1 - .../sites-manager/sites-manager-site.controller.js | 9 +- .../sites-manager/sites-manager.controller.js | 19 ++-- .../SitesManager/templates/dialogs/dialogs.html | 1 - .../templates/dialogs/edit-dialog.html | 1 - .../templates/displayJavascriptCode.twig | 1 - .../SitesManager/templates/help/timezone-help.html | 3 - plugins/SitesManager/templates/index.html | 8 -- .../SitesManager/templates/siteWithoutData.twig | 4 +- .../templates/sites-list/site-fields.html | 2 +- plugins/UsersManager/Model.php | 105 +++++++++++------- plugins/UsersManager/tests/Integration/APITest.php | 11 ++ plugins/VisitFrequency/Controller.php | 1 + 25 files changed, 288 insertions(+), 129 deletions(-) diff --git a/core/Access.php b/core/Access.php index 881810bfca..c8b9bafea0 100644 --- a/core/Access.php +++ b/core/Access.php @@ -10,6 +10,7 @@ namespace Piwik; use Exception; use Piwik\Container\StaticContainer; +use Piwik\Plugins\SitesManager\API as SitesManagerApi; /** * Singleton that manages user access to Piwik resources. @@ -145,7 +146,7 @@ class Access $this->login = null; // if the Auth wasn't set, we may be in the special case of setSuperUser(), otherwise we fail TODO: docs + review - if ($this->auth === null) { + if (!isset($this->auth)) { return false; } @@ -207,7 +208,8 @@ class Access if ($this->hasSuperUserAccess) { if (empty($this->idsitesByAccess['superuser'])) { try { - $allSitesId = Plugins\SitesManager\API::getInstance()->getAllSitesId(); + $api = SitesManagerApi::getInstance(); + $allSitesId = $api->getAllSitesId(); } catch (\Exception $e) { $allSitesId = array(); } @@ -460,17 +462,18 @@ class Access { $isSuperUser = self::getInstance()->hasSuperUserAccess(); - self::getInstance()->setSuperUserAccess(true); + $access = self::getInstance(); + $access->setSuperUserAccess(true); try { $result = $function(); } catch (Exception $ex) { - self::getInstance()->setSuperUserAccess($isSuperUser); + $access->setSuperUserAccess($isSuperUser); throw $ex; } - self::getInstance()->setSuperUserAccess($isSuperUser); + $access->setSuperUserAccess($isSuperUser); return $result; } diff --git a/core/AssetManager.php b/core/AssetManager.php index 407a2058c0..54c09515f5 100644 --- a/core/AssetManager.php +++ b/core/AssetManager.php @@ -123,7 +123,7 @@ class AssetManager extends Singleton $this->getMergedCoreJSAsset()->delete(); $this->getMergedNonCoreJSAsset()->delete(); - $result .= $this->getIndividualJsIncludes(); + $result .= $this->getIndividualCoreAndNonCoreJsIncludes(); } else { $result .= sprintf(self::JS_IMPORT_DIRECTIVE, self::GET_CORE_JS_MODULE_ACTION); $result .= sprintf(self::JS_IMPORT_DIRECTIVE, self::GET_NON_CORE_JS_MODULE_ACTION); @@ -290,7 +290,7 @@ class AssetManager extends Singleton * * @return string */ - private function getIndividualJsIncludes() + private function getIndividualCoreAndNonCoreJsIncludes() { return $this->getIndividualJsIncludesFromAssetFetcher($this->getCoreJScriptFetcher()) . @@ -305,7 +305,9 @@ class AssetManager extends Singleton { $jsIncludeString = ''; - foreach ($assetFetcher->getCatalog()->getAssets() as $jsFile) { + $assets = $assetFetcher->getCatalog()->getAssets(); + + foreach ($assets as $jsFile) { $jsFile->validateFile(); $jsIncludeString = $jsIncludeString . sprintf(self::JS_IMPORT_DIRECTIVE, $jsFile->getRelativeLocation()); } @@ -339,10 +341,11 @@ class AssetManager extends Singleton return false; } - $plugin = Manager::getInstance()->getLoadedPlugin($pluginName); + $pluginManager = Manager::getInstance(); + $plugin = $pluginManager->getLoadedPlugin($pluginName); if ($plugin->isTheme()) { - $theme = Manager::getInstance()->getTheme($pluginName); + $theme = $pluginManager->getTheme($pluginName); $javaScriptFiles = $theme->getJavaScriptFiles(); diff --git a/core/BaseFactory.php b/core/BaseFactory.php index 24425c8fee..32b4090bc2 100644 --- a/core/BaseFactory.php +++ b/core/BaseFactory.php @@ -34,13 +34,18 @@ abstract class BaseFactory $className = static::getClassNameFromClassId($classId); if (!class_exists($className)) { - Common::sendHeader('Content-Type: text/plain; charset=utf-8'); + self::sendPlainHeader(); throw new Exception(static::getInvalidClassIdExceptionMessage($classId)); } return new $className; } + private static function sendPlainHeader() + { + Common::sendHeader('Content-Type: text/plain; charset=utf-8'); + } + /** * Should return a class name based on the class's associated string ID. */ diff --git a/core/Twig.php b/core/Twig.php index c3b6ba7414..9f17e0b218 100755 --- a/core/Twig.php +++ b/core/Twig.php @@ -23,6 +23,85 @@ use Twig_SimpleFilter; use Twig_SimpleFunction; use Twig_SimpleTest; +function piwik_filter_truncate($string, $size) +{ + if (strlen($string) < $size) { + return $string; + } else { + $array = str_split($string, $size); + return array_shift($array) . "..."; + } +} + +function piwik_format_number($string, $minFractionDigits, $maxFractionDigits) +{ + $formatter = NumberFormatter::getInstance(); + return $formatter->format($string, $minFractionDigits, $maxFractionDigits); +} + +function piwik_fix_lbrace($string) +{ + $chars = array('{', '{', '{', '{', '{', '{'); + + static $search; + static $replace; + + if (!isset($search)) { + $search = array_map(function ($val) { return $val . $val; }, $chars); + } + if (!isset($replace)) { + $replace = array_map(function ($val) { return $val . '⁣' . $val; }, $chars); + } + + return str_replace($search, $replace, $string); +} + +function piwik_escape_filter(Twig_Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false) { + + $string = twig_escape_filter($env, $string, $strategy, $charset, $autoescape); + + switch ($strategy) { + case 'html': + case 'html_attr': + return piwik_fix_lbrace($string); + case 'url': + $encoded = rawurlencode('{'); + return str_replace('{{', $encoded . $encoded, $string); + case 'css': + case 'js': + default: + return $string; + } +} + +function piwik_format_money($amount, $idSite) +{ + $currencySymbol = Site::getCurrencySymbolFor($idSite); + $numberFormatter = NumberFormatter::getInstance(); + return $numberFormatter->formatCurrency($amount, $currencySymbol, GoalManager::REVENUE_PRECISION); +} + +class PiwikTwigFilterExtension extends \Twig_Extension +{ + public function getFilters() + { + return array( + new Twig_SimpleFilter('e', '\Piwik\piwik_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')), + new Twig_SimpleFilter('escape', '\Piwik\piwik_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')) + ); + } + + /** + * Returns the name of the extension. + * + * @return string The extension name + */ + public function getName() + { + return 'escaper2'; + } +} + /** * Twig class * @@ -84,8 +163,8 @@ class Twig $this->addFilter_money(); $this->addFilter_truncate(); $this->addFilter_notification(); - $this->addFilter_percentage(); $this->addFilter_percent(); + $this->addFilter_percentage(); $this->addFilter_percentEvolution(); $this->addFilter_piwikProAdLink(); $this->addFilter_piwikProOnPremisesAdLink(); @@ -109,6 +188,8 @@ class Twig $this->addTest_false(); $this->addTest_true(); $this->addTest_emptyString(); + + $this->twig->addExtension(new PiwikTwigFilterExtension()); } private function addTest_false() @@ -287,7 +368,9 @@ class Twig $string = str_replace('+', '%2B', $string); $string = str_replace(' ', html_entity_decode(' '), $string); - return SafeDecodeLabel::decodeLabelSafe($string); + $string = SafeDecodeLabel::decodeLabelSafe($string); + + return piwik_fix_lbrace($string); }, array('is_safe' => array('all'))); $this->twig->addFilter($rawSafeDecoded); @@ -304,7 +387,8 @@ class Twig protected function addFilter_percentage() { $percentage = new Twig_SimpleFilter('percentage', function ($string, $totalValue, $precision = 1) { - return NumberFormatter::getInstance()->formatPercent(Piwik::getPercentageSafe($string, $totalValue, $precision), $precision); + $formatter = NumberFormatter::getInstance(); + return $formatter->formatPercent(Piwik::getPercentageSafe($string, $totalValue, $precision), $precision); }); $this->twig->addFilter($percentage); } @@ -312,7 +396,8 @@ class Twig protected function addFilter_percent() { $percentage = new Twig_SimpleFilter('percent', function ($string, $precision = 1) { - return NumberFormatter::getInstance()->formatPercent($string, $precision); + $formatter = NumberFormatter::getInstance(); + return $formatter->formatPercent($string, $precision); }); $this->twig->addFilter($percentage); } @@ -320,7 +405,8 @@ class Twig protected function addFilter_percentEvolution() { $percentage = new Twig_SimpleFilter('percentEvolution', function ($string) { - return NumberFormatter::getInstance()->formatPercentEvolution($string); + $formatter = NumberFormatter::getInstance(); + return $formatter->formatPercentEvolution($string); }); $this->twig->addFilter($percentage); } @@ -371,7 +457,7 @@ class Twig protected function addFilter_number() { $formatter = new Twig_SimpleFilter('number', function ($string, $minFractionDigits = 0, $maxFractionDigits = 0) { - return NumberFormatter::getInstance()->format($string, $minFractionDigits, $maxFractionDigits); + return piwik_format_number($string, $minFractionDigits, $maxFractionDigits); }); $this->twig->addFilter($formatter); } @@ -379,27 +465,20 @@ class Twig protected function addFilter_truncate() { $truncateFilter = new Twig_SimpleFilter('truncate', function ($string, $size) { - if (strlen($string) < $size) { - return $string; - } else { - $array = str_split($string, $size); - return array_shift($array) . "..."; - } + return piwik_filter_truncate($string, $size); }); $this->twig->addFilter($truncateFilter); } protected function addFilter_money() { - $formatter = $this->formatter; - $moneyFilter = new Twig_SimpleFilter('money', function ($amount) use ($formatter) { + $moneyFilter = new Twig_SimpleFilter('money', function ($amount) { if (func_num_args() != 2) { throw new Exception('the money modifier expects one parameter: the idSite.'); } $idSite = func_get_args(); $idSite = $idSite[1]; - $currencySymbol = Site::getCurrencySymbolFor($idSite); - return NumberFormatter::getInstance()->formatCurrency($amount, $currencySymbol, GoalManager::REVENUE_PRECISION); + return piwik_format_money($amount, $idSite); }); $this->twig->addFilter($moneyFilter); } @@ -445,7 +524,8 @@ class Twig private function addPluginNamespaces(Twig_Loader_Filesystem $loader) { - $plugins = \Piwik\Plugin\Manager::getInstance()->getAllPluginsNames(); + $pluginManager = \Piwik\Plugin\Manager::getInstance(); + $plugins = $pluginManager->getAllPluginsNames(); foreach ($plugins as $name) { $path = sprintf("%s/plugins/%s/templates/", PIWIK_INCLUDE_PATH, $name); if (is_dir($path)) { @@ -461,7 +541,8 @@ class Twig */ private function addCustomPluginNamespaces(Twig_Loader_Filesystem $loader, $pluginName) { - $plugins = \Piwik\Plugin\Manager::getInstance()->getAllPluginsNames(); + $pluginManager = \Piwik\Plugin\Manager::getInstance(); + $plugins = $pluginManager->getAllPluginsNames(); foreach ($plugins as $name) { $path = sprintf("%s/plugins/%s/templates/plugins/%s/", PIWIK_INCLUDE_PATH, $pluginName, $name); if (is_dir($path)) { diff --git a/core/Unzip.php b/core/Unzip.php index ffef2add15..af1c14a815 100644 --- a/core/Unzip.php +++ b/core/Unzip.php @@ -33,15 +33,19 @@ class Unzip return new ZipArchive($filename); } break; + case 'tar.gz': return new Tar($filename, 'gz'); + case 'tar.bz2': return new Tar($filename, 'bz2'); + case 'gz': if (function_exists('gzopen')) { return new Gzip($filename); } break; + case 'PclZip': default: return new PclZip($filename); diff --git a/core/UpdateCheck.php b/core/UpdateCheck.php index b176ed87c3..e2ce130c4a 100644 --- a/core/UpdateCheck.php +++ b/core/UpdateCheck.php @@ -68,7 +68,8 @@ class UpdateCheck */ private static function getLatestAvailableVersionNumber() { - $channel = StaticContainer::get('\Piwik\Plugin\ReleaseChannels')->getActiveReleaseChannel(); + $releaseChannels = StaticContainer::get('\Piwik\Plugin\ReleaseChannels'); + $channel = $releaseChannels->getActiveReleaseChannel(); $url = $channel->getUrlToCheckForLatestAvailableVersion(); try { diff --git a/core/WidgetsList.php b/core/WidgetsList.php index 8380d7a1ee..bafc94323d 100644 --- a/core/WidgetsList.php +++ b/core/WidgetsList.php @@ -71,8 +71,7 @@ class WidgetsList extends Singleton } self::addWidgets(); - - uksort(self::$widgets, array('Piwik\WidgetsList', '_sortWidgetCategories')); + self::sortWidgets(); $widgets = array(); foreach (self::$widgets as $key => $v) { @@ -91,6 +90,11 @@ class WidgetsList extends Singleton return $widgets; } + private static function sortWidgets() + { + uksort(self::$widgets, array('Piwik\WidgetsList', '_sortWidgetCategories')); + } + private static function addWidgets() { if (!self::$hookCalled) { diff --git a/plugins/CoreHome/templates/_dataTableCell.twig b/plugins/CoreHome/templates/_dataTableCell.twig index 1bcd1bb0f2..ac6b935d7c 100644 --- a/plugins/CoreHome/templates/_dataTableCell.twig +++ b/plugins/CoreHome/templates/_dataTableCell.twig @@ -2,9 +2,12 @@ {% set tooltipIndex = column ~ '_tooltip' %} {% if row.getMetadata(tooltipIndex) %}{% endif %} {% if not row.getIdSubDataTable() and column=='label' and row.getMetadata('url') %} - + {% if not row.getMetadata('logo') %} - + {% endif %} {% endif %} @@ -19,7 +22,7 @@ {% endif %} {% set rowPercentage = row.getColumn(column)|percentage(reportTotal, 1) %} {% set metricTitle = translations[column]|default(column) %} - {% set reportLabel = row.getColumn(labelColumn)|truncate(40)|raw %} + {% set reportLabel = row.getColumn(labelColumn)|truncate(40)|rawSafeDecoded %} {% set reportRatioTooltip = 'General_ReportRatioTooltip'|translate(reportLabel, rowPercentage|e('html_attr'), reportTotal|e('html_attr'), metricTitle|e('html_attr'), translations[labelColumn]|default(labelColumn)|e('html_attr')) %} @@ -30,7 +33,9 @@ {% set totalRatioTooltip = '' %} {% endif %} -  {{ rowPercentage }} +  {{ rowPercentage }} {%- endif %} {% if column=='label' %} @@ -42,7 +47,7 @@ {% if row.getMetadata('html_label_prefix') %}{{ row.getMetadata('html_label_prefix') | raw }} {% endif -%} {%- if row.getMetadata('html_label_suffix') %}{{ row.getMetadata('html_label_suffix') | raw }}{% endif -%} {% endif %} - {%- if row.getColumn(column) %}{% if column=='label' %}{{- row.getColumn(column)|raw -}}{% else %}{{- row.getColumn(column)|number(2,0)|raw -}}{% endif %} + {%- if row.getColumn(column) %}{% if column=='label' %}{{- row.getColumn(column)|rawSafeDecoded -}}{% else %}{{- row.getColumn(column)|number(2,0)|raw -}}{% endif %} {%- else -%}- {%- endif -%} {% if column=='label' %}{% endif %} diff --git a/plugins/Live/templates/getLastVisitsStart.twig b/plugins/Live/templates/getLastVisitsStart.twig index 59a4a1fb9d..064a3545ae 100644 --- a/plugins/Live/templates/getLastVisitsStart.twig +++ b/plugins/Live/templates/getLastVisitsStart.twig @@ -19,23 +19,25 @@ {% endif %}
- {% if visitor.countryFlag is defined %} {% endif %} - {% if visitor.browserIcon is defined %} {% endif %} + {% if visitor.countryFlag is defined %} {% endif %} + {% if visitor.browserIcon is defined %} {% endif %} {% if visitor.operatingSystemIcon is defined %} {% endif %}   {% if visitor.visitConverted %} - + # {{ visitor.goalConversions }} {% if visitor.visitEcommerceStatusIcon %} - + {% endif %} {% endif %} {% if visitor.visitorTypeIcon %} - + {% endif %} {% if visitor.visitIp %} @@ -46,33 +48,45 @@ {% if visitor.referrerType is defined and visitor.referrerType != 'direct' %} {{ 'General_FromReferrer'|translate }} {% if visitor.referrerUrl is not empty %} -
+ {% endif %} + {% if visitor.searchEngineIcon is defined %} {% endif %} + {{ visitor.referrerName }} + {% if visitor.referrerUrl is not empty %} {% endif %} + {% if visitor.referrerKeyword is not empty %} - "{{ visitor.referrerKeyword }}"{% endif %} + {% set keyword %}{{ visitor.referrerKeyword }}{% endset %} {% set searchName %}{{ visitor.referrerName }}{% endset %} {% set position %}#{{ visitor.referrerKeywordPosition}}{% endset %} + {% if visitor.referrerKeywordPosition is not empty %} - + # {{ visitor.referrerKeywordPosition }} {% endif %} + {% elseif visitor.referrerType is defined %} {{ 'Referrers_DirectEntry'|translate }} {% endif %} -
- {{ 'General_Actions'|translate }}:  +
+ {{ 'General_Actions'|translate }}:  {% set col = 0 %} {% for action in visitor.actionDetails %} {% if loop.index <= maxPagesDisplayedByVisitor %} + {% if action.type == 'ecommerceOrder' or action.type == 'ecommerceAbandonedCart' %} {% set title %} {%- if action.type == 'ecommerceOrder' %} @@ -104,7 +118,9 @@ {{ 'General_ColumnRevenue'|translate }}: {{ action.revenue|money(idSite)|raw }} {% endif %} + {% else %} + {% set col = col + 1 %} {% if col >= 9 %} {% set col = 0 %} @@ -136,6 +152,7 @@ {% endif %} {% endif %} {% endfor %} + {% if visitor.actionDetails|length > maxPagesDisplayedByVisitor %} ({{ 'Live_MorePagesNotDisplayed'|translate }}) {% endif %} diff --git a/plugins/SitesManager/Controller.php b/plugins/SitesManager/Controller.php index fc7b7eb6e8..d64fb45fa9 100644 --- a/plugins/SitesManager/Controller.php +++ b/plugins/SitesManager/Controller.php @@ -63,7 +63,6 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $response = new ResponseBuilder(Common::getRequestVar('format')); $globalSettings = array(); - $globalSettings['keepURLFragmentsGlobal'] = API::getInstance()->getKeepURLFragmentsGlobal(); $globalSettings['siteSpecificUserAgentExcludeEnabled'] = API::getInstance()->isSiteSpecificUserAgentExcludeEnabled(); $globalSettings['defaultCurrency'] = API::getInstance()->getDefaultCurrency(); diff --git a/plugins/SitesManager/Menu.php b/plugins/SitesManager/Menu.php index a9e82e6024..d242a25351 100644 --- a/plugins/SitesManager/Menu.php +++ b/plugins/SitesManager/Menu.php @@ -44,6 +44,7 @@ class Menu extends \Piwik\Plugin\Menu if (count($types) === 1) { // only one type is in use, use this one for the wording return reset($types); + } else { // multiple types are activated, check whether only one is actually in use $model = new Model(); diff --git a/plugins/SitesManager/Model.php b/plugins/SitesManager/Model.php index 96062b608a..5e69d308e7 100644 --- a/plugins/SitesManager/Model.php +++ b/plugins/SitesManager/Model.php @@ -41,8 +41,9 @@ class Model */ public function getSitesFromGroup($group) { - $sites = $this->getDb()->fetchAll("SELECT * FROM " . $this->table . " - WHERE `group` = ?", $group); + $db = $this->getDb(); + $sites = $db->fetchAll("SELECT * FROM " . $this->table . " + WHERE `group` = ?", $group); return $sites; } @@ -55,7 +56,8 @@ class Model */ public function getSitesGroups() { - $groups = $this->getDb()->fetchAll("SELECT DISTINCT `group` FROM " . $this->table); + $db = $this->getDb(); + $groups = $db->fetchAll("SELECT DISTINCT `group` FROM " . $this->table); $cleanedGroups = array(); foreach ($groups as $group) { @@ -72,7 +74,8 @@ class Model */ public function getAllSites() { - $sites = $this->getDb()->fetchAll("SELECT * FROM " . $this->table . " ORDER BY idsite ASC"); + $db = $this->getDb(); + $sites = $db->fetchAll("SELECT * FROM " . $this->table . " ORDER BY idsite ASC"); return $sites; } @@ -111,7 +114,8 @@ class Model { $siteUrlTable = Common::prefixTable('site_url'); - $ids = $this->getDb()->fetchAll( + $db = $this->getDb(); + $ids = $db->fetchAll( 'SELECT idsite FROM ' . $this->table . ' WHERE main_url IN ( ' . Common::getSqlStringFieldsArray($urls) . ') ' . 'UNION @@ -137,7 +141,8 @@ class Model $siteUrlTable = Common::prefixTable('site_url'); $sqlAccessSite = Access::getSqlAccessSite('idsite'); - $ids = $this->getDb()->fetchAll( + $db = $this->getDb(); + $ids = $db->fetchAll( 'SELECT idsite FROM ' . $this->table . ' WHERE main_url IN ( ' . Common::getSqlStringFieldsArray($urls) . ')' . @@ -171,7 +176,8 @@ class Model $query = 'SELECT idsite FROM ' . $this->table . ' WHERE timezone IN (' . Common::getSqlStringFieldsArray($timezones) . ') ORDER BY idsite ASC'; - $sites = $this->getDb()->fetchAll($query, $timezones); + $db = $this->getDb(); + $sites = $db->fetchAll($query, $timezones); return $sites; } @@ -223,8 +229,9 @@ class Model */ public function getSiteFromId($idSite) { - $site = $this->getDb()->fetchRow("SELECT * FROM " . $this->table . " - WHERE idsite = ?", $idSite); + $db = $this->getDb(); + $site = $db->fetchRow("SELECT * FROM " . $this->table . " + WHERE idsite = ?", $idSite); return $site; } @@ -237,7 +244,7 @@ class Model */ public function getSitesId() { - $result = Db::fetchAll("SELECT idsite FROM " . Common::prefixTable('site')); + $result = Db::fetchAll("SELECT idsite FROM " . Common::prefixTable('site')); $idSites = array(); foreach ($result as $idSite) { @@ -277,7 +284,8 @@ class Model { $db = $this->getDb(); $result = $db->fetchAll("SELECT url FROM " . Common::prefixTable("site_url") . " - WHERE idsite = ?", $idSite); + WHERE idsite = ?", $idSite); + $urls = array(); foreach ($result as $url) { $urls[] = $url['url']; @@ -354,7 +362,9 @@ class Model public function getUsedTypeIds() { $types = array(); - $rows = $this->getDb()->fetchAll("SELECT DISTINCT `type` as typeid FROM " . $this->table); + + $db = $this->getDb(); + $rows = $db->fetchAll("SELECT DISTINCT `type` as typeid FROM " . $this->table); foreach ($rows as $row) { $types[] = $row['typeid']; diff --git a/plugins/SitesManager/angularjs/sites-manager/multiline-field.directive.html b/plugins/SitesManager/angularjs/sites-manager/multiline-field.directive.html index fed8822dc1..2e1bf44bf7 100644 --- a/plugins/SitesManager/angularjs/sites-manager/multiline-field.directive.html +++ b/plugins/SitesManager/angularjs/sites-manager/multiline-field.directive.html @@ -3,5 +3,4 @@ rows="{{ rows }}" ng-model="field.value" ng-change="onChange()"> - diff --git a/plugins/SitesManager/angularjs/sites-manager/sites-manager-site.controller.js b/plugins/SitesManager/angularjs/sites-manager/sites-manager-site.controller.js index d759ec940f..0fac17cc22 100644 --- a/plugins/SitesManager/angularjs/sites-manager/sites-manager-site.controller.js +++ b/plugins/SitesManager/angularjs/sites-manager/sites-manager-site.controller.js @@ -135,22 +135,25 @@ "http://siteUrl2.com/" ]; $scope.site.exclude_unknown_urls = 0; - $scope.site.keep_url_fragment = "0"; + $scope.site.keep_url_fragment = 0; $scope.site.excluded_ips = []; $scope.site.excluded_parameters = []; $scope.site.excluded_user_agents = []; $scope.site.sitesearch_keyword_parameters = []; $scope.site.sitesearch_category_parameters = []; - $scope.site.sitesearch = $scope.globalSettings.searchKeywordParametersGlobal.length ? "1" : "0"; + $scope.site.sitesearch = $scope.globalSettings.searchKeywordParametersGlobal.length ? 1 : 0; $scope.site.timezone = $scope.globalSettings.defaultTimezone; $scope.site.currency = $scope.globalSettings.defaultCurrency; - $scope.site.ecommerce = "0"; + $scope.site.ecommerce = 0; updateSiteWithSiteSearchConfig(); }; var initExistingSite = function() { + $scope.site.keep_url_fragment = parseInt($scope.site.keep_url_fragment, 10); + $scope.site.ecommerce = parseInt($scope.site.ecommerce, 10); + $scope.site.sitesearch = parseInt($scope.site.sitesearch, 10); $scope.site.excluded_ips = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.excluded_ips); $scope.site.excluded_parameters = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.excluded_parameters); $scope.site.excluded_user_agents = sitesManagerApiHelper.commaDelimitedFieldToArray($scope.site.excluded_user_agents); diff --git a/plugins/SitesManager/angularjs/sites-manager/sites-manager.controller.js b/plugins/SitesManager/angularjs/sites-manager/sites-manager.controller.js index 100e75bbf7..9860667e71 100644 --- a/plugins/SitesManager/angularjs/sites-manager/sites-manager.controller.js +++ b/plugins/SitesManager/angularjs/sites-manager/sites-manager.controller.js @@ -118,8 +118,8 @@ var initEcommerceSelectOptions = function() { $scope.eCommerceptions = [ - {key: '0', value: translate('SitesManager_NotAnEcommerceSite')}, - {key: '1', value: translate('SitesManager_EnableEcommerce')} + {key: 0, value: translate('SitesManager_NotAnEcommerceSite')}, + {key: 1, value: translate('SitesManager_EnableEcommerce')} ]; }; @@ -189,18 +189,17 @@ var initSiteSearchSelectOptions = function() { $scope.siteSearchOptions = [ - {key: '1', value: translate('SitesManager_EnableSiteSearch')}, - {key: '0', value: translate('SitesManager_DisableSiteSearch')} + {key: 1, value: translate('SitesManager_EnableSiteSearch')}, + {key: 0, value: translate('SitesManager_DisableSiteSearch')} ]; }; var initKeepURLFragmentsList = function() { - - $scope.keepURLFragmentsOptions = { - 0: ($scope.globalSettings.keepURLFragmentsGlobal ? translate('General_Yes') : translate('General_No')) + ' (' + translate('General_Default') + ')', - 1: translate('General_Yes'), - 2: translate('General_No') - }; + $scope.keepURLFragmentsOptions = [ + {key: 0, value: ($scope.globalSettings.keepURLFragmentsGlobal ? translate('General_Yes') : translate('General_No')) + ' (' + translate('General_Default') + ')'}, + {key: 1, value: translate('General_Yes')}, + {key: 2, value: translate('General_No')} + ]; }; var addNewEntity = function () { diff --git a/plugins/SitesManager/templates/dialogs/dialogs.html b/plugins/SitesManager/templates/dialogs/dialogs.html index 476505e7bf..2f3d5d8072 100644 --- a/plugins/SitesManager/templates/dialogs/dialogs.html +++ b/plugins/SitesManager/templates/dialogs/dialogs.html @@ -1,3 +1,2 @@
-
diff --git a/plugins/SitesManager/templates/dialogs/edit-dialog.html b/plugins/SitesManager/templates/dialogs/edit-dialog.html index afb9910869..1bb6067f47 100644 --- a/plugins/SitesManager/templates/dialogs/edit-dialog.html +++ b/plugins/SitesManager/templates/dialogs/edit-dialog.html @@ -1,5 +1,4 @@
-

{{ site.editDialog.title }}

diff --git a/plugins/SitesManager/templates/displayJavascriptCode.twig b/plugins/SitesManager/templates/displayJavascriptCode.twig index 9b514b69c0..05d867030e 100644 --- a/plugins/SitesManager/templates/displayJavascriptCode.twig +++ b/plugins/SitesManager/templates/displayJavascriptCode.twig @@ -1,6 +1,5 @@ {% extends 'admin.twig' %} {% block content %} - {% include "@SitesManager/_displayJavascriptCode.twig" %} {% endblock %} \ No newline at end of file diff --git a/plugins/SitesManager/templates/help/timezone-help.html b/plugins/SitesManager/templates/help/timezone-help.html index 0308b783b5..f77ad7863e 100644 --- a/plugins/SitesManager/templates/help/timezone-help.html +++ b/plugins/SitesManager/templates/help/timezone-help.html @@ -9,10 +9,7 @@
- {{ 'SitesManager_UTCTimeIs'| translate : (utcTime | date : 'yyyy-MM-dd HH:mm:ss') }} -
- {{ 'SitesManager_ChangingYourTimezoneWillOnlyAffectDataForward'|translate }}
diff --git a/plugins/SitesManager/templates/index.html b/plugins/SitesManager/templates/index.html index cfdca4a970..adedf3e644 100644 --- a/plugins/SitesManager/templates/index.html +++ b/plugins/SitesManager/templates/index.html @@ -1,17 +1,9 @@
-
-
-
-
-
-
-
-
diff --git a/plugins/SitesManager/templates/siteWithoutData.twig b/plugins/SitesManager/templates/siteWithoutData.twig index 498d2ee765..b1a659f31a 100644 --- a/plugins/SitesManager/templates/siteWithoutData.twig +++ b/plugins/SitesManager/templates/siteWithoutData.twig @@ -33,7 +33,7 @@ {{ 'SitesManager_SiteWithoutDataSetupTracking'|translate('', '')|raw }} + }) ~ '">', "")|raw }}

@@ -41,7 +41,7 @@ {{ 'SitesManager_SiteWithoutDataSetupGoals'|translate('', '')|raw }} + }) ~ '">', "")|raw }}

{{ trackingHelp|raw }} diff --git a/plugins/SitesManager/templates/sites-list/site-fields.html b/plugins/SitesManager/templates/sites-list/site-fields.html index 200e935e27..2f0eaa7b76 100644 --- a/plugins/SitesManager/templates/sites-list/site-fields.html +++ b/plugins/SitesManager/templates/sites-list/site-fields.html @@ -94,7 +94,7 @@
-
diff --git a/plugins/UsersManager/Model.php b/plugins/UsersManager/Model.php index e6c0971867..db0285eab6 100644 --- a/plugins/UsersManager/Model.php +++ b/plugins/UsersManager/Model.php @@ -50,9 +50,10 @@ class Model $bind = $userLogins; } - $users = $this->getDb()->fetchAll("SELECT * FROM " . $this->table . " - $where - ORDER BY login ASC", $bind); + $db = $this->getDb(); + $users = $db->fetchAll("SELECT * FROM " . $this->table . " + $where + ORDER BY login ASC", $bind); return $users; } @@ -64,7 +65,8 @@ class Model */ public function getUsersLogin() { - $users = $this->getDb()->fetchAll("SELECT login FROM " . $this->table . " ORDER BY login ASC"); + $db = $this->getDb(); + $users = $db->fetchAll("SELECT login FROM " . $this->table . " ORDER BY login ASC"); $return = array(); foreach ($users as $login) { @@ -76,9 +78,10 @@ class Model public function getUsersSitesFromAccess($access) { - $users = $this->getDb()->fetchAll("SELECT login,idsite FROM " . Common::prefixTable("access") - . " WHERE access = ? - ORDER BY login, idsite", $access); + $db = $this->getDb(); + $users = $db->fetchAll("SELECT login,idsite FROM " . Common::prefixTable("access") + . " WHERE access = ? + ORDER BY login, idsite", $access); $return = array(); foreach ($users as $user) { @@ -90,8 +93,9 @@ class Model public function getUsersAccessFromSite($idSite) { - $users = $this->getDb()->fetchAll("SELECT login,access FROM " . Common::prefixTable("access") - . " WHERE idsite = ?", $idSite); + $db = $this->getDb(); + $users = $db->fetchAll("SELECT login,access FROM " . Common::prefixTable("access") + . " WHERE idsite = ?", $idSite); $return = array(); foreach ($users as $user) { @@ -103,7 +107,8 @@ class Model public function getUsersLoginWithSiteAccess($idSite, $access) { - $users = $this->getDb()->fetchAll("SELECT login + $db = $this->getDb(); + $users = $db->fetchAll("SELECT login FROM " . Common::prefixTable("access") . " WHERE idsite = ? AND access = ?", array($idSite, $access)); @@ -133,7 +138,8 @@ class Model */ public function getSitesAccessFromUser($userLogin) { - $users = $this->getDb()->fetchAll("SELECT idsite,access FROM " . Common::prefixTable("access") + $db = $this->getDb(); + $users = $db->fetchAll("SELECT idsite,access FROM " . Common::prefixTable("access") . " WHERE login = ?", $userLogin); $return = array(); @@ -167,12 +173,14 @@ class Model public function getUserByEmail($userEmail) { - return $this->getDb()->fetchRow("SELECT * FROM " . $this->table . " WHERE email = ?", $userEmail); + $db = $this->getDb(); + return $db->fetchRow("SELECT * FROM " . $this->table . " WHERE email = ?", $userEmail); } public function getUserByTokenAuth($tokenAuth) { - return $this->getDb()->fetchRow('SELECT * FROM ' . $this->table . ' WHERE token_auth = ?', $tokenAuth); + $db = $this->getDb(); + return $db->fetchRow('SELECT * FROM ' . $this->table . ' WHERE token_auth = ?', $tokenAuth); } public function addUser($userLogin, $passwordTransformed, $email, $alias, $tokenAuth, $dateRegistered) @@ -187,17 +195,31 @@ class Model 'superuser_access' => 0 ); - $this->getDb()->insert($this->table, $user); + $db = $this->getDb(); + $db->insert($this->table, $user); } public function setSuperUserAccess($userLogin, $hasSuperUserAccess) { - $this->getDb()->update($this->table, - array( - 'superuser_access' => $hasSuperUserAccess ? 1 : 0 - ), - "login = '$userLogin'" - ); + $this->updateUserFields($userLogin, array( + 'superuser_access' => $hasSuperUserAccess ? 1 : 0 + )); + } + + private function updateUserFields($userLogin, $fields) + { + $set = array(); + $bind = array(); + + foreach ($fields as $key => $val) { + $set[] = "`$key` = ?"; + $bind[] = $val; + } + + $bind[] = $userLogin; + + $db = $this->getDb(); + $db->query(sprintf('UPDATE `%s` SET %s WHERE `login` = ?', $this->table, implode(', ', $set)), $bind); } /** @@ -207,45 +229,47 @@ class Model */ public function getUsersHavingSuperUserAccess() { - $users = $this->getDb()->fetchAll("SELECT login, email, token_auth - FROM " . Common::prefixTable("user") . " - WHERE superuser_access = 1 - ORDER BY date_registered ASC"); + $db = $this->getDb(); + $users = $db->fetchAll("SELECT login, email, token_auth + FROM " . Common::prefixTable("user") . " + WHERE superuser_access = 1 + ORDER BY date_registered ASC"); return $users; } public function updateUser($userLogin, $password, $email, $alias, $tokenAuth) { - $this->getDb()->update($this->table, - array( - 'password' => $password, - 'alias' => $alias, - 'email' => $email, - 'token_auth' => $tokenAuth - ), - "login = '$userLogin'" - ); + $this->updateUserFields($userLogin, array( + 'password' => $password, + 'alias' => $alias, + 'email' => $email, + 'token_auth' => $tokenAuth + )); } public function userExists($userLogin) { - $count = $this->getDb()->fetchOne("SELECT count(*) FROM " . $this->table . " WHERE login = ?", $userLogin); + $db = $this->getDb(); + $count = $db->fetchOne("SELECT count(*) FROM " . $this->table . " WHERE login = ?", $userLogin); return $count != 0; } public function userEmailExists($userEmail) { - $count = $this->getDb()->fetchOne("SELECT count(*) FROM " . $this->table . " WHERE email = ?", $userEmail); + $db = $this->getDb(); + $count = $db->fetchOne("SELECT count(*) FROM " . $this->table . " WHERE email = ?", $userEmail); return $count != 0; } public function addUserAccess($userLogin, $access, $idSites) { + $db = $this->getDb(); + foreach ($idSites as $idsite) { - $this->getDb()->insert(Common::prefixTable("access"), + $db->insert(Common::prefixTable("access"), array("idsite" => $idsite, "login" => $userLogin, "access" => $access) @@ -255,7 +279,8 @@ class Model public function deleteUserOnly($userLogin) { - $this->getDb()->query("DELETE FROM " . $this->table . " WHERE login = ?", $userLogin); + $db = $this->getDb(); + $db->query("DELETE FROM " . $this->table . " WHERE login = ?", $userLogin); /** * Triggered after a user has been deleted. @@ -270,13 +295,15 @@ class Model public function deleteUserAccess($userLogin, $idSites = null) { + $db = $this->getDb(); + if (is_null($idSites)) { - $this->getDb()->query("DELETE FROM " . Common::prefixTable("access") . + $db->query("DELETE FROM " . Common::prefixTable("access") . " WHERE login = ?", array($userLogin)); } else { foreach ($idSites as $idsite) { - $this->getDb()->query("DELETE FROM " . Common::prefixTable("access") . + $db->query("DELETE FROM " . Common::prefixTable("access") . " WHERE idsite = ? AND login = ?", array($idsite, $userLogin) ); diff --git a/plugins/UsersManager/tests/Integration/APITest.php b/plugins/UsersManager/tests/Integration/APITest.php index f7ab746ce6..892deedc58 100644 --- a/plugins/UsersManager/tests/Integration/APITest.php +++ b/plugins/UsersManager/tests/Integration/APITest.php @@ -178,6 +178,17 @@ class APITest extends IntegrationTestCase $this->api->setUserPreference($user2, 'ohOH_myPreferenceName', 'valueForUser2'); } + public function test_updateUser() + { + $this->api->updateUser($this->login, 'newPassword', 'email@example.com', 'newAlias', false); + + $user = $this->api->getUser($this->login); + + $this->assertSame('14a88b9d2f52c55b5fbcf9c5d9c11875', $user['password']); + $this->assertSame('email@example.com', $user['email']); + $this->assertSame('newAlias', $user['alias']); + } + public function test_getSitesAccessFromUser_forSuperUser() { $user2 = 'userLogin2'; diff --git a/plugins/VisitFrequency/Controller.php b/plugins/VisitFrequency/Controller.php index e1279206fd..da3c9e461b 100644 --- a/plugins/VisitFrequency/Controller.php +++ b/plugins/VisitFrequency/Controller.php @@ -76,6 +76,7 @@ class Controller extends \Piwik\Plugin\Controller ); $period = Common::getRequestVar('period', false); + if ($period == 'day') { // add number of unique (returning) visitors for period=day $selectableColumns = array_merge( -- cgit v1.2.3