Skip to content

Commit 19accfb

Browse files
committed
Support for phpbb consent manager
1 parent d1411ab commit 19accfb

5 files changed

Lines changed: 198 additions & 30 deletions

File tree

event/listener.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public static function getSubscribedEvents()
6464
'core.acp_board_config_edit_add' => 'add_googleanalytics_configs',
6565
'core.validate_config_variable' => 'validate_googleanalytics_id',
6666
'core.page_footer_after' => 'append_agreement',
67+
'phpbb.consentmanager.collect_registrations' => 'register_analytics',
6768
];
6869
}
6970

@@ -193,4 +194,26 @@ public function append_agreement()
193194

194195
$this->template->append_var('AGREEMENT_TEXT', $this->language->lang('PHPBB_ANALYTICS_PRIVACY_POLICY', $this->config['sitename']));
195196
}
197+
198+
/**
199+
* Register Google Analytics with Consent Manager when available.
200+
*
201+
* @param \phpbb\event\data|array $event The event object or event data
202+
* @return void
203+
*/
204+
public function register_analytics($event)
205+
{
206+
if (!$this->config['googleanalytics_id'])
207+
{
208+
return;
209+
}
210+
211+
$this->language->add_lang('common', 'phpbb/googleanalytics');
212+
213+
$event['consent_manager']->register('phpbb.googleanalytics', [
214+
'label' => $this->language->lang('GOOGLEANALYTICS_LABEL'),
215+
'category' => 'analytics',
216+
'description' => $this->language->lang('GOOGLEANALYTICS_DESCRIPTION'),
217+
]);
218+
}
196219
}

language/en/common.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
/**
3+
*
4+
* Google Analytics extension for the phpBB Forum Software package.
5+
*
6+
* @copyright (c) 2026 phpBB Limited <https://www.phpbb.com>
7+
* @license GNU General Public License, version 2 (GPL-2.0)
8+
*
9+
*/
10+
11+
/**
12+
* DO NOT CHANGE
13+
*/
14+
if (!defined('IN_PHPBB'))
15+
{
16+
exit;
17+
}
18+
19+
if (empty($lang) || !is_array($lang))
20+
{
21+
$lang = array();
22+
}
23+
24+
$lang = array_merge($lang, array(
25+
'GOOGLEANALYTICS_LABEL' => 'Google Analytics',
26+
'GOOGLEANALYTICS_DESCRIPTION' => 'Tracks the pages you visit, the time spent on each page, and general usage patterns.'
27+
));
Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,16 @@
11
{% if GOOGLEANALYTICS_ID %}
2-
{# 0 = Legacy (analytics.js) - Google Analytics #}
3-
{# 1 = Global site tag (gtag.js) - Google Analytics #}
4-
{% if GOOGLEANALYTICS_TAG == 1 %}
5-
<!-- Global site tag (gtag.js) - Google Analytics -->
6-
<script async src="https://www.googletagmanager.com/gtag/js?id={{ GOOGLEANALYTICS_ID }}"></script>
7-
<script>
8-
window.dataLayer = window.dataLayer || [];
9-
function gtag(){dataLayer.push(arguments);}
10-
gtag('js', new Date());
2+
<!-- Google tag (gtag.js) - Google Analytics -->
3+
<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>
4+
<script{% if S_CONSENTMANAGER_ANALYTICS_ENABLED %} type="text/plain" data-consent-category="analytics"{% endif %}>
5+
window.dataLayer = window.dataLayer || [];
6+
function gtag(){dataLayer.push(arguments);}
7+
gtag('js', new Date());
118

12-
gtag('config', '{{ GOOGLEANALYTICS_ID }}', {
13-
{%- EVENT phpbb_googleanalytics_gtag_options -%}
14-
{%- if S_REGISTERED_USER %}'user_id': '{{ GOOGLEANALYTICS_USER_ID }}',{% endif -%}
15-
{%- if S_ANONYMIZE_IP %}'anonymize_ip': true,{% endif -%}
16-
{%- if S_COOKIE_SECURE -%}'cookie_flags': 'samesite=none;secure',{%- endif -%}
17-
});
18-
</script>
19-
{% else %}
20-
<script>
21-
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
22-
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
23-
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
24-
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
25-
26-
ga('create', '{{ GOOGLEANALYTICS_ID }}', 'auto');
27-
{% if S_REGISTERED_USER %}ga('set', 'userId', {{ GOOGLEANALYTICS_USER_ID }});{% endif %}
28-
{% if S_ANONYMIZE_IP %}ga('set', 'anonymizeIp', true);{% endif %}
29-
{% EVENT phpbb_googleanalytics_alter_ga_requirements -%}
30-
ga('send', 'pageview');
31-
</script>
32-
{% endif %}
9+
gtag('config', '{{ GOOGLEANALYTICS_ID }}', {
10+
{%- EVENT phpbb_googleanalytics_gtag_options -%}
11+
{%- if S_REGISTERED_USER %}'user_id': '{{ GOOGLEANALYTICS_USER_ID }}',{% endif -%}
12+
{%- if S_ANONYMIZE_IP %}'anonymize_ip': true,{% endif -%}
13+
{%- if S_COOKIE_SECURE -%}'cookie_flags': 'samesite=none;secure',{%- endif -%}
14+
});
15+
</script>
3316
{% endif %}

tests/event/listener_test.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public function test_getSubscribedEvents()
9393
'core.acp_board_config_edit_add',
9494
'core.validate_config_variable',
9595
'core.page_footer_after',
96+
'phpbb.consentmanager.collect_registrations',
9697
], array_keys(\phpbb\googleanalytics\event\listener::getSubscribedEvents()));
9798
}
9899

