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 MediaWiki\Config\Config; |
| 6 | use MediaWiki\Extension\PageViewInfoGA\Constants; |
| 7 | use MediaWiki\Html\Html; |
| 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 | } |