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 <tsteur@users.noreply.github.com>2016-03-29 06:53:22 +0300
committerThomas Steur <tsteur@users.noreply.github.com>2016-03-29 06:53:22 +0300
commit218ed92b0b6e0093c5a09189847189b1cc134d04 (patch)
tree9a12a9ebce0e4054a95eaac09da7108e0ad2d667
parentbad2c752d3926dc2d45a54556aa72d8cca542a18 (diff)
parent2884da2b668cd0844e090982643dc4b0f1ef4517 (diff)
Merge pull request #9973 from piwik/9896
Keep Page URL fragments when tracking Page URLs" not persistent
-rw-r--r--core/Access.php13
-rw-r--r--core/AssetManager.php13
-rw-r--r--core/BaseFactory.php7
-rwxr-xr-xcore/Twig.php117
-rw-r--r--core/Unzip.php4
-rw-r--r--core/UpdateCheck.php3
-rw-r--r--core/WidgetsList.php8
-rw-r--r--plugins/CoreHome/templates/_dataTableCell.twig15
-rw-r--r--plugins/Live/templates/getLastVisitsStart.twig35
-rw-r--r--plugins/SitesManager/Controller.php1
-rw-r--r--plugins/SitesManager/Menu.php1
-rw-r--r--plugins/SitesManager/Model.php34
-rw-r--r--plugins/SitesManager/angularjs/sites-manager/multiline-field.directive.html1
-rw-r--r--plugins/SitesManager/angularjs/sites-manager/sites-manager-site.controller.js9
-rw-r--r--plugins/SitesManager/angularjs/sites-manager/sites-manager.controller.js19
-rw-r--r--plugins/SitesManager/templates/dialogs/dialogs.html1
-rw-r--r--plugins/SitesManager/templates/dialogs/edit-dialog.html1
-rw-r--r--plugins/SitesManager/templates/displayJavascriptCode.twig1
-rw-r--r--plugins/SitesManager/templates/help/timezone-help.html3
-rw-r--r--plugins/SitesManager/templates/index.html8
-rw-r--r--plugins/SitesManager/templates/siteWithoutData.twig4
-rw-r--r--plugins/SitesManager/templates/sites-list/site-fields.html2
-rw-r--r--plugins/UsersManager/Model.php105
-rw-r--r--plugins/UsersManager/tests/Integration/APITest.php11
-rw-r--r--plugins/VisitFrequency/Controller.php1
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('{', '&#x7B;', '&#123;', '&lcub;', '&lbrace;', '&#x0007B;');
+
+ 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 . '&#8291;' . $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('&nbsp;', html_entity_decode('&nbsp;'), $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) %}<span class="cell-tooltip" data-tooltip="{{ row.getMetadata(tooltipIndex) }}">{% endif %}
{% if not row.getIdSubDataTable() and column=='label' and row.getMetadata('url') %}
- <a rel="noreferrer" target="_blank" href='{% if row.getMetadata('url')|slice(0,4) not in ['http','ftp:'] %}http://{% endif %}{{ row.getMetadata('url')|rawSafeDecoded }}'>
+ <a rel="noreferrer"
+ target="_blank"
+ href='{% if row.getMetadata('url')|slice(0,4) not in ['http','ftp:'] %}http://{% endif %}{{ row.getMetadata('url')|rawSafeDecoded }}'>
{% if not row.getMetadata('logo') %}
- <img class="link" width="10" height="9" src="plugins/Morpheus/images/link.gif"/>
+ <img class="link" width="10" height="9"
+ src="plugins/Morpheus/images/link.gif"/>
{% 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 %}
- <span class="ratio" title="{{ reportRatioTooltip|raw }} {{ totalRatioTooltip|e('html_attr') }}">&nbsp;{{ rowPercentage }}</span>
+ <span class="ratio"
+ title="{{ reportRatioTooltip|raw }} {{ totalRatioTooltip|e('html_attr') }}"
+ >&nbsp;{{ rowPercentage }}</span>
{%- endif %}
{% if column=='label' %}
@@ -42,7 +47,7 @@
{% if row.getMetadata('html_label_prefix') %}<span class='label-prefix'>{{ row.getMetadata('html_label_prefix') | raw }}&nbsp;</span>{% endif -%}
{%- if row.getMetadata('html_label_suffix') %}<span class='label-suffix'>{{ row.getMetadata('html_label_suffix') | raw }}</span>{% endif -%}
{% endif %}<span class="value">
- {%- 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 -%}</span>
{% if column=='label' %}</span>{% 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 %}
<br />
- {% if visitor.countryFlag is defined %}&nbsp;<img src="{{ visitor.countryFlag }}" title="{{ visitor.location }}, {{ 'Provider_ColumnProvider'|translate }} {% if visitor.providerName is defined %}{{ visitor.providerName }}{% endif %}"/>{% endif %}
- {% if visitor.browserIcon is defined %}&nbsp;<img src="{{ visitor.browserIcon }}" title="{{ visitor.browser }}{% if visitor.plugins is defined %}, {{ 'General_Plugins'|translate }}: {{ visitor.plugins }}{% endif %}"/>{% endif %}
+ {% if visitor.countryFlag is defined %}&nbsp;<img src="{{ visitor.countryFlag }}" title="{{ visitor.location|e('html_attr') }}, {{ 'Provider_ColumnProvider'|translate }} {% if visitor.providerName is defined %}{{ visitor.providerName }}{% endif %}"/>{% endif %}
+ {% if visitor.browserIcon is defined %}&nbsp;<img src="{{ visitor.browserIcon }}" title="{{ visitor.browser|e('html_attr') }}{% if visitor.plugins is defined %}, {{ 'General_Plugins'|translate }}: {{ visitor.plugins }}{% endif %}"/>{% endif %}
{% if visitor.operatingSystemIcon is defined %}&nbsp;<img src="{{ visitor.operatingSystemIcon }}" title="{{ visitor.operatingSystem }}{% if visitor.resolution is defined %}, {{ visitor.resolution }}{% endif %}"/>{% endif %}
&nbsp;
{% if visitor.visitConverted %}
- <span title="{{ 'General_VisitConvertedNGoals'|translate(visitor.goalConversions) }}" class='visitorRank'>
+ <span title="{{ 'General_VisitConvertedNGoals'|translate(visitor.goalConversions) }}"
+ class='visitorRank'>
<img src="{{ visitor.visitConvertedIcon }}" />
<span class='hash'>#</span>
{{ visitor.goalConversions }}
{% if visitor.visitEcommerceStatusIcon %}
- <img src="{{ visitor.visitEcommerceStatusIcon }}" title="{{ visitor.visitEcommerceStatus }}"/>
+ <img src="{{ visitor.visitEcommerceStatusIcon }}" title="{{ visitor.visitEcommerceStatus|e('html_attr') }}"/>
{% endif %}
</span>
{% endif %}
{% if visitor.visitorTypeIcon %}
- <img src="{{ visitor.visitorTypeIcon }}" title="{{ 'General_ReturningVisitor'|translate }}"/>
+ <img src="{{ visitor.visitorTypeIcon }}"
+ title="{{ 'General_ReturningVisitor'|translate }}"/>
{% endif %}
{% if visitor.visitIp %} <span title="{% if visitor.visitorId is not empty %}{{ 'General_VisitorID'|translate }}: {{ visitor.visitorId }}{% endif %}">
@@ -46,33 +48,45 @@
{% if visitor.referrerType is defined and visitor.referrerType != 'direct' %}
{{ 'General_FromReferrer'|translate }}
{% if visitor.referrerUrl is not empty %}
- <a href="{{ visitor.referrerUrl }}" rel="noreferrer" target="_blank">
+ <a rel="noreferrer" target="_blank"
+ href="{{ visitor.referrerUrl|e('html_attr') }}">
{% endif %}
+
{% if visitor.searchEngineIcon is defined %}
<img src="{{ visitor.searchEngineIcon }}" />
{% endif %}
+
{{ visitor.referrerName }}
+
{% if visitor.referrerUrl is not empty %}
</a>
{% 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 %}
- <span title='{{ 'Live_KeywordRankedOnSearchResultForThisVisitor'|translate(keyword,position,searchName) }}' class='visitorRank'>
+ <span title='{{ 'Live_KeywordRankedOnSearchResultForThisVisitor'|translate(keyword,position,searchName) }}'
+ class='visitorRank'>
<span class='hash'>#</span> {{ visitor.referrerKeywordPosition }}
</span>
{% endif %}
+
{% elseif visitor.referrerType is defined %}
{{ 'Referrers_DirectEntry'|translate }}
{% endif %}
</span></div>
- <div id="{{ visitor.idVisit }}_actions" class="settings">
- <span class="pagesTitle" title="{{ visitor.actionDetails|length }} {{ 'General_Actions'|translate }}">{{ 'General_Actions'|translate }}:</span>&nbsp;
+ <div id="{{ visitor.idVisit|e('html_attr') }}_actions" class="settings">
+ <span class="pagesTitle"
+ title="{{ visitor.actionDetails|length }} {{ 'General_Actions'|translate }}"
+ >{{ 'General_Actions'|translate }}:</span>&nbsp;
{% 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 %}
</span>
+
{% else %}
+
{% set col = col + 1 %}
{% if col >= 9 %}
{% set col = 0 %}
@@ -136,6 +152,7 @@
{% endif %}
{% endif %}
{% endfor %}
+
{% if visitor.actionDetails|length > maxPagesDisplayedByVisitor %}
<em>({{ 'Live_MorePagesNotDisplayed'|translate }})</em>
{% 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()">
-
</textarea>
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 @@
<div ng-include="'plugins/SitesManager/templates/dialogs/edit-dialog.html'"></div>
-
<div ng-include="'plugins/SitesManager/templates/dialogs/remove-dialog.html'"></div>
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 @@
<div class="ui-confirm" piwik-dialog="site.editDialog.show">
-
<h2>{{ site.editDialog.title }}</h2>
<input role="no" type="button" value="{{ 'General_Ok'|translate }}"/>
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 @@
</span>
<br/>
-
{{ 'SitesManager_UTCTimeIs'| translate : (utcTime | date : 'yyyy-MM-dd HH:mm:ss') }}
-
<br/>
-
{{ 'SitesManager_ChangingYourTimezoneWillOnlyAffectDataForward'|translate }}
</div>
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 @@
<div ng-controller="SitesManagerController" class="SitesManager">
-
<div ng-include="'plugins/SitesManager/templates/sites-manager-header.html?cb=' + cacheBuster" class="sites-manager-header"></div>
-
<div ng-include="'plugins/SitesManager/templates/loading.html?cb=' + cacheBuster"></div>
-
<div ng-include="'plugins/SitesManager/templates/sites-list/add-site-link.html?cb=' + cacheBuster"></div>
-
<div ng-include="'plugins/SitesManager/templates/sites-list/add-entity-dialog.html?cb=' + cacheBuster"></div>
-
<div ng-include="'plugins/SitesManager/templates/sites-list/sites-list.html?cb=' + cacheBuster"></div>
-
<div class="bottomButtonBar" ng-include="'plugins/SitesManager/templates/sites-list/add-site-link.html?cb=' + cacheBuster"></div>
-
<div ng-include="'plugins/SitesManager/templates/global-settings.html?cb=' + cacheBuster"></div>
-
</div>
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('<a href="' ~ linkTo({
'module': 'CoreAdminHome',
'action': 'trackingCodeGenerator',
- }) ~ '">', '</a>')|raw }}
+ }) ~ '">', "</a>")|raw }}
</p>
<p>
@@ -41,7 +41,7 @@
{{ 'SitesManager_SiteWithoutDataSetupGoals'|translate('<a href="' ~ linkTo({
'module': 'Goals',
'action': 'manage',
- }) ~ '">', '</a>')|raw }}
+ }) ~ '">', "</a>")|raw }}
</p>
{{ 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 @@
<div class="form-group">
<label>{{ 'SitesManager_KeepURLFragmentsLong'|translate }}</label>
- <select ng-options="key as value for (key, value) in keepURLFragmentsOptions"
+ <select ng-options="option.key as option.value for option in keepURLFragmentsOptions"
ng-model="site.keep_url_fragment"></select>
</div>
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(