diff --git a/assets/css/placeholder.css b/assets/css/placeholder.css new file mode 100644 index 0000000..e634392 --- /dev/null +++ b/assets/css/placeholder.css @@ -0,0 +1,14 @@ +img.placeholder { + width: 100%; + height: 100%; + animation: placeholderFade 750ms infinite linear alternate; +} + +@keyframes placeholderFade { + 0% { + opacity: 0.25; + } + 100% { + opacity: 0.85; + } +} diff --git a/assets/images/bar-graph-placeholder.svg b/assets/images/bar-graph-placeholder.svg new file mode 100644 index 0000000..5fb58f3 --- /dev/null +++ b/assets/images/bar-graph-placeholder.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/goal-placeholder.svg b/assets/images/goal-placeholder.svg new file mode 100644 index 0000000..27a5674 --- /dev/null +++ b/assets/images/goal-placeholder.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/images/line-graph-placeholder.svg b/assets/images/line-graph-placeholder.svg new file mode 100644 index 0000000..ff15a47 --- /dev/null +++ b/assets/images/line-graph-placeholder.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/pie-graph-placeholder.svg b/assets/images/pie-graph-placeholder.svg new file mode 100644 index 0000000..0fbcb5a --- /dev/null +++ b/assets/images/pie-graph-placeholder.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/table-placeholder.svg b/assets/images/table-placeholder.svg new file mode 100644 index 0000000..e5e82b6 --- /dev/null +++ b/assets/images/table-placeholder.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/classes/Analytics.php b/classes/Analytics.php index 26acd5c..8535582 100644 --- a/classes/Analytics.php +++ b/classes/Analytics.php @@ -1,12 +1,9 @@ gapi_key->getContents(), true); $client->setAuthConfig($auth); - $client->addScope(Google_Service_Analytics::ANALYTICS_READONLY); + $client->addScope(AnalyticsData::ANALYTICS_READONLY); if ($client->isAccessTokenExpired()) { - $client->refreshTokenWithAssertion(); + $client->fetchAccessTokenWithAssertion(); } $this->client = $client; - $this->service = new Google_Service_Analytics($client); - $this->viewId = 'ga:'.$settings->profile_id; + $this->service = new AnalyticsData($client); + $this->viewId = 'properties/' . $settings->profile_id; } -} \ No newline at end of file +} diff --git a/lang/en/lang.php b/lang/en/lang.php index 1f62895..9946d14 100644 --- a/lang/en/lang.php +++ b/lang/en/lang.php @@ -16,7 +16,7 @@ 'traffic_goal_goal_validation' => 'Please specify the traffic goal as an integer value.', 'title_traffic_overview' => 'Traffic overview', 'title_traffic_sources' => 'Traffic Sources', - 'description_traffic_sources' => 'The traffic sources report displays the source of referrals to your website.', + 'description_traffic_sources' => 'The traffic sources report displays the source from where visitors entered the site.', 'traffic_sources_report_size' => 'Chart radius', 'traffic_sources_report_size_validation' => 'Please specify the chart size as an integer value', 'traffic_sources_center' => 'Center the chart', @@ -24,6 +24,12 @@ 'display_description' => 'Display the report description', 'days' => 'Number of days to display data for', 'legend_as_table' => 'Display legend as a table', + 'metrics' => 'Metrics', + 'metric_sessions' => 'Sessions', + 'metric_activeUsers' => 'Users', + 'metric_screenPageViews' => 'Page views', + 'device_split' => 'Split by device', + 'device_split_description' => 'If ticked, visits will also be split by device type, such as desktop, mobile or tablet.', ], 'permissions' => [ 'tab' => 'Google Analytics Plugin', @@ -40,8 +46,10 @@ 'settings_desc' => 'Configure Google Analytics API code and tracking options.', 'page_url' => 'Page URL', 'pageviews' => 'Pageviews', + 'users' => 'Users', 'current' => 'Current', 'goal' => 'Goal', + 'engagement' => 'Engagement', ], 'settings' => [ 'project_name' => 'Google API Project name', @@ -63,4 +71,11 @@ 'force_ssl' => 'Force SSL', 'force_ssl_comment' => 'Always use SSL to send data to Google', ], + 'mediums' => [ + 'organic' => 'Search engines', + 'cpc' => 'Paid search click-throughs', + 'direct' => 'Direct traffic', + 'referral' => 'External sites', + 'unknown' => 'Unknown', + ], ]; diff --git a/readme.md b/readme.md index f049e48..021a008 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1,8 @@ -# Google Analytics V3 integration plugin +# Google Analytics V4 integration plugin This plugin adds Google Analytics tracking and reporting features to the [Winter CMS](https://wintercms.com). -> **Note**: This plugin does not support GAv4. If you are having issues creating an account, use the **Show advanced options** link in the GA Account creation and the **Create a Universal Analytics property** switch. +> **Note**: The v3.x series of this plugin only supports Google Analytics v4 (GA4) as GA3 / UA [are being retired](https://support.google.com/analytics/answer/11583528?hl=en). If you wish to use this plugin for GA3 / UA, you must roll back to v2.0.2 of this plugin. ## Configuration diff --git a/reportwidgets/Browsers.php b/reportwidgets/Browsers.php index b88d6ff..931de71 100644 --- a/reportwidgets/Browsers.php +++ b/reportwidgets/Browsers.php @@ -1,9 +1,17 @@ addCss('/plugins/winter/googleanalytics/assets/css/placeholder.css', 'Winter.GoogleAnalytics'); + + return $this->makePartial('widget'); + } + + public function onLoad() { try { $this->loadData(); - } - catch (Exception $ex) { + } catch (Exception $ex) { $this->vars['error'] = $ex->getMessage(); } - return $this->makePartial('widget'); + return [ + '#' . $this->alias => $this->makePartial('report') + ]; } public function defineProperties() @@ -52,7 +68,7 @@ public function defineProperties() ], 'days' => [ 'title' => 'winter.googleanalytics::lang.widgets.days', - 'default' => '7', + 'default' => '30', 'type' => 'string', 'validationPattern' => '^[0-9]+$' ], @@ -60,18 +76,68 @@ public function defineProperties() 'title' => 'winter.googleanalytics::lang.widgets.display_description', 'type' => 'checkbox', 'default' => 1 - ] + ], + 'deviceSplit' => [ + 'title' => 'winter.googleanalytics::lang.widgets.device_split', + 'description' => 'winter.googleanalytics::lang.widgets.device_split_description', + 'type' => 'checkbox', + 'default' => 0 + ], ]; } protected function loadData() { - $days = $this->property('days'); - if (!$days) - throw new ApplicationException('Invalid days value: '.$days); + $analytics = Analytics::instance(); + + $days = $this->property('days', 30); + + // Formulate data request + $request = new RunReportRequest(); + $now = Argon::now()->toImmutable(); + if (boolval($this->property('deviceSplit', 0)) === true) { + $request->setDimensions([ + new Dimension([ + 'name' => 'browserDevice', + 'dimensionExpression' => new DimensionExpression([ + 'concatenate' => new ConcatenateExpression([ + 'delimiter' => ' - ', + 'dimensionNames' => [ + 'browser', + 'deviceCategory', + ], + ]), + ]), + ]), + ]); + } else { + $request->setDimensions([ + new Dimension(['name' => 'browser']), + ]); + } + $request->setMetrics([ + new Metric(['name' => 'sessions']), + ]); + $request->setDateRanges([ + new DateRange([ + 'startDate' => $now->subDays($days)->format('Y-m-d'), + 'endDate' => $now->format('Y-m-d') + ]) + ]); + $request->setOrderBys([ + new OrderBy([ + 'desc' => true, + 'metric' => new MetricOrderBy([ + 'metricName' => 'sessions', + ]) + ]), + ]); + + $data = $analytics->service->properties->runReport( + $analytics->viewId, + $request, + ); - $obj = Analytics::instance(); - $data = $obj->service->data_ga->get($obj->viewId, $days.'daysAgo', 'today', 'ga:visits', ['dimensions'=>'ga:browser', 'sort'=>'-ga:visits']); - $this->vars['rows'] = $data->getRows(); + $this->vars['rows'] = $data->getRows() ?: []; } } diff --git a/reportwidgets/TopPages.php b/reportwidgets/TopPages.php index 381ed29..9b03167 100644 --- a/reportwidgets/TopPages.php +++ b/reportwidgets/TopPages.php @@ -1,9 +1,15 @@ addCss('/plugins/winter/googleanalytics/assets/css/placeholder.css', 'Winter.GoogleAnalytics'); + + return $this->makePartial('widget'); + } + + public function onLoad() { try { $this->loadData(); - } - catch (Exception $ex) { + } catch (Exception $ex) { $this->vars['error'] = $ex->getMessage(); } - return $this->makePartial('widget'); + return [ + '#' . $this->alias => $this->makePartial('report') + ]; } public function defineProperties() @@ -40,7 +54,7 @@ public function defineProperties() ], 'days' => [ 'title' => 'winter.googleanalytics::lang.widgets.days', - 'default' => '7', + 'default' => '30', 'type' => 'string', 'validationPattern' => '^[0-9]+$' ], @@ -55,20 +69,48 @@ public function defineProperties() protected function loadData() { - $days = $this->property('days'); - if (!$days) - throw new ApplicationException('Invalid days value: '.$days); + $analytics = Analytics::instance(); - $obj = Analytics::instance(); - $data = $obj->service->data_ga->get($obj->viewId, $days.'daysAgo', 'today', 'ga:pageviews', ['dimensions' => 'ga:pagePath', 'sort' => '-ga:pageviews']); + $days = $this->property('days', 30); - $rows = $data->getRows() ?: []; - $rows = $this->vars['rows'] = array_slice($rows, 0, $this->property('number')); + // Formulate data request + $request = new RunReportRequest(); + $now = Argon::now()->toImmutable(); + $request->setDimensions([ + new Dimension(['name' => 'pagePath']), + ]); + $request->setMetrics([ + new Metric(['name' => 'screenPageViews']), + new Metric(['name' => 'activeUsers']), + new Metric(['name' => 'engagementRate']), + ]); + $request->setDateRanges([ + new DateRange([ + 'startDate' => $now->subDays($days)->format('Y-m-d'), + 'endDate' => $now->format('Y-m-d') + ]) + ]); + $request->setOrderBys([ + new OrderBy([ + 'desc' => true, + 'metric' => new MetricOrderBy([ + 'metricName' => 'screenPageViews', + ]) + ]), + new OrderBy([ + 'desc' => true, + 'metric' => new MetricOrderBy([ + 'metricName' => 'activeUsers', + ]) + ]), + ]); + $request->setLimit($this->property('number', 5)); - $total = 0; - foreach ($rows as $row) - $total += $row[1]; + $data = $analytics->service->properties->runReport( + $analytics->viewId, + $request, + ); - $this->vars['total'] = $total; + $this->vars['rows'] = $data->getRows() ?: []; } } diff --git a/reportwidgets/TrafficGoal.php b/reportwidgets/TrafficGoal.php index 5eb87f2..7a1f878 100644 --- a/reportwidgets/TrafficGoal.php +++ b/reportwidgets/TrafficGoal.php @@ -1,9 +1,13 @@ addCss('/plugins/winter/googleanalytics/assets/css/placeholder.css', 'Winter.GoogleAnalytics'); + + return $this->makePartial('widget'); + } + + public function onLoad() { try { $this->loadData(); - } - catch (Exception $ex) { + } catch (Exception $ex) { $this->vars['error'] = $ex->getMessage(); } - return $this->makePartial('widget'); + return [ + '#' . $this->alias => $this->makePartial('report') + ]; } public function defineProperties() @@ -40,7 +52,7 @@ public function defineProperties() ], 'days' => [ 'title' => 'winter.googleanalytics::lang.widgets.traffic_goal_days', - 'default' => '7', + 'default' => '30', 'type' => 'string', 'validationPattern' => '^[0-9]+$' ], @@ -51,29 +63,49 @@ public function defineProperties() 'type' => 'string', 'validationPattern' => '^[0-9]+$', 'validationMessage' => 'winter.googleanalytics::lang.widgets.traffic_goal_goal_validation' - ] + ], + 'goalMetric' => [ + 'title' => 'winter.googleanalytics::lang.widgets.traffic_goal_metric', + 'description' => 'winter.googleanalytics::lang.widgets.traffic_goal_metric_description', + 'title' => 'winter.googleanalytics::lang.widgets.metrics', + 'default' => 'sessions', + 'type' => 'dropdown', + 'options' => [ + 'sessions' => Lang::get('winter.googleanalytics::lang.widgets.metric_sessions'), + 'activeUsers' => Lang::get('winter.googleanalytics::lang.widgets.metric_activeUsers'), + 'screenPageViews' => Lang::get('winter.googleanalytics::lang.widgets.metric_screenPageViews'), + ], + ], ]; } protected function loadData() { - $days = $this->property('days'); - if (!$days) - throw new ApplicationException('Invalid days value: '.$days); + $analytics = Analytics::instance(); + + $days = $this->property('days', 30); + $goal = $this->property('goal', 100); - $goal = $this->property('goal'); - if (!$goal) - throw new ApplicationException('Invalid goal value: '.$goal); + // Formulate data request + $request = new RunReportRequest(); + $now = Argon::now()->toImmutable(); + $request->setMetrics([ + new Metric(['name' => $this->property('goalMetric', 'sessions')]), + ]); + $request->setDateRanges([ + new DateRange([ + 'startDate' => $now->subDays($days)->format('Y-m-d'), + 'endDate' => $now->format('Y-m-d') + ]) + ]); + $request->setMetricAggregations(['TOTAL']); - $obj = Analytics::instance(); - $data = $obj->service->data_ga->get( - $obj->viewId, - $days.'daysAgo', - 'today', - 'ga:visits' - )->getRows(); + $data = $analytics->service->properties->runReport( + $analytics->viewId, + $request, + ); - $total = $this->vars['total'] = isset($data[0][0]) ? $data[0][0] : 0; - $this->vars['percentage'] = min(round($total/$goal*100), 100); + $this->vars['total'] = $total = $data->getTotals()[0]->getMetricValues()[0]->getValue(); + $this->vars['percentage'] = min(round(($total / $goal) * 100), 100); } } diff --git a/reportwidgets/TrafficOverview.php b/reportwidgets/TrafficOverview.php index dda185f..ddfb081 100644 --- a/reportwidgets/TrafficOverview.php +++ b/reportwidgets/TrafficOverview.php @@ -1,9 +1,17 @@ addCss('/plugins/winter/googleanalytics/assets/css/placeholder.css', 'Winter.GoogleAnalytics'); + + return $this->makePartial('widget'); + } + + public function onLoad() { try { $this->loadData(); - } - catch (Exception $ex) { + } catch (Exception $ex) { $this->vars['error'] = $ex->getMessage(); } - return $this->makePartial('widget'); + return [ + '#' . $this->alias => $this->makePartial('report') + ]; } public function defineProperties() @@ -43,25 +59,56 @@ public function defineProperties() 'default' => '30', 'type' => 'string', 'validationPattern' => '^[0-9]+$' - ] + ], + 'metrics' => [ + 'title' => 'winter.googleanalytics::lang.widgets.metrics', + 'default' => ['sessions'], + 'type' => 'set', + 'items' => [ + 'sessions' => Lang::get('winter.googleanalytics::lang.widgets.metric_sessions'), + 'activeUsers' => Lang::get('winter.googleanalytics::lang.widgets.metric_activeUsers'), + 'screenPageViews' => Lang::get('winter.googleanalytics::lang.widgets.metric_screenPageViews'), + ] + ], ]; } protected function loadData() { - $obj = Analytics::instance(); + $analytics = Analytics::instance(); - $days = $this->property('days'); - if (!$days) { - throw new ApplicationException('Invalid days value: '.$days); - } + $days = $this->property('days', 30); + $metrics = $this->property('metrics', ['sessions']); + + // Formulate data request + $request = new RunReportRequest(); + $now = Argon::now()->toImmutable(); + $request->setDimensions([ + new Dimension(['name' => 'date']), + ]); + $request->setMetrics( + array_map(function ($metric) { + return new Metric(['name' => $metric]); + }, $metrics) + ); + $request->setDateRanges([ + new DateRange([ + 'startDate' => $now->subDays($days)->format('Y-m-d'), + 'endDate' => $now->format('Y-m-d') + ]) + ]); + $request->setOrderBys([ + new OrderBy([ + 'desc' => false, + 'dimension' => new DimensionOrderBy([ + 'dimensionName' => 'date' + ]) + ]) + ]); - $data = $obj->service->data_ga->get( - $obj->viewId, - $days.'daysAgo', - 'today', - 'ga:visits', - ['dimensions' => 'ga:date'] + $data = $analytics->service->properties->runReport( + $analytics->viewId, + $request, ); $rows = $data->getRows(); @@ -69,16 +116,25 @@ protected function loadData() throw new ApplicationException('No traffic found yet.'); } - $points = []; - foreach ($rows as $row) { - $point = [ - strtotime($row[0])*1000, - $row[1] - ]; + // Set up array of points + $points = array_map(function ($metric) { + return []; + }, $metrics); + + foreach ($rows as $rowIndex => $row) { + foreach (array_keys($metrics) as $index) { + if (!isset($row->getMetricValues()[$index])) { + continue; + } - $points[] = $point; + $points[$index][$rowIndex] = [ + strtotime($row->getDimensionValues()[0]->getValue()) * 1000, + $row->getMetricValues()[$index]->getValue(), + ]; + } } - $this->vars['rows'] = str_replace('"', '', substr(substr(json_encode($points), 1), 0, -1)); + $this->vars['metrics'] = $this->property('metrics', ['sessions']); + $this->vars['points'] = $points; } } diff --git a/reportwidgets/TrafficSources.php b/reportwidgets/TrafficSources.php index 87b48cf..cdfb7b5 100644 --- a/reportwidgets/TrafficSources.php +++ b/reportwidgets/TrafficSources.php @@ -1,9 +1,16 @@ addCss('/plugins/winter/googleanalytics/assets/css/placeholder.css', 'Winter.GoogleAnalytics'); + + return $this->makePartial('widget'); + } + + public function onLoad() { try { $this->loadData(); - } - catch (Exception $ex) { + } catch (Exception $ex) { $this->vars['error'] = $ex->getMessage(); } - return $this->makePartial('widget'); + return [ + '#' . $this->alias => $this->makePartial('report') + ]; } public function defineProperties() @@ -60,12 +75,6 @@ public function defineProperties() 'type' => 'string', 'validationPattern' => '^[0-9]+$' ], - 'number' => [ - 'title' => 'winter.googleanalytics::lang.widgets.traffic_sources_number', - 'default' => '10', - 'type' => 'string', - 'validationPattern' => '^[0-9]+$' - ], 'displayDescription' => [ 'title' => 'winter.googleanalytics::lang.widgets.display_description', 'type' => 'checkbox', @@ -76,22 +85,46 @@ public function defineProperties() protected function loadData() { - $days = $this->property('days'); - if (!$days) - throw new ApplicationException('Invalid days value: '.$days); + $analytics = Analytics::instance(); - $obj = Analytics::instance(); - $data = $obj->service->data_ga->get( - $obj->viewId, - $days.'daysAgo', - 'today', - 'ga:visits', - ['dimensions' => 'ga:source', 'sort' => '-ga:visits'] - ); + $days = $this->property('days', 30); + + // Formulate data request + $request = new RunReportRequest(); + $now = Argon::now()->toImmutable(); + $request->setDimensions([ + new Dimension(['name' => 'sessionMedium']), + ]); + $request->setMetrics([ + new Metric(['name' => 'sessions']), + ]); + $request->setDateRanges([ + new DateRange([ + 'startDate' => $now->subDays($days)->format('Y-m-d'), + 'endDate' => $now->format('Y-m-d') + ]) + ]); + $request->setOrderBys([ + new OrderBy([ + 'desc' => true, + 'metric' => new MetricOrderBy([ + 'metricName' => 'sessions', + ]) + ]), + ]); - $rows = $data->getRows() ?: []; + $data = $analytics->service->properties->runReport( + $analytics->viewId, + $request, + ); - $this->vars['rows'] = array_slice($rows, 0, $this->property('number')); - $this->vars['total'] = $data->getTotalsForAllResults()['ga:visits']; + $this->vars['rows'] = $data->getRows() ?: []; + $this->vars['mediumMap'] = [ + 'organic' => Lang::get('winter.googleanalytics::lang.mediums.organic'), + 'cpc' => Lang::get('winter.googleanalytics::lang.mediums.cpc'), + '(none)' => Lang::get('winter.googleanalytics::lang.mediums.direct'), + 'referral' => Lang::get('winter.googleanalytics::lang.mediums.referral'), + '(not set)' => Lang::get('winter.googleanalytics::lang.mediums.unknown'), + ]; } } diff --git a/reportwidgets/browsers/partials/_widget.htm b/reportwidgets/browsers/partials/_report.php similarity index 86% rename from reportwidgets/browsers/partials/_widget.htm rename to reportwidgets/browsers/partials/_report.php index e0a2691..33fd07e 100644 --- a/reportwidgets/browsers/partials/_widget.htm +++ b/reportwidgets/browsers/partials/_report.php @@ -11,7 +11,7 @@

