Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
Main
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 3
90
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onBeforePageDisplay
0.00% covered (danger)
0.00%
0 / 25
0.00% covered (danger)
0.00%
0 / 1
20
 makeJsMapString
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2
3namespace MediaWiki\Extension\PageViewInfoGA\Hooks;
4
5use Config;
6use Html;
7use MediaWiki\Extension\PageViewInfoGA\Constants;
8
9class 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}