Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 5 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM matomo:5.5.2
FROM matomo:5.7.0
# checkov:skip=CKV_DOCKER_2:Skipping HEALTHCHECK configuration for now
# checkov:skip=CKV_DOCKER_3:The container actually runs as www-data user

Expand All @@ -9,16 +9,16 @@ COPY ./files/plugin-EnvironmentVariables-5.0.3/ /var/www/html/plugins/Environmen
COPY ./files/plugin-CustomVariables-5.0.4/ /var/www/html/plugins/CustomVariables

# Add the HeatmapSessionRecording plugin
COPY ./files/plugin-HeatmapSessionRecording-5.3.1/ /var/www/html/plugins/HeatmapSessionRecording
COPY ./files/plugin-HeatmapSessionRecording-5.3.3/ /var/www/html/plugins/HeatmapSessionRecording

# Add the UsersFlow plugin
COPY ./files/plugin-UsersFlow-5.0.6/ /var/www/html/plugins/UsersFlow
COPY ./files/plugin-UsersFlow-5.0.7/ /var/www/html/plugins/UsersFlow

# Add the SearchEngineKeywordsPerformance plugin
COPY ./files/plugin-SearchEngineKeywordsPerformance-5.0.23/ /var/www/html/plugins/SearchEngineKeywordsPerformance
COPY ./files/plugin-SearchEngineKeywordsPerformance-5.0.26/ /var/www/html/plugins/SearchEngineKeywordsPerformance

# Add the CustomReports plugin
COPY ./files/plugin-CustomReports-5.4.5/ /var/www/html/plugins/CustomReports
COPY ./files/plugin-CustomReports-5.4.9/ /var/www/html/plugins/CustomReports

# Our custom configuration settings.
COPY ./files/config.ini.php /var/www/html/config/config.ini.php
Expand Down
4 changes: 3 additions & 1 deletion docs/HowTos/HOWTO-matomo-upgrade.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ These instructions assume you are working in the **dev** environment. Change to