property('title')) ?>

diff --git a/reportwidgets/browsers/partials/_widget.php b/reportwidgets/browsers/partials/_widget.php new file mode 100644 index 0000000..5c89ba4 --- /dev/null +++ b/reportwidgets/browsers/partials/_widget.php @@ -0,0 +1,10 @@ +
+

property('title')) ?>

+ + +
diff --git a/reportwidgets/toppages/partials/_widget.htm b/reportwidgets/toppages/partials/_report.php similarity index 68% rename from reportwidgets/toppages/partials/_widget.htm rename to reportwidgets/toppages/partials/_report.php index 75f8221..6173290 100644 --- a/reportwidgets/toppages/partials/_widget.htm +++ b/reportwidgets/toppages/partials/_report.php @@ -8,21 +8,25 @@

property('title')) ?>

- % + + % 0 ? round($row[1]/$total*100, 2) : 0; - $url = $row[0]; + $url = $row->getDimensionValues()[0]->getValue(); + $views = $row->getMetricValues()[0]->getValue(); + $users = $row->getMetricValues()[1]->getValue(); + $engagement = round($row->getMetricValues()[2]->getValue() * 100, 2); ?> - - + + +
-
- +
+
diff --git a/reportwidgets/toppages/partials/_widget.php b/reportwidgets/toppages/partials/_widget.php new file mode 100644 index 0000000..4d9d445 --- /dev/null +++ b/reportwidgets/toppages/partials/_widget.php @@ -0,0 +1,10 @@ +
+

