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
@@ -1,7 +1,7 @@
{% if GOOGLEANALYTICS_ID %}
<!-- Google tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ GOOGLEANALYTICS_ID }}"></script>
<script>
<script{% if S_CONSENTMANAGER_ANALYTICS_ENABLED %} type="text/plain" data-consent-category="analytics"{% endif %} async src="https://www.googletagmanager.com/gtag/js?id={{ GOOGLEANALYTICS_ID }}"></script>
<script{% if S_CONSENTMANAGER_ANALYTICS_ENABLED %} type="text/plain" data-consent-category="analytics"{% endif %}>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
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,
];
}
}
107 changes: 107 additions & 0 deletions tests/functional/google_analytics_consentmanager_test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?php
/**
*
* Google Analytics extension for the phpBB Forum Software package.
*
* @copyright (c) 2026
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/

namespace phpbb\googleanalytics\tests\functional;

/**
* @group functional
*/
class google_analytics_consentmanager_test extends \phpbb_functional_test_case
{
/** @var string */
protected $sample_ga_code = 'G-A1B2C3D4E5';

protected static function setup_extensions()
{
$extensions = ['phpbb/googleanalytics'];

if (self::is_consentmanager_available())
{
array_unshift($extensions, 'phpbb/consentmanager');
}

return $extensions;
}

public function test_consentmanager_defers_google_analytics_scripts()
{
if (!self::is_consentmanager_available())
{
self::markTestSkipped('Consent Manager extension is not available.');
}

$this->login();
$this->admin_login();
$this->add_lang('acp/board');
$this->add_lang_ext('phpbb/googleanalytics', 'googleanalytics_acp');

$crawler = self::request('GET', 'adm/index.php?i=acp_board&mode=settings&sid=' . $this->sid);
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
$values = $form->getValues();
$values['config[googleanalytics_id]'] = $this->sample_ga_code;
$form->setValues($values);
self::submit($form);

$crawler = self::request('GET', 'index.php');

self::assertSame(
'https://www.googletagmanager.com/gtag/js?id=' . $this->sample_ga_code,
$crawler->filter('head > script[type="text/plain"][data-consent-category="analytics"][src*="googletagmanager.com/gtag/js"]')->attr('src')
);
self::assertGreaterThan(
0,
$crawler->filter('head > script[type="text/plain"][data-consent-category="analytics"]')->count()
);
}

public function test_google_analytics_runs_normally_when_analytics_category_is_disabled()
{
if (!self::is_consentmanager_available())
{
self::markTestSkipped('Consent Manager extension is not available.');
}

$this->login();
$this->admin_login();
$this->add_lang('acp/board');
$this->add_lang_ext('phpbb/googleanalytics', 'googleanalytics_acp');
$this->add_lang_ext('phpbb/consentmanager', 'acp_consentmanager');

$crawler = self::request('GET', 'adm/index.php?i=acp_board&mode=settings&sid=' . $this->sid);
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
$values = $form->getValues();
$values['config[googleanalytics_id]'] = $this->sample_ga_code;
$form->setValues($values);
self::submit($form);

$crawler = self::request('GET', 'adm/index.php?i=-phpbb-consentmanager-acp-consentmanager_module&mode=settings&sid=' . $this->sid);
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
$values = $form->getValues();
$values['consentmanager_analytics_enabled'] = '0';
$form->setValues($values);
self::submit($form);

$crawler = self::request('GET', 'index.php');

self::assertSame(
'https://www.googletagmanager.com/gtag/js?id=' . $this->sample_ga_code,
$crawler->filter('head > script[src*="googletagmanager.com/gtag/js"]')->attr('src')
);
self::assertSame(
0,
$crawler->filter('head > script[type="text/plain"][data-consent-category="analytics"]')->count()
);
}

protected static function is_consentmanager_available()
{
return is_file(__DIR__ . '/../../../../phpbb/consentmanager/ext.php');
}
}
Loading