@@ -306,4 +307,53 @@ public function test_append_agreement($s_agreement, $agreement_title, $expected_
306307
$this->set_listener();
307308
$this->listener->append_agreement();
308309
}
310+
311+
public function register_analytics_data()
312+
{
313+
return [
314+
'configured analytics' => ['G-A1B2C3D4E5', 1],
315+
'missing analytics id' => ['', 0],
316+
];
317+
}
318+
319+
/**
320+
* @dataProvider register_analytics_data
321+
*/
322+
public function test_register_analytics($googleanalytics_id, $expected_calls)
323+
{
324+
$this->config['googleanalytics_id'] = $googleanalytics_id;
325+
$this->set_listener();
326+
327+
$consent_manager = new consent_manager_double();
328+
329+
$this->listener->register_analytics([
330+
'consent_manager' => $consent_manager,
331+
]);
332+
333+
self::assertCount($expected_calls, $consent_manager->registrations);
334+
335+
if ($expected_calls)
336+
{
337+
self::assertSame('phpbb.googleanalytics', $consent_manager->registrations[0]['id']);
338+
self::assertSame([
339+
'label' => $this->language->lang('GOOGLEANALYTICS_LABEL'),
340+
'category' => 'analytics',
341+
'description' => $this->language->lang('GOOGLEANALYTICS_DESCRIPTION'),
342+
], $consent_manager->registrations[0]['definition']);
343+
}
344+
}
345+
}
346+
347+
class consent_manager_double
348+
{
349+
/** @var array */
350+
public $registrations = [];
351+
352+
public function register($id, array $definition)
353+
{
354+
$this->registrations[] = [
355+
'id' => $id,
356+
'definition' => $definition,
357+
];
358+
}
309359
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
/**
3+
*
4+
* Google Analytics extension for the phpBB Forum Software package.
5+
*
6+
* @copyright (c) 2026
7+
* @license GNU General Public License, version 2 (GPL-2.0)
8+
*
9+
*/
10+
11+
namespace phpbb\googleanalytics\tests\functional;
12+
13+
/**
14+
* @group functional
15+
*/
16+
class google_analytics_consentmanager_test extends \phpbb_functional_test_case
17+
{
18+
/** @var string */
19+
protected $sample_ga_code = 'G-A1B2C3D4E5';
20+
21+
protected static function setup_extensions()
22+
{
23+
return ['phpbb/consentmanager', 'phpbb/googleanalytics'];
24+
}
25+
26+
public function test_consentmanager_defers_google_analytics_scripts()
27+
{
28+
$this->login();
29+
$this->admin_login();
30+
$this->add_lang('acp/board');
31+
$this->add_lang_ext('phpbb/googleanalytics', 'googleanalytics_acp');
32+
33+
$crawler = self::request('GET', 'adm/index.php?i=acp_board&mode=settings&sid=' . $this->sid);
34+
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
35+
$values = $form->getValues();
36+
$values['config[googleanalytics_id]'] = $this->sample_ga_code;
37+
$form->setValues($values);
38+
self::submit($form);
39+
40+
$crawler = self::request('GET', 'index.php');
41+
42+
self::assertSame(
43+
'https://www.googletagmanager.com/gtag/js?id=' . $this->sample_ga_code,
44+
$crawler->filter('head > script[type="text/plain"][data-consent-category="analytics"][src*="googletagmanager.com/gtag/js"]')->attr('src')
45+
);
46+
self::assertGreaterThan(
47+
0,
48+
$crawler->filter('head > script[type="text/plain"][data-consent-category="analytics"]')->count()
49+
);
50+
}
51+
52+
public function test_google_analytics_runs_normally_when_analytics_category_is_disabled()
53+
{
54+
$this->login();
55+
$this->admin_login();
56+
$this->add_lang('acp/board');
57+
$this->add_lang_ext('phpbb/googleanalytics', 'googleanalytics_acp');
58+
$this->add_lang_ext('phpbb/consentmanager', 'acp_consentmanager');
59+
60+
$crawler = self::request('GET', 'adm/index.php?i=acp_board&mode=settings&sid=' . $this->sid);
61+
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
62+
$values = $form->getValues();
63+
$values['config[googleanalytics_id]'] = $this->sample_ga_code;
64+
$form->setValues($values);
65+
self::submit($form);
66+
67+
$crawler = self::request('GET', 'adm/index.php?i=-phpbb-consentmanager-acp-consentmanager_module&mode=settings&sid=' . $this->sid);
68+
$form = $crawler->selectButton($this->lang('SUBMIT'))->form();
69+
$values = $form->getValues();
70+
$values['consentmanager_analytics_enabled'] = '0';
71+
$form->setValues($values);
72+
self::submit($form);
73+
74+
$crawler = self::request('GET', 'index.php');
75+
76+
self::assertSame(
77+
'https://www.googletagmanager.com/gtag/js?id=' . $this->sample_ga_code,
78+
$crawler->filter('head > script[src*="googletagmanager.com/gtag/js"]')->attr('src')
79+
);
80+
self::assertSame(
81+
0,
82+
$crawler->filter('head > script[type="text/plain"][data-consent-category="analytics"]')->count()
83+
);
84+
}
85+
}

0 commit comments

Comments
 (0)