property('title')) ?>

+ + +
diff --git a/reportwidgets/trafficgoal/partials/_widget.htm b/reportwidgets/trafficgoal/partials/_report.php similarity index 76% rename from reportwidgets/trafficgoal/partials/_widget.htm rename to reportwidgets/trafficgoal/partials/_report.php index 9ce53fe..4d677f5 100644 --- a/reportwidgets/trafficgoal/partials/_widget.htm +++ b/reportwidgets/trafficgoal/partials/_report.php @@ -3,10 +3,10 @@

property('title')) ?>

-

:

-

: property('goal')) ?>

+

:

+

: property('goal'))) ?>

- \ No newline at end of file + diff --git a/reportwidgets/trafficgoal/partials/_widget.php b/reportwidgets/trafficgoal/partials/_widget.php new file mode 100644 index 0000000..7618083 --- /dev/null +++ b/reportwidgets/trafficgoal/partials/_widget.php @@ -0,0 +1,10 @@ +
+

property('title')) ?>

+ + +
diff --git a/reportwidgets/trafficoverview/partials/_report.php b/reportwidgets/trafficoverview/partials/_report.php new file mode 100644 index 0000000..b4e53c2 --- /dev/null +++ b/reportwidgets/trafficoverview/partials/_report.php @@ -0,0 +1,24 @@ +
+