1. Ensure that an out-of-band backup of the current `config/config.ini.php` exists
* SSH (via AWSCLI + Session Manager) to the container(see the [Troubleshooting](./HOWTO-miscellaneous.md) section for the AWS CLI connection command).
* Run `cp /var/www/html/config/* /mnt/efs/backup/config`
* Run `/usr/local/bin/backup-data.sh`
1. Make any necessary changes to the repo.
* For version upgrades, change line 1 in **Dockerfile** to the new version.
* Verify plugin versions for compatibility with new version of Matomo. See **Update Matomo Plugins** below for more details.
Expand Down Expand Up @@ -51,5 +51,7 @@ Often, an update to the version of Matomo will require an update to a plugin ver
* Run `cp /var/www/html/config/* /mnt/efs/backup/config`
1. Visit [Matomo plugins](https://plugins.matomo.org), select the correct version of Matomo, and then search for the plugins that are currently in use in our instance of Matomo.
* If there is a newer version, download it from the site, unzip it, and store the unzipped folder in the [files/](../../files/) directory, following the naming convention in place (e.g., `plugin-<plugin_name>-<version>`)
1. Visit [Matomo Premium Plugins](https://shop.matomo.org), and sign in with the credentials from LastPass and download the latest versions of the premium plugins in use in our instance of Matomo.
* As above, if there is a newer version, unzip it and store the unzipped folder in the [files/](../../files/) directory, following the naming convention in place (e.g., `plugin-<plugin_name>-<version>`)
1. Update the [Dockerfile](../../Dockerfile) to reference the newer version of the plugin stored in the [files/](../../files/) directory.
1. Proceed with the publishing process as outlined in the **Update Matomo Version** instructions above.
2 changes: 2 additions & 0 deletions docs/HowTos/HOWTO-premium-plugins.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Premium Plugins

Updated premium plugins can be downloaded from [matomo on-premise marketplaces](https://shop.matomo.org). See LastPass for credentials.

Premium plugins are those that require a license key. In our docker-ized implementation of Matomo, this gets tricky.

After some initial testing in Dev1, it's not as simple as just dumping the new plugin into the container and redeploying because of the following reasons.
Expand Down
3 changes: 3 additions & 0 deletions files/config.ini.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
enable_trusted_host_check=0

proxy_client_headers[] = "HTTP_X_FORWARDED_FOR"
proxy_scheme_headers[] = "HTTP_X_FORWARDED_PROTO"
proxy_scheme_headers[] = "HTTP_X_FORWARDED_SCHEME"
proxy_scheme_headers[] = "HTTP_X_URL_SCHEME"

; maximum number of rows for any of the Referers tables (keywords, search engines, campaigns, etc.), and Custom variables names
datatable_archiving_maximum_rows_referrers = 5000
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1549,7 +1549,6 @@ public function getAvailableDimensions($idSite)

$dimensionsToIgnore = array(
'Actions.IdPageview', 'CoreHome.VisitId',
'DevicesDetection.OsVersion', // only makes sense in combination with Os Family
'CoreHome.LinkVisitActionId', 'CoreHome.LinkVisitActionIdPages', 'UserCountry.Provider'
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,10 @@ public function addDimension($dimension, $useRightJoin = false)
$this->reportQuery->addSelect("CONCAT(log_visit.location_region, '|', log_visit.location_country) AS '" . $dimension->getId() . "'");
$this->reportQuery->addGroupBy($dimension->getSqlSegment());
$this->reportQuery->addGroupBy('log_visit.location_country');
} elseif ($dimension->getSegmentName() === 'operatingSystemVersion') {
$this->reportQuery->addSelect("CONCAT(log_visit.config_os_version, '|', log_visit.config_os) AS '" . $dimension->getId() . "'");
$this->reportQuery->addGroupBy($dimension->getSqlSegment());
$this->reportQuery->addGroupBy('log_visit.config_os');
} else {
$select = $dimension->getSqlSegment();
if ($this->shouldLowerCampaignCase && stripos($dimension->getSegmentName(), 'campaign') === 0) {
Expand Down Expand Up @@ -218,7 +222,7 @@ public function addDimension($dimension, $useRightJoin = false)

if (!$useRightJoin) {
$tableColumn = $dimension->getDbTableName() . '.' . $dimension->getColumnName();
if ($tableColumn === $dimension->getSqlSegment() && $dimension->getSegmentName() !== 'regionCode') {
if ($tableColumn === $dimension->getSqlSegment() && !in_array($dimension->getSegmentName(), ['regionCode', 'operatingSystemVersion'])) {
// when the segment goes on the sql segment, we do not fetch any values with NULL otherwise we often see "XYZ is not defined"
// we cannot do something like " and $tableColumn != ''" as it could break dimension like visitor type
$this->reportQuery->addWhere($tableColumn . ' is not null');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
## Changelog

5.4.9 - 2026-01-05
- Preview screenshot updated for higher quality

5.4.8 - 2025-12-08
- Fixed CHANGELOG.md versioning
- Preview screenshot updated to show higher dimensions

5.4.7 - 2025-11-24
- README.md updated

5.4.6 - 2025-11-10
- Added operating system version dimension

5.4.5 - 2025-10-13
- Added triggering of event when reports are copied

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* Description: Pull out the information you need in order to be successful. Develop your custom strategy to meet your individualized goals while saving money & time.
* Author: InnoCraft
* Author URI: https://www.innocraft.com
* Version: 5.4.5
* Version: 5.4.9
*/
?><?php

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ private function renameRowDimension($table, $dimension, $dimensions)
$label = Piwik::translate('General_NotDefined', $dimension->getName());
if ($dimension->getSegmentName() === 'regionCode') {
$label = $dimension->getName() . ' ' . Piwik::translate('General_Unknown');
$row->setMetadata('segment', 'regionCode==');
} elseif ($dimension->getSegmentName() === 'operatingSystemVersion') {
$label = $dimension->getName() . ' ' . Piwik::translate('General_Unknown');
$row->setMetadata('segment', 'operatingSystemVersion==');
}
} elseif ($dimension->getSegmentName() === 'regionCode') {
$label = !empty($label) ? $label : Piwik::translate('General_Unknown');
Expand All @@ -90,6 +94,19 @@ private function renameRowDimension($table, $dimension, $dimensions)
$row->setMetadata('logo', $logo);
}
}
$row->setMetadata('segment', 'countryCode==' . urlencode($countryCode) . ';regionCode==' . urlencode($regionCode));
}
} elseif ($dimension->getSegmentName() === 'operatingSystemVersion') {
$label = !empty($label) ? $label : Piwik::translate('General_Unknown');
$explodedValues = explode('|', $label);
if (count($explodedValues) == 2) {
$osVersion = trim($explodedValues[0]);
$os = trim($explodedValues[1]);
$label = $os . ': ' . $osVersion;
if (\Piwik\Plugin\Manager::getInstance()->isPluginActivated('DevicesDetection')) {
$label = \Piwik\Plugins\DevicesDetection\getOSFamilyFullName($os) . ': ' . (!empty($osVersion) ? $osVersion : Piwik::translate('General_Unknown'));
}
$row->setMetadata('segment', 'operatingSystemCode==' . urlencode($os) . ';operatingSystemVersion==' . urlencode($osVersion));
}
} else {
$label = $dimension->formatValue($label, $this->idSite, $formatter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ Start your 30-day free trial today.
* Create compelling custom reports tailored to your needs without any developer knowledge in just seconds
* Choose from over 200 dimensions and metrics
* Supports several visualizations including evolution over time graphs, data tables, bar graph, pie chart, cloud chart, and others
* Combine up to 3 dimensions and unlimited metrics
* Combine multiple dimensions and unlimited metrics
* Define a report filter which is applied on the raw data to show the data only for a subset of your visitors and users
* Put your custom report on any existing reporting page or on its own reporting page
* Super Users can make reports available for all websites
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
"ContentImpressions": "Impressions de contenu",
"CreateNewReport": "Créer un nouveau rapport",
"CustomReport": "Rapport personnalisé",
"CustomReportCopied": "Le rapport personnalisé a été copié avec succès.",
"CustomReportDuplicationError": "Processus incomplet. Le rapport personnalisé n’a pas pu être copié sur tous les sites sélectionnés.",
"CustomReportDuplicationSiteTypeError": "La fonction de copie n’est pas prise en charge pour les sites suivants : %1$s.",
"CustomReportIntroduction": "Les rapports personnalisés vous permettent de créer de nouveaux rapports pour dessiner de nouvelles vues impossibles à obtenir avec les rapports standards. Vous choisissez les dimensions (tel que \"Type de périphérique\" et \"Navigateur\") ainsi que les métriques (tel que \"Nombre de visiteurs\" et \"Taux de rebond\") et comment ils doivent être affichés pour avoir les données uniques, exploitables et utiles dont vous avez besoin.",
"CustomReports": "Rapports personnalisés",
"DeleteExceptionMessage": "Impossible de supprimer le rapport, le site ne correspond pas",
Expand Down Expand Up @@ -77,6 +80,7 @@
"PreviewReportInvalidTimeFrameValues": "Valeurs de période non valides définies pour l’aperçu du rapport. Les valeurs autorisées sont : secondes, minutes, heures et jours.",
"PreviewSupportsDimension": "La prévisualisation supporte seulement %s dimensions pour le moment.",
"ProductsWithX": "Produits avec %s",
"QuotaReachedForX": "Vous avez atteint votre limite de quota. Impossible de copier le %1$s en raison d’une utilisation dépassée. Envisagez de supprimer les %2$s inutilisés ou moins importants afin de gérer votre quota.",
"RemoveDimension": "Retirer une dimension",
"RemoveMetric": "Retirer un élément mesurable",
"RemovedMetrics": "Ces éléments mesurables ont été retirés car ils ne peuvent pas être calculés correctement sur la période : %s.",
Expand Down Expand Up @@ -109,6 +113,7 @@
"ResumeReportInfo": "Lorsque vous reprendrez ce rapport, l'archivage redémarrera à partir d'aujourd'hui.",
"ResumedReport": "Le rapport a été repris avec succès.",
"SelectMeasurablesMatchingSearch": "ou ajouter toutes les entités mesurables contenant le terme de recherche suivant",
"SourceCustomReportLookupError": "Une erreur inattendue s’est produite lors de la recherche du rapport personnalisé source. Veuillez réessayer. Contactez votre administrateur ou le support si le problème persiste.",
"Type": "Type",
"Unlock": "Déverrouiller",
"UpdatingData": "Mise à jour des données…",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "CustomReports",
"description": "Pull out the information you need in order to be successful. Develop your custom strategy to meet your individualized goals while saving money & time.",
"version": "5.4.5",
"version": "5.4.9",
"theme": false,
"require": {
"matomo": ">=5.0.0-rc5,<6.0.0-b1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@
- [✔/✖/NA] New test case added/updated?
- [✔/✖/NA] Are all newly added texts included via translation?
- [✔/✖/NA] Are text sanitized properly? (Eg use of v-text v/s v-html for vue)
- [✔/✖/NA] Version bumped?
- [✔/✖/NA] Version bumped?
- [✔/✖/NA] I have understood, reviewed, and tested all AI outputs before use
- [✔/✖/NA] All AI instructions respect security, IP, and privacy rules
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
## Changelog

5.3.3 - 2025-12-08
- Updated preview screenshot and video url

5.3.2 - 2025-11-10
- Fixes constant not loading errors during configs.php request

5.3.1 - 2025-10-27
- Update some CNIL policy setting text to be more readable

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* Description: Truly understand your visitors by seeing where they click, hover, type and scroll. Replay their actions in a video and ultimately increase conversions
* Author: InnoCraft
* Author URI: https://www.innocraft.com
* Version: 5.3.1
* Version: 5.3.3
* License: InnoCraft EULA
* License URI: https://www.innocraft.com/license
* Plugin URI: https://plugins.matomo.org/HeatmapSessionRecording
Expand Down Expand Up @@ -394,6 +394,9 @@ public function visitorLogViewBeforeActionsInfo(&$out, $visitor)
public function shouldAddTrackerFile(&$shouldAdd, $pluginName)
{
if ($pluginName === 'HeatmapSessionRecording') {
if (defined('PIWIK_TEST_MODE') && PIWIK_TEST_MODE) {
$this->install();
}
$config = new Configuration();

$siteHsrDao = $this->getSiteHsrDao();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@
// we do not load index.php as it would register safeMode!
require_once PIWIK_INCLUDE_PATH . '/core/bootstrap.php';

// Set the request as a tracker request to skip certain actions, which is not necessary for a config request
\Piwik\SettingsServer::setIsTrackerApiRequest();

$configs = new \Piwik\Plugins\HeatmapSessionRecording\Tracker\Configs();
$configs->init();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,11 @@
"GettingStarted": "Démarrer",
"Heatmap": "Carte de chaleur",
"HeatmapAddedActivity": "a ajouté une carte thermique \"%1$s\" pour le site \"%2$s\"",
"HeatmapCopied": "La carte de chaleur a été copiée avec succès.",
"HeatmapCreated": "La carte de chaleur a été créée avec succès.",
"HeatmapDeletedActivity": "a supprimé la carte de chaleur \"%1$s\" pour le site \"%2$s\"",
"HeatmapDuplicationError": "Processus incomplet. La carte de chaleur n’a pas pu être copiée sur tous les sites sélectionnés. Sites en échec : %1$s. Sites réussis : %2$s.",
"HeatmapDuplicationSiteTypeError": "La fonction de copie n’est pas prise en charge pour les sites suivants : %1$s.",
"HeatmapEndedActivity": "a terminé la carte de chaleur \"%1$s\" pour le site \"%2$s\"",
"HeatmapInfoTrackVisitsFromCountries": "La carte de chaleur est configurée pour ne suivre que les visites provenant de %1$s.",
"HeatmapNameHelp": "Définit le nom sous lequel le rapport de cette carte de chaleur sera disponible.",
Expand Down Expand Up @@ -142,6 +145,7 @@
"NoSessionRecordedYetWithoutSystemConfiguration": "Aucune session n'a encore été enregistrée. S'il devait y avoir des sessions enregistrées à ce stade, il est possible que la page d'entrée configurée ne corresponde à aucune page de votre site web.",
"NoSessionRecordingsConfiguredInfo": "Il n'y a actuellement aucun enregistrement de session actif. Pour enregistrer de nouvelles sessions, veuillez demander à un utilisateur ayant au moins un accès administrateur de créer un nouvel enregistrement.",
"NoSessionRecordingsFound": "Aucun enregistrement de session trouvé",
"None": "Aucun",
"NotSupportedBrowser": "Ce navigateur n'est pas pris en charge. Veuillez utiliser une version plus récente ou essayer un autre navigateur.",
"OnePageview": "1 page vue",
"PageRule": "Règle de la page",
Expand All @@ -159,6 +163,11 @@
"PlayerPlay": "Lire (raccourci %s ou espace)",
"PlayerReplay": "Relecture (raccourci %s ou espace)",
"PlayerRewindFast": "Rembobiner %1$s secondes (raccourci %2$s)",
"PolicyHeatmapRequirementNote": "L’enregistrement de la carte de chaleur dans le plugin HeatmapSessionRecording doit être désactivé",
"PolicyHeatmapTitle": "Cartes de chaleur – Désactiver l’enregistrement de la carte de chaleur",
"PolicySessionRequirementNote": "L’enregistrement de session dans le plugin HeatmapSessionRecording doit être désactivé",
"PolicySessionTitle": "Cartes de chaleur – Désactiver l’enregistrement de session",
"QuotaReachedForX": "Vous avez atteint votre limite de quota. Impossible de copier le %1$s en raison d’une utilisation dépassée. Envisagez de supprimer les %2$s inutilisés ou moins importants pour gérer votre quota.",
"RecordedHeatmapDocStatusActive": "Cette carte de chaleur est active. Jusqu'à %1$d pages vues seront enregistrées avec un taux d'échantillonnage de %2$s.",
"RecordedHeatmapDocStatusEnded": "Cette carte de chaleur est terminée. Aucune nouvelle activité ne sera enregistrée.",
"RecordedPageviewDeletedActivity": "a supprimé une vue de page enregistrée pour l'enregistrement de session \"%1$s\" pour le site \"%2$s\"",
Expand Down Expand Up @@ -194,6 +203,7 @@
"SessionSampleLimit": "Nombre de sessions",
"SessionSampleLimitHelp": "Définit le nombre de sessions que vous souhaitez enregistrer au total.",
"SessionSampleRateHelp": "Également connu sous le nom de \"trafic\". Si vous sélectionnez 100%%, toutes les sessions seront enregistrées dès qu'elles auront atteint la page cible. Si vous sélectionnez par exemple 10 %%, seule une session sur dix sera enregistrée. Plus le pourcentage sélectionné est faible, plus il faudra de temps pour atteindre la limite d'échantillonnage choisie.",
"SourceHeatmapLookupError": "Une erreur inattendue s’est produite lors de la recherche de la carte de chaleur source. Veuillez réessayer. Contactez votre administrateur ou le support si le problème persiste.",
"StatusActive": "Active",
"StatusEnded": "Terminée",
"StatusPaused": "En pause",
Expand Down
Loading