Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 36 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 1 |
Main | |
0.00% |
0 / 36 |
|
0.00% |
0 / 3 |
90 | |
0.00% |
0 / 1 |
__construct | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
onBeforePageDisplay | |
0.00% |
0 / 25 |
|
0.00% |
0 / 1 |
20 | |||
makeJsMapString | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
20 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\PageViewInfoGA\Hooks; |
4 | |
5 | use Config; |
6 | use Html; |
7 | use MediaWiki\Extension\PageViewInfoGA\Constants; |
8 | |
9 | class Main implements |
10 | \MediaWiki\Hook\BeforePageDisplayHook |
11 | { |
12 | /** |
13 | * @var Config |
14 | */ |
15 | private $config; |
16 | |
17 | /** |
18 | * @param Config $config |
19 | */ |
20 | public function __construct( Config $config ) { |
21 | $this->config = $config; |
22 | } |
23 | |
24 | /** |
25 | * Add Google Tag Manager to all pages. |
26 | * |
27 | * @inheritDoc |
28 | */ |
29 | public function onBeforePageDisplay( $out, $skin ): void { |
30 | $trackingID = $this->config->get( Constants::CONFIG_KEY_TRACKING_ID ); |
31 | if ( !$trackingID ) { |
32 | return; |
33 | } |
34 | |
35 | $config = $this->config; |
36 | $title = $out->getTitle(); |
37 | $googleGlobalSiteTag = "<!-- Global site tag (gtag.js) - Google Analytics -->\n"; |
38 | $googleGlobalSiteTag .= Html::rawElement( 'script', [ |
39 | 'async', |
40 | 'src' => "https://www.googletagmanager.com/gtag/js?id={$trackingID}", |
41 | ] ); |
42 | $jsSnippet = 'window.dataLayer=window.dataLayer||[];' . |
43 | 'function gtag(){dataLayer.push(arguments);}' . |
44 | "gtag('js',new Date());"; |
45 | |
46 | $pageId = $title->isSpecialPage() ? 0 : $title->getId(); |
47 | $pageTitle = $title->getPrefixedDBkey(); |
48 | if ( $config->get( Constants::CONFIG_KEY_WRITE_CUSTOM_DIMENSIONS ) ) { |
49 | $customMap = self::makeJsMapString( [ |
50 | 'custom_map' => $config->get( Constants::CONFIG_KEY_CUSTOM_MAP ), |
51 | 'mw:page_id' => $pageId, |
52 | 'mw:page_title' => $pageTitle, |
53 | ] ); |
54 | $jsSnippet .= "gtag('config','{$trackingID}',{$customMap});"; |
55 | } else { |
56 | $jsSnippet .= "gtag('config','{$trackingID}')"; |
57 | } |
58 | $googleGlobalSiteTag .= Html::rawElement( 'script', [], $jsSnippet ); |
59 | $out->addHeadItems( $googleGlobalSiteTag ); |
60 | } |
61 | |
62 | /** |
63 | * @param array $phpMap |
64 | * @return string |
65 | */ |
66 | private static function makeJsMapString( $phpMap ) { |
67 | $jsMap = []; |
68 | foreach ( $phpMap as $key => $val ) { |
69 | if ( is_array( $val ) ) { |
70 | $val = self::makeJsMapString( $val ); |
71 | } elseif ( is_string( $val ) ) { |
72 | $val = "'$val'"; |
73 | } |
74 | $jsMap[] = "'$key':$val"; |
75 | } |
76 | |
77 | $jsMap = implode( ',', $jsMap ); |
78 | $jsMap = '{' . $jsMap . '}'; |
79 | return $jsMap; |
80 | } |
81 | } |