Skip to content
Open
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions event/listener.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public static function getSubscribedEvents()
'core.acp_board_config_edit_add'=> 'add_googleanalytics_configs',
'core.validate_config_variable' => 'validate_googleanalytics_id',
'core.page_footer_after' => 'append_agreement',
'phpbb.consentmanager.collect_registrations' => 'register_analytics',
];
}

Expand Down Expand Up @@ -175,4 +176,26 @@ public function append_agreement()

$this->template->append_var('AGREEMENT_TEXT', $this->language->lang('PHPBB_ANALYTICS_PRIVACY_POLICY', $this->config['sitename']));
}

/**
* Register Google Analytics with Consent Manager when available.
*
* @param \phpbb\event\data|array $event The event object or event data
* @return void
*/
public function register_analytics($event)
{
if (!$this->config['googleanalytics_id'])
{
return;
}

$this->language->add_lang('common', 'phpbb/googleanalytics');

$event['consent_manager']->register('phpbb.googleanalytics', [
'label' => $this->language->lang('GOOGLEANALYTICS_LABEL'),
'category' => 'analytics',
'description' => $this->language->lang('GOOGLEANALYTICS_DESCRIPTION'),
]);
}
}
27 changes: 27 additions & 0 deletions language/en/common.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php
/**
*
* Google Analytics extension for the phpBB Forum Software package.
*
* @copyright (c) 2026 phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/

/**
* DO NOT CHANGE
*/
if (!defined('IN_PHPBB'))
{
exit;
}

if (empty($lang) || !is_array($lang))
{
$lang = array();
}

$lang = array_merge($lang, array(
'GOOGLEANALYTICS_LABEL' => 'Google Analytics',
'GOOGLEANALYTICS_DESCRIPTION' => 'Tracks the pages you visit, the time spent on each page, and general usage patterns.'
));
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
<script async src="https://www.googletagmanager.com/gtag/js?id={{ GOOGLEANALYTICS_ID }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
window.gtag = window.gtag || function(){window.dataLayer.push(arguments);}

gtag('config', '{{ GOOGLEANALYTICS_ID }}', {
window.gtag('js', new Date());
window.gtag('config', '{{ GOOGLEANALYTICS_ID }}', {
{%- EVENT phpbb_googleanalytics_gtag_options -%}
{%- if S_REGISTERED_USER %}'user_id': '{{ GOOGLEANALYTICS_USER_ID }}',{% endif -%}
{%- if S_ANONYMIZE_IP %}'anonymize_ip': true,{% endif -%}
Expand Down
50 changes: 50 additions & 0 deletions tests/event/listener_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public function test_getSubscribedEvents()
'core.acp_board_config_edit_add',
'core.validate_config_variable',
'core.page_footer_after',
'phpbb.consentmanager.collect_registrations',
], array_keys(\phpbb\googleanalytics\event\listener::getSubscribedEvents()));
}

Expand Down Expand Up @@ -305,4 +306,53 @@ public function test_append_agreement($googleanalytics_id, $s_agreement, $agreem
$this->set_listener();
$this->listener->append_agreement();
}

public function register_analytics_data()
{
return [
'configured analytics' => ['G-A1B2C3D4E5', 1],
'missing analytics id' => ['', 0],
];
}

/**
* @dataProvider register_analytics_data
*/
public function test_register_analytics($googleanalytics_id, $expected_calls)
{
$this->config['googleanalytics_id'] = $googleanalytics_id;
$this->set_listener();

$consent_manager = new consent_manager_double();

$this->listener->register_analytics([
'consent_manager' => $consent_manager,
]);

self::assertCount($expected_calls, $consent_manager->registrations);

if ($expected_calls)
{
self::assertSame('phpbb.googleanalytics', $consent_manager->registrations[0]['id']);
self::assertSame([
'label' => $this->language->lang('GOOGLEANALYTICS_LABEL'),
'category' => 'analytics',
'description' => $this->language->lang('GOOGLEANALYTICS_DESCRIPTION'),
], $consent_manager->registrations[0]['definition']);
}
}
}

class consent_manager_double
{
/** @var array */
public $registrations = [];

public function register($id, array $definition)
{
$this->registrations[] = [
'id' => $id,
'definition' => $definition,
];
}
}