property('title')) ?>

+ + +
+ $rows): ?> + " + data-set-label=""> + + +
+ +

+ + +
diff --git a/reportwidgets/trafficoverview/partials/_widget.htm b/reportwidgets/trafficoverview/partials/_widget.htm deleted file mode 100644 index b0aa82e..0000000 --- a/reportwidgets/trafficoverview/partials/_widget.htm +++ /dev/null @@ -1,23 +0,0 @@ -
-

property('title')) ?>

- - -
- - - -
- -

- - -
\ No newline at end of file diff --git a/reportwidgets/trafficoverview/partials/_widget.php b/reportwidgets/trafficoverview/partials/_widget.php new file mode 100644 index 0000000..6dc8ae8 --- /dev/null +++ b/reportwidgets/trafficoverview/partials/_widget.php @@ -0,0 +1,10 @@ +
+

property('title')) ?>

+ + +
diff --git a/reportwidgets/trafficsources/partials/_widget.htm b/reportwidgets/trafficsources/partials/_report.php similarity index 76% rename from reportwidgets/trafficsources/partials/_widget.htm rename to reportwidgets/trafficsources/partials/_report.php index c0cc83e..16a2e78 100644 --- a/reportwidgets/trafficsources/partials/_widget.htm +++ b/reportwidgets/trafficsources/partials/_report.php @@ -9,11 +9,13 @@

property('title')) ?>

" data-control="chart-pie" data-size="property('reportSize') ?>" - data-center-text="" > @@ -24,4 +26,4 @@

property('title')) ?>

property('displayDescription')): ?>

- \ No newline at end of file + diff --git a/reportwidgets/trafficsources/partials/_widget.php b/reportwidgets/trafficsources/partials/_widget.php new file mode 100644 index 0000000..cebeac3 --- /dev/null +++ b/reportwidgets/trafficsources/partials/_widget.php @@ -0,0 +1,10 @@ +
+

property('title')) ?>

+ + +
diff --git a/updates/version.yaml b/updates/version.yaml index 1fc64b7..eca79f1 100644 --- a/updates/version.yaml +++ b/updates/version.yaml @@ -19,3 +19,4 @@ - v2.0.0/convert_data.php "2.0.1": "update guzzle dependency to >=6.0" "2.0.2": "allow guzzle dependency 7.0+" +"3.0.0": "!!! This plugin now only supports Google Analytics v4"