Version Description
- Bug Fixes:
- correction of some files with mixed endings, props by Edward Dekker
- only load the necessary resources for frontend widget
- corrected a JavaScript error on frontend sidebar widget
- Enhancements:
- introducing the gadwp_curl_options filter to allow changes on CURL options for the Google_IO_Curl class, props by Alexandre Simard
Download this release
Release Info
Developer | deconf |
Plugin | Google Analytics Dashboard for WP (GADWP) |
Version | 4.9.5 |
Comparing to | |
See all releases |
Code changes from version 4.9.4 to 4.9.5
- admin/ajax-actions.php +133 -133
- admin/css/admin-widgets.css +191 -191
- admin/css/gadwp.css +205 -205
- admin/css/item-reports.css +123 -123
- admin/item-reports.php +56 -56
- admin/js/settings.js +39 -39
- admin/js/ui.js +25 -25
- admin/js/wp-color-picker-script.js +10 -10
- admin/settings.php +1358 -1358
- admin/setup.php +357 -357
- admin/widgets.php +65 -65
- common/ajax-actions.php +43 -43
- common/js/reports.js +1107 -1107
- config.php +422 -422
- front/ajax-actions.php +152 -152
- front/css/item-reports.css +184 -184
- front/css/widgets.css +74 -74
- front/item-reports.php +38 -38
- front/js/widgets.js +12 -12
- front/setup.php +123 -123
- front/tracking.php +64 -64
- front/tracking/code-classic.php +33 -33
- front/tracking/code-universal.php +138 -138
- front/tracking/events-classic.php +55 -55
- front/tracking/events-universal.php +67 -67
- front/widgets.php +194 -194
- gadwp.php +258 -258
- install/install.php +149 -149
- install/uninstall.php +34 -34
- readme.txt +9 -1
- tools/autoload.php +37 -37
- tools/gapi.php +867 -862
- tools/iso3166.php +254 -254
- tools/src/Google/Auth/Abstract.php +39 -39
- tools/src/Google/Auth/AppIdentity.php +100 -100
- tools/src/Google/Auth/AssertionCredentials.php +142 -142
- tools/src/Google/Auth/Exception.php +20 -20
- tools/src/Google/Auth/LoginTicket.php +75 -75
- tools/src/Google/Auth/OAuth2.php +546 -546
- tools/src/Google/Auth/Simple.php +64 -64
- tools/src/Google/Cache/Abstract.php +57 -57
- tools/src/Google/Cache/Apc.php +107 -107
- tools/src/Google/Cache/Exception.php +20 -20
- tools/src/Google/Cache/File.php +185 -185
- tools/src/Google/Cache/Memcache.php +177 -177
- tools/src/Google/Cache/Null.php +53 -53
- tools/src/Google/Client.php +760 -760
- tools/src/Google/Collection.php +92 -92
- tools/src/Google/Config.php +446 -446
- tools/src/Google/Exception.php +19 -19
- tools/src/Google/Http/Batch.php +137 -137
- tools/src/Google/Http/CacheParser.php +181 -181
- tools/src/Google/Http/MediaFileUpload.php +314 -314
- tools/src/Google/Http/REST.php +142 -142
- tools/src/Google/Http/Request.php +497 -497
- tools/src/Google/IO/Abstract.php +339 -339
- tools/src/Google/IO/Curl.php +152 -152
- tools/src/Google/IO/Exception.php +20 -20
- tools/src/Google/IO/Stream.php +201 -201
- tools/src/Google/Logger/Abstract.php +409 -409
- tools/src/Google/Logger/Exception.php +20 -20
- tools/src/Google/Logger/File.php +148 -148
- tools/src/Google/Logger/Null.php +39 -39
- tools/src/Google/Logger/Psr.php +92 -92
- tools/src/Google/Model.php +282 -282
- tools/src/Google/Service.php +44 -44
- tools/src/Google/Service/Analytics.php +0 -1398
admin/ajax-actions.php
CHANGED
@@ -1,133 +1,133 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Backend_Ajax' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Backend_Ajax {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && ( ( 1 == $this->gadwp->config->options['backend_item_reports'] ) || ( 1 == $this->gadwp->config->options['dashboard_widget'] ) ) ) {
|
24 |
-
// Items action
|
25 |
-
add_action( 'wp_ajax_gadwp_backend_item_reports', array( $this, 'ajax_item_reports' ) );
|
26 |
-
}
|
27 |
-
if ( current_user_can( 'manage_options' ) ) {
|
28 |
-
// Admin Widget action
|
29 |
-
add_action( 'wp_ajax_gadwp_dismiss_notices', array( $this, 'ajax_dismiss_notices' ) );
|
30 |
-
}
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Ajax handler for Item Reports
|
35 |
-
*
|
36 |
-
* @return json|int
|
37 |
-
*/
|
38 |
-
public function ajax_item_reports() {
|
39 |
-
if ( ! isset( $_POST['gadwp_security_backend_item_reports'] ) || ! wp_verify_nonce( $_POST['gadwp_security_backend_item_reports'], 'gadwp_backend_item_reports' ) ) {
|
40 |
-
wp_die( - 30 );
|
41 |
-
}
|
42 |
-
if ( isset( $_POST['projectId'] ) && $this->gadwp->config->options['switch_profile'] && $_POST['projectId'] !== 'false' ) {
|
43 |
-
$projectId = $_POST['projectId'];
|
44 |
-
} else {
|
45 |
-
$projectId = false;
|
46 |
-
}
|
47 |
-
$from = $_POST['from'];
|
48 |
-
$to = $_POST['to'];
|
49 |
-
$query = $_POST['query'];
|
50 |
-
if ( isset( $_POST['filter'] ) ) {
|
51 |
-
$filter_id = $_POST['filter'];
|
52 |
-
} else {
|
53 |
-
$filter_id = false;
|
54 |
-
}
|
55 |
-
if ( ob_get_length() ) {
|
56 |
-
ob_clean();
|
57 |
-
}
|
58 |
-
|
59 |
-
if ( ! ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && ( ( 1 == $this->gadwp->config->options['backend_item_reports'] ) || ( 1 == $this->gadwp->config->options['dashboard_widget'] ) ) ) ) {
|
60 |
-
wp_die( - 31 );
|
61 |
-
}
|
62 |
-
if ( $this->gadwp->config->options['ga_dash_token'] && $this->gadwp->config->options['ga_dash_tableid_jail'] && $from && $to ) {
|
63 |
-
if ( null === $this->gadwp->gapi_controller ) {
|
64 |
-
$this->gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
65 |
-
}
|
66 |
-
} else {
|
67 |
-
wp_die( - 24 );
|
68 |
-
}
|
69 |
-
if ( $projectId == false ) {
|
70 |
-
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
71 |
-
}
|
72 |
-
$profile_info = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $projectId );
|
73 |
-
if ( isset( $profile_info[4] ) ) {
|
74 |
-
$this->gadwp->gapi_controller->timeshift = $profile_info[4];
|
75 |
-
} else {
|
76 |
-
$this->gadwp->gapi_controller->timeshift = (int) current_time( 'timestamp' ) - time();
|
77 |
-
}
|
78 |
-
|
79 |
-
if ( $filter_id ) {
|
80 |
-
$uri_parts = explode( '/', get_permalink( $filter_id ), 4 );
|
81 |
-
|
82 |
-
if ( isset( $uri_parts[3] ) ) {
|
83 |
-
$uri = '/' . $uri_parts[3];
|
84 |
-
} else {
|
85 |
-
wp_die( - 25 );
|
86 |
-
}
|
87 |
-
|
88 |
-
// allow URL correction before sending an API request
|
89 |
-
$filter = apply_filters( 'gadwp_backenditem_uri', $uri, $filter_id );
|
90 |
-
|
91 |
-
$lastchar = substr( $filter, - 1 );
|
92 |
-
|
93 |
-
if ( isset( $profile_info[6] ) && $profile_info[6] && $lastchar == '/' ) {
|
94 |
-
$filter = $filter . $profile_info[6];
|
95 |
-
}
|
96 |
-
|
97 |
-
// Encode URL
|
98 |
-
$filter = rawurlencode( rawurldecode( $filter ) );
|
99 |
-
} else {
|
100 |
-
$filter = false;
|
101 |
-
}
|
102 |
-
|
103 |
-
$queries = explode( ',', $query );
|
104 |
-
|
105 |
-
$results = array();
|
106 |
-
|
107 |
-
foreach ( $queries as $value ) {
|
108 |
-
$results[] = $this->gadwp->gapi_controller->get( $projectId, $value, $from, $to, $filter );
|
109 |
-
}
|
110 |
-
|
111 |
-
wp_send_json( $results );
|
112 |
-
}
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Ajax handler for dismissing Admin notices
|
116 |
-
*
|
117 |
-
* @return json|int
|
118 |
-
*/
|
119 |
-
public function ajax_dismiss_notices() {
|
120 |
-
if ( ! isset( $_POST['gadwp_security_dismiss_notices'] ) || ! wp_verify_nonce( $_POST['gadwp_security_dismiss_notices'], 'gadwp_dismiss_notices' ) ) {
|
121 |
-
wp_die( - 30 );
|
122 |
-
}
|
123 |
-
|
124 |
-
if ( ! current_user_can( 'manage_options' ) ) {
|
125 |
-
wp_die( - 31 );
|
126 |
-
}
|
127 |
-
|
128 |
-
delete_option( 'gadwp_got_updated' );
|
129 |
-
|
130 |
-
wp_die();
|
131 |
-
}
|
132 |
-
}
|
133 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Backend_Ajax' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Backend_Ajax {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && ( ( 1 == $this->gadwp->config->options['backend_item_reports'] ) || ( 1 == $this->gadwp->config->options['dashboard_widget'] ) ) ) {
|
24 |
+
// Items action
|
25 |
+
add_action( 'wp_ajax_gadwp_backend_item_reports', array( $this, 'ajax_item_reports' ) );
|
26 |
+
}
|
27 |
+
if ( current_user_can( 'manage_options' ) ) {
|
28 |
+
// Admin Widget action
|
29 |
+
add_action( 'wp_ajax_gadwp_dismiss_notices', array( $this, 'ajax_dismiss_notices' ) );
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Ajax handler for Item Reports
|
35 |
+
*
|
36 |
+
* @return json|int
|
37 |
+
*/
|
38 |
+
public function ajax_item_reports() {
|
39 |
+
if ( ! isset( $_POST['gadwp_security_backend_item_reports'] ) || ! wp_verify_nonce( $_POST['gadwp_security_backend_item_reports'], 'gadwp_backend_item_reports' ) ) {
|
40 |
+
wp_die( - 30 );
|
41 |
+
}
|
42 |
+
if ( isset( $_POST['projectId'] ) && $this->gadwp->config->options['switch_profile'] && $_POST['projectId'] !== 'false' ) {
|
43 |
+
$projectId = $_POST['projectId'];
|
44 |
+
} else {
|
45 |
+
$projectId = false;
|
46 |
+
}
|
47 |
+
$from = $_POST['from'];
|
48 |
+
$to = $_POST['to'];
|
49 |
+
$query = $_POST['query'];
|
50 |
+
if ( isset( $_POST['filter'] ) ) {
|
51 |
+
$filter_id = $_POST['filter'];
|
52 |
+
} else {
|
53 |
+
$filter_id = false;
|
54 |
+
}
|
55 |
+
if ( ob_get_length() ) {
|
56 |
+
ob_clean();
|
57 |
+
}
|
58 |
+
|
59 |
+
if ( ! ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && ( ( 1 == $this->gadwp->config->options['backend_item_reports'] ) || ( 1 == $this->gadwp->config->options['dashboard_widget'] ) ) ) ) {
|
60 |
+
wp_die( - 31 );
|
61 |
+
}
|
62 |
+
if ( $this->gadwp->config->options['ga_dash_token'] && $this->gadwp->config->options['ga_dash_tableid_jail'] && $from && $to ) {
|
63 |
+
if ( null === $this->gadwp->gapi_controller ) {
|
64 |
+
$this->gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
65 |
+
}
|
66 |
+
} else {
|
67 |
+
wp_die( - 24 );
|
68 |
+
}
|
69 |
+
if ( $projectId == false ) {
|
70 |
+
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
71 |
+
}
|
72 |
+
$profile_info = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $projectId );
|
73 |
+
if ( isset( $profile_info[4] ) ) {
|
74 |
+
$this->gadwp->gapi_controller->timeshift = $profile_info[4];
|
75 |
+
} else {
|
76 |
+
$this->gadwp->gapi_controller->timeshift = (int) current_time( 'timestamp' ) - time();
|
77 |
+
}
|
78 |
+
|
79 |
+
if ( $filter_id ) {
|
80 |
+
$uri_parts = explode( '/', get_permalink( $filter_id ), 4 );
|
81 |
+
|
82 |
+
if ( isset( $uri_parts[3] ) ) {
|
83 |
+
$uri = '/' . $uri_parts[3];
|
84 |
+
} else {
|
85 |
+
wp_die( - 25 );
|
86 |
+
}
|
87 |
+
|
88 |
+
// allow URL correction before sending an API request
|
89 |
+
$filter = apply_filters( 'gadwp_backenditem_uri', $uri, $filter_id );
|
90 |
+
|
91 |
+
$lastchar = substr( $filter, - 1 );
|
92 |
+
|
93 |
+
if ( isset( $profile_info[6] ) && $profile_info[6] && $lastchar == '/' ) {
|
94 |
+
$filter = $filter . $profile_info[6];
|
95 |
+
}
|
96 |
+
|
97 |
+
// Encode URL
|
98 |
+
$filter = rawurlencode( rawurldecode( $filter ) );
|
99 |
+
} else {
|
100 |
+
$filter = false;
|
101 |
+
}
|
102 |
+
|
103 |
+
$queries = explode( ',', $query );
|
104 |
+
|
105 |
+
$results = array();
|
106 |
+
|
107 |
+
foreach ( $queries as $value ) {
|
108 |
+
$results[] = $this->gadwp->gapi_controller->get( $projectId, $value, $from, $to, $filter );
|
109 |
+
}
|
110 |
+
|
111 |
+
wp_send_json( $results );
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Ajax handler for dismissing Admin notices
|
116 |
+
*
|
117 |
+
* @return json|int
|
118 |
+
*/
|
119 |
+
public function ajax_dismiss_notices() {
|
120 |
+
if ( ! isset( $_POST['gadwp_security_dismiss_notices'] ) || ! wp_verify_nonce( $_POST['gadwp_security_dismiss_notices'], 'gadwp_dismiss_notices' ) ) {
|
121 |
+
wp_die( - 30 );
|
122 |
+
}
|
123 |
+
|
124 |
+
if ( ! current_user_can( 'manage_options' ) ) {
|
125 |
+
wp_die( - 31 );
|
126 |
+
}
|
127 |
+
|
128 |
+
delete_option( 'gadwp_got_updated' );
|
129 |
+
|
130 |
+
wp_die();
|
131 |
+
}
|
132 |
+
}
|
133 |
+
}
|
admin/css/admin-widgets.css
CHANGED
@@ -1,192 +1,192 @@
|
|
1 |
-
/**
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
/* Real-Time content */
|
10 |
-
.gadwp-pline {
|
11 |
-
width: 100%;
|
12 |
-
margin: 0 0;
|
13 |
-
padding: 5px 0 5px 0;
|
14 |
-
background: #fff;
|
15 |
-
-moz-box-shadow: 0px 0px 3px 0px #BBB;
|
16 |
-
-webkit-box-shadow: 0px 0px 3px 0px #BBB;
|
17 |
-
box-shadow: 0px 0px 3px 0px #BBB;
|
18 |
-
display: table;
|
19 |
-
overflow: hidden;
|
20 |
-
}
|
21 |
-
|
22 |
-
.gadwp-pleft {
|
23 |
-
width: 90%;
|
24 |
-
float: left;
|
25 |
-
padding-left: 5px;
|
26 |
-
}
|
27 |
-
|
28 |
-
.gadwp-pright {
|
29 |
-
width: 5%;
|
30 |
-
float: right;
|
31 |
-
padding-right: 5px;
|
32 |
-
}
|
33 |
-
|
34 |
-
[id^=gadwp-realtime-] {
|
35 |
-
margin: 10px 0 0 0;
|
36 |
-
width: 100%;
|
37 |
-
}
|
38 |
-
|
39 |
-
.gadwp-rt-box {
|
40 |
-
width: 100%;
|
41 |
-
margin: 0 0;
|
42 |
-
background: #fff;
|
43 |
-
text-align: center;
|
44 |
-
-moz-box-shadow: 0px 0px 5px 0px #BBB;
|
45 |
-
-webkit-box-shadow: 0px 0px 5px 0px #BBB;
|
46 |
-
box-shadow: 0px 0px 5px 0px #BBB;
|
47 |
-
display: table;
|
48 |
-
}
|
49 |
-
|
50 |
-
.gadwp-tdo-left {
|
51 |
-
width: 60%;
|
52 |
-
padding: 33px 0;
|
53 |
-
float: left;
|
54 |
-
text-align: center;
|
55 |
-
}
|
56 |
-
|
57 |
-
.gadwp-tdo-right {
|
58 |
-
width: 35%;
|
59 |
-
margin: 0px 10px 0px 0;
|
60 |
-
text-align: left;
|
61 |
-
font-weight: bold;
|
62 |
-
vertical-align: middle;
|
63 |
-
float: right;
|
64 |
-
display: table;
|
65 |
-
}
|
66 |
-
|
67 |
-
.gadwp-online {
|
68 |
-
font-size: 100px;
|
69 |
-
font-weight: normal;
|
70 |
-
line-height: 1em;
|
71 |
-
margin: 0 auto;
|
72 |
-
width: 80%;
|
73 |
-
}
|
74 |
-
|
75 |
-
.gadwp-bigtext {
|
76 |
-
font-size: 14px;
|
77 |
-
width: 100%;
|
78 |
-
margin: 0 0;
|
79 |
-
padding: 5px 5px 5px 5px;
|
80 |
-
background: #fff;
|
81 |
-
-moz-box-shadow: 0px 0px 3px 0px #BBB;
|
82 |
-
-webkit-box-shadow: 0px 0px 3px 0px #BBB;
|
83 |
-
box-shadow: 0px 0px 3px 0px #BBB;
|
84 |
-
display: table;
|
85 |
-
overflow: hidden;
|
86 |
-
}
|
87 |
-
|
88 |
-
.gadwp-bleft {
|
89 |
-
float: left;
|
90 |
-
width: 80%;
|
91 |
-
}
|
92 |
-
|
93 |
-
.gadwp-bright {
|
94 |
-
float: right;
|
95 |
-
width: 20%;
|
96 |
-
}
|
97 |
-
|
98 |
-
.gadwp-pgdetailsr {
|
99 |
-
padding-left: 20px;
|
100 |
-
text-align: right;
|
101 |
-
}
|
102 |
-
|
103 |
-
.gadwp-pgdetailsl {
|
104 |
-
min-width: 250px;
|
105 |
-
}
|
106 |
-
|
107 |
-
[id^=gadwp-areachart-] {
|
108 |
-
width: 98%;
|
109 |
-
height: 100%;
|
110 |
-
margin: 10px auto 10px 0;
|
111 |
-
height: 250px;
|
112 |
-
}
|
113 |
-
|
114 |
-
.gadwp-floatwraper {
|
115 |
-
display: table;
|
116 |
-
width: 100%;
|
117 |
-
height: 100%;
|
118 |
-
}
|
119 |
-
|
120 |
-
[id^=gadwp-piechart-].halfsize {
|
121 |
-
width: 47%;
|
122 |
-
margin: 10px 0 0 0;
|
123 |
-
height: 200px;
|
124 |
-
float: left;
|
125 |
-
}
|
126 |
-
|
127 |
-
[id^=gadwp-piechart-].floatleft {
|
128 |
-
float: left;
|
129 |
-
}
|
130 |
-
|
131 |
-
[id^=gadwp-piechart-].floatright {
|
132 |
-
float: right;
|
133 |
-
}
|
134 |
-
|
135 |
-
[id^=gadwp-tablechart-], [id^=gadwp-tablechart-] {
|
136 |
-
width: 98%;
|
137 |
-
height: 100%;
|
138 |
-
margin: 10px auto 10px 0;
|
139 |
-
}
|
140 |
-
|
141 |
-
#dashboard-widgets-wrap .postbox {
|
142 |
-
margin-right: 10px;
|
143 |
-
}
|
144 |
-
|
145 |
-
/* Admin Widget content */
|
146 |
-
[id^=gadwp-progressbar-] {
|
147 |
-
width: 100%;
|
148 |
-
height: 3px;
|
149 |
-
margin: 5px 0 0px 0;
|
150 |
-
}
|
151 |
-
|
152 |
-
[id^=gadwp-bottomstats-] {
|
153 |
-
width: 100%;
|
154 |
-
}
|
155 |
-
|
156 |
-
[id^=gadwp-bottomstats-] .inside {
|
157 |
-
display: table;
|
158 |
-
margin: 0 auto;
|
159 |
-
padding: 0px;
|
160 |
-
}
|
161 |
-
|
162 |
-
#gadwp-widget .inside .small-box {
|
163 |
-
width: 30%;
|
164 |
-
float: left;
|
165 |
-
margin: 0 5px 10px 5px;
|
166 |
-
background: #fff;
|
167 |
-
text-align: center;
|
168 |
-
-moz-box-shadow: 0px 0px 7px 0px #BBB;
|
169 |
-
-webkit-box-shadow: 0px 0px 7px 0px #BBB;
|
170 |
-
box-shadow: 0px 0px 7px 0px #BBB;
|
171 |
-
}
|
172 |
-
|
173 |
-
#gadwp-widget .inside .small-box h3 {
|
174 |
-
font-size: 1em;
|
175 |
-
color: #777;
|
176 |
-
padding: 0px 5px 0px 5px;
|
177 |
-
margin: 0px 0px 0px 0px;
|
178 |
-
text-overflow: ellipsis;
|
179 |
-
overflow: hidden;
|
180 |
-
white-space: nowrap;
|
181 |
-
}
|
182 |
-
|
183 |
-
#gadwp-widget .inside .small-box p {
|
184 |
-
font-size: 1.2em;
|
185 |
-
margin: 0px 0px 2px 0px;
|
186 |
-
}
|
187 |
-
|
188 |
-
@media screen and (max-width: 410px) {
|
189 |
-
[id^=gadwp-bottomstats-] .inside .small-box {
|
190 |
-
width: 45%;
|
191 |
-
}
|
192 |
}
|
1 |
+
/**
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
/* Real-Time content */
|
10 |
+
.gadwp-pline {
|
11 |
+
width: 100%;
|
12 |
+
margin: 0 0;
|
13 |
+
padding: 5px 0 5px 0;
|
14 |
+
background: #fff;
|
15 |
+
-moz-box-shadow: 0px 0px 3px 0px #BBB;
|
16 |
+
-webkit-box-shadow: 0px 0px 3px 0px #BBB;
|
17 |
+
box-shadow: 0px 0px 3px 0px #BBB;
|
18 |
+
display: table;
|
19 |
+
overflow: hidden;
|
20 |
+
}
|
21 |
+
|
22 |
+
.gadwp-pleft {
|
23 |
+
width: 90%;
|
24 |
+
float: left;
|
25 |
+
padding-left: 5px;
|
26 |
+
}
|
27 |
+
|
28 |
+
.gadwp-pright {
|
29 |
+
width: 5%;
|
30 |
+
float: right;
|
31 |
+
padding-right: 5px;
|
32 |
+
}
|
33 |
+
|
34 |
+
[id^=gadwp-realtime-] {
|
35 |
+
margin: 10px 0 0 0;
|
36 |
+
width: 100%;
|
37 |
+
}
|
38 |
+
|
39 |
+
.gadwp-rt-box {
|
40 |
+
width: 100%;
|
41 |
+
margin: 0 0;
|
42 |
+
background: #fff;
|
43 |
+
text-align: center;
|
44 |
+
-moz-box-shadow: 0px 0px 5px 0px #BBB;
|
45 |
+
-webkit-box-shadow: 0px 0px 5px 0px #BBB;
|
46 |
+
box-shadow: 0px 0px 5px 0px #BBB;
|
47 |
+
display: table;
|
48 |
+
}
|
49 |
+
|
50 |
+
.gadwp-tdo-left {
|
51 |
+
width: 60%;
|
52 |
+
padding: 33px 0;
|
53 |
+
float: left;
|
54 |
+
text-align: center;
|
55 |
+
}
|
56 |
+
|
57 |
+
.gadwp-tdo-right {
|
58 |
+
width: 35%;
|
59 |
+
margin: 0px 10px 0px 0;
|
60 |
+
text-align: left;
|
61 |
+
font-weight: bold;
|
62 |
+
vertical-align: middle;
|
63 |
+
float: right;
|
64 |
+
display: table;
|
65 |
+
}
|
66 |
+
|
67 |
+
.gadwp-online {
|
68 |
+
font-size: 100px;
|
69 |
+
font-weight: normal;
|
70 |
+
line-height: 1em;
|
71 |
+
margin: 0 auto;
|
72 |
+
width: 80%;
|
73 |
+
}
|
74 |
+
|
75 |
+
.gadwp-bigtext {
|
76 |
+
font-size: 14px;
|
77 |
+
width: 100%;
|
78 |
+
margin: 0 0;
|
79 |
+
padding: 5px 5px 5px 5px;
|
80 |
+
background: #fff;
|
81 |
+
-moz-box-shadow: 0px 0px 3px 0px #BBB;
|
82 |
+
-webkit-box-shadow: 0px 0px 3px 0px #BBB;
|
83 |
+
box-shadow: 0px 0px 3px 0px #BBB;
|
84 |
+
display: table;
|
85 |
+
overflow: hidden;
|
86 |
+
}
|
87 |
+
|
88 |
+
.gadwp-bleft {
|
89 |
+
float: left;
|
90 |
+
width: 80%;
|
91 |
+
}
|
92 |
+
|
93 |
+
.gadwp-bright {
|
94 |
+
float: right;
|
95 |
+
width: 20%;
|
96 |
+
}
|
97 |
+
|
98 |
+
.gadwp-pgdetailsr {
|
99 |
+
padding-left: 20px;
|
100 |
+
text-align: right;
|
101 |
+
}
|
102 |
+
|
103 |
+
.gadwp-pgdetailsl {
|
104 |
+
min-width: 250px;
|
105 |
+
}
|
106 |
+
|
107 |
+
[id^=gadwp-areachart-] {
|
108 |
+
width: 98%;
|
109 |
+
height: 100%;
|
110 |
+
margin: 10px auto 10px 0;
|
111 |
+
height: 250px;
|
112 |
+
}
|
113 |
+
|
114 |
+
.gadwp-floatwraper {
|
115 |
+
display: table;
|
116 |
+
width: 100%;
|
117 |
+
height: 100%;
|
118 |
+
}
|
119 |
+
|
120 |
+
[id^=gadwp-piechart-].halfsize {
|
121 |
+
width: 47%;
|
122 |
+
margin: 10px 0 0 0;
|
123 |
+
height: 200px;
|
124 |
+
float: left;
|
125 |
+
}
|
126 |
+
|
127 |
+
[id^=gadwp-piechart-].floatleft {
|
128 |
+
float: left;
|
129 |
+
}
|
130 |
+
|
131 |
+
[id^=gadwp-piechart-].floatright {
|
132 |
+
float: right;
|
133 |
+
}
|
134 |
+
|
135 |
+
[id^=gadwp-tablechart-], [id^=gadwp-tablechart-] {
|
136 |
+
width: 98%;
|
137 |
+
height: 100%;
|
138 |
+
margin: 10px auto 10px 0;
|
139 |
+
}
|
140 |
+
|
141 |
+
#dashboard-widgets-wrap .postbox {
|
142 |
+
margin-right: 10px;
|
143 |
+
}
|
144 |
+
|
145 |
+
/* Admin Widget content */
|
146 |
+
[id^=gadwp-progressbar-] {
|
147 |
+
width: 100%;
|
148 |
+
height: 3px;
|
149 |
+
margin: 5px 0 0px 0;
|
150 |
+
}
|
151 |
+
|
152 |
+
[id^=gadwp-bottomstats-] {
|
153 |
+
width: 100%;
|
154 |
+
}
|
155 |
+
|
156 |
+
[id^=gadwp-bottomstats-] .inside {
|
157 |
+
display: table;
|
158 |
+
margin: 0 auto;
|
159 |
+
padding: 0px;
|
160 |
+
}
|
161 |
+
|
162 |
+
#gadwp-widget .inside .small-box {
|
163 |
+
width: 30%;
|
164 |
+
float: left;
|
165 |
+
margin: 0 5px 10px 5px;
|
166 |
+
background: #fff;
|
167 |
+
text-align: center;
|
168 |
+
-moz-box-shadow: 0px 0px 7px 0px #BBB;
|
169 |
+
-webkit-box-shadow: 0px 0px 7px 0px #BBB;
|
170 |
+
box-shadow: 0px 0px 7px 0px #BBB;
|
171 |
+
}
|
172 |
+
|
173 |
+
#gadwp-widget .inside .small-box h3 {
|
174 |
+
font-size: 1em;
|
175 |
+
color: #777;
|
176 |
+
padding: 0px 5px 0px 5px;
|
177 |
+
margin: 0px 0px 0px 0px;
|
178 |
+
text-overflow: ellipsis;
|
179 |
+
overflow: hidden;
|
180 |
+
white-space: nowrap;
|
181 |
+
}
|
182 |
+
|
183 |
+
#gadwp-widget .inside .small-box p {
|
184 |
+
font-size: 1.2em;
|
185 |
+
margin: 0px 0px 2px 0px;
|
186 |
+
}
|
187 |
+
|
188 |
+
@media screen and (max-width: 410px) {
|
189 |
+
[id^=gadwp-bottomstats-] .inside .small-box {
|
190 |
+
width: 45%;
|
191 |
+
}
|
192 |
}
|
admin/css/gadwp.css
CHANGED
@@ -1,206 +1,206 @@
|
|
1 |
-
/**
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
/* Tab navigation */
|
10 |
-
#gadwp-events, #gadwp-custom, #gadwp-advanced, #gadwp-exclude, #gadwp-config {
|
11 |
-
display: none;
|
12 |
-
}
|
13 |
-
|
14 |
-
/* Options pages */
|
15 |
-
table.gadwp-settings-options {
|
16 |
-
padding-left: 10px;
|
17 |
-
width: 100%;
|
18 |
-
}
|
19 |
-
|
20 |
-
.gadwp-settings-options td {
|
21 |
-
padding: 0px 5px 5px 5px;
|
22 |
-
}
|
23 |
-
|
24 |
-
td.gadwp-settings-title, td.info {
|
25 |
-
width: 130px;
|
26 |
-
padding-left: 20px;
|
27 |
-
}
|
28 |
-
|
29 |
-
td.gadwp-settings-title-s {
|
30 |
-
width: 300px;
|
31 |
-
}
|
32 |
-
|
33 |
-
.gadwp-help {
|
34 |
-
padding-left: 15px;
|
35 |
-
}
|
36 |
-
|
37 |
-
td.gadwp-settings-info {
|
38 |
-
padding-bottom: 15px;
|
39 |
-
}
|
40 |
-
|
41 |
-
td.gadwp-settings-title label {
|
42 |
-
font-weight: bold;
|
43 |
-
}
|
44 |
-
|
45 |
-
.gadash-title {
|
46 |
-
float: left;
|
47 |
-
margin-right: 10px;
|
48 |
-
margin-top: 2px;
|
49 |
-
clear: left;
|
50 |
-
}
|
51 |
-
|
52 |
-
.gadash-desc {
|
53 |
-
font-size: 1em;
|
54 |
-
}
|
55 |
-
|
56 |
-
.gadash-top {
|
57 |
-
vertical-align: top;
|
58 |
-
}
|
59 |
-
|
60 |
-
pre.gadwp-settings-logdata {
|
61 |
-
white-space: pre-wrap;
|
62 |
-
}
|
63 |
-
|
64 |
-
td.gadwp-settings-roles {
|
65 |
-
padding-bottom: 15px;
|
66 |
-
}
|
67 |
-
|
68 |
-
#ga_speed_samplerate, #ga_realtime_pages {
|
69 |
-
width: 50px;
|
70 |
-
}
|
71 |
-
|
72 |
-
#gapi-access-code {
|
73 |
-
color: red !important;
|
74 |
-
}
|
75 |
-
|
76 |
-
#poststuff.gadwp h2 {
|
77 |
-
padding-bottom: 0;
|
78 |
-
font-size: 19.5px;
|
79 |
-
font-weight: normal;
|
80 |
-
padding: 0;
|
81 |
-
margin: 20px 0 15px 0;
|
82 |
-
}
|
83 |
-
|
84 |
-
#poststuff.gadwp h2.nav-tab-wrapper {
|
85 |
-
border-bottom: 1px solid #ccc;
|
86 |
-
padding-bottom: 0;
|
87 |
-
}
|
88 |
-
|
89 |
-
/* Options pages ON/OFF Switch */
|
90 |
-
.button-primary.gadwp-settings-switchoo {
|
91 |
-
position: relative;
|
92 |
-
width: 50px;
|
93 |
-
float: left;
|
94 |
-
border: none;
|
95 |
-
padding: 0;
|
96 |
-
height: 22px;
|
97 |
-
-moz-box-shadow: none;
|
98 |
-
-webkit-box-shadow: none;
|
99 |
-
-o-box-shadow: none;
|
100 |
-
box-shadow: none;
|
101 |
-
-webkit-user-select: none;
|
102 |
-
-moz-user-select: none;
|
103 |
-
-ms-user-select: none;
|
104 |
-
}
|
105 |
-
|
106 |
-
input.gadwp-settings-switchoo-checkbox {
|
107 |
-
display: none;
|
108 |
-
}
|
109 |
-
|
110 |
-
.gadwp-settings-switchoo-label {
|
111 |
-
display: block;
|
112 |
-
overflow: hidden;
|
113 |
-
cursor: pointer;
|
114 |
-
background: transparent;
|
115 |
-
border: 1px solid #ddd;
|
116 |
-
border-radius: 2px;
|
117 |
-
text-shadow: none;
|
118 |
-
}
|
119 |
-
|
120 |
-
.gadwp-settings-switchoo-inner {
|
121 |
-
width: 200%;
|
122 |
-
margin-left: -100%;
|
123 |
-
border-radius: 2px;
|
124 |
-
-moz-transition: margin 0.2s ease-in 0s;
|
125 |
-
-webkit-transition: margin 0.2s ease-in 0s;
|
126 |
-
-o-transition: margin 0.2s ease-in 0s;
|
127 |
-
transition: margin 0.2s ease-in 0s;
|
128 |
-
}
|
129 |
-
|
130 |
-
.gadwp-settings-switchoo-inner:before, .gadwp-settings-switchoo-inner:after {
|
131 |
-
float: left;
|
132 |
-
width: 50%;
|
133 |
-
font-weight: normal;
|
134 |
-
-moz-box-sizing: border-box;
|
135 |
-
-webkit-box-sizing: border-box;
|
136 |
-
-o-box-sizing: border-box;
|
137 |
-
box-sizing: border-box;
|
138 |
-
height: 22px;
|
139 |
-
line-height: 22px;
|
140 |
-
font-size: 12px;
|
141 |
-
text-shadow: none;
|
142 |
-
}
|
143 |
-
|
144 |
-
.gadwp-settings-switchoo-inner:before {
|
145 |
-
content: "On";
|
146 |
-
padding-left: 5px;
|
147 |
-
border-bottom: none;
|
148 |
-
/* background-color: #00a0d2;
|
149 |
-
color: #fff; /* inherit from button props */
|
150 |
-
}
|
151 |
-
|
152 |
-
.gadwp-settings-switchoo-inner:after {
|
153 |
-
content: "Off";
|
154 |
-
padding-right: 5px;
|
155 |
-
background-color: #ddd;
|
156 |
-
text-align: right;
|
157 |
-
}
|
158 |
-
|
159 |
-
.gadwp-settings-switchoo-switch {
|
160 |
-
width: 22px;
|
161 |
-
height: 22px;
|
162 |
-
background: #fff;
|
163 |
-
color: #ddd;
|
164 |
-
border: 1px solid #ddd;
|
165 |
-
border-radius: 2px;
|
166 |
-
position: absolute;
|
167 |
-
top: 0;
|
168 |
-
bottom: 0;
|
169 |
-
right: 27px;
|
170 |
-
-moz-transition: all 0.2s ease-in 0s;
|
171 |
-
-webkit-transition: all 0.2s ease-in 0s;
|
172 |
-
-o-transition: all 0.2s ease-in 0s;
|
173 |
-
transition: all 0.2s ease-in 0s;
|
174 |
-
}
|
175 |
-
|
176 |
-
.gadwp-settings-switchoo-switch:hover {
|
177 |
-
color: #aaa;
|
178 |
-
border-color: #aaa;
|
179 |
-
}
|
180 |
-
|
181 |
-
.gadwp-settings-switchoo-switch:after {
|
182 |
-
margin: 0;
|
183 |
-
outline: 0;
|
184 |
-
display: inline-block;
|
185 |
-
font: 400 16px/16px dashicons;
|
186 |
-
content: "\f228";
|
187 |
-
padding: 3px 0 0 3px;
|
188 |
-
text-align: left;
|
189 |
-
text-decoration: none;
|
190 |
-
-webkit-font-smoothing: antialiased;
|
191 |
-
-moz-osx-font-smoothing: grayscale;
|
192 |
-
}
|
193 |
-
|
194 |
-
.gadwp-settings-switchoo-checkbox:checked+.gadwp-settings-switchoo-label .gadwp-settings-switchoo-inner {
|
195 |
-
margin-left: 0;
|
196 |
-
}
|
197 |
-
|
198 |
-
.gadwp-settings-switchoo-checkbox:checked+.gadwp-settings-switchoo-label .gadwp-settings-switchoo-switch {
|
199 |
-
right: 0px;
|
200 |
-
}
|
201 |
-
|
202 |
-
.switch-desc {
|
203 |
-
float: left;
|
204 |
-
margin-left: 10px;
|
205 |
-
line-height: 20px;
|
206 |
}
|
1 |
+
/**
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
/* Tab navigation */
|
10 |
+
#gadwp-events, #gadwp-custom, #gadwp-advanced, #gadwp-exclude, #gadwp-config {
|
11 |
+
display: none;
|
12 |
+
}
|
13 |
+
|
14 |
+
/* Options pages */
|
15 |
+
table.gadwp-settings-options {
|
16 |
+
padding-left: 10px;
|
17 |
+
width: 100%;
|
18 |
+
}
|
19 |
+
|
20 |
+
.gadwp-settings-options td {
|
21 |
+
padding: 0px 5px 5px 5px;
|
22 |
+
}
|
23 |
+
|
24 |
+
td.gadwp-settings-title, td.info {
|
25 |
+
width: 130px;
|
26 |
+
padding-left: 20px;
|
27 |
+
}
|
28 |
+
|
29 |
+
td.gadwp-settings-title-s {
|
30 |
+
width: 300px;
|
31 |
+
}
|
32 |
+
|
33 |
+
.gadwp-help {
|
34 |
+
padding-left: 15px;
|
35 |
+
}
|
36 |
+
|
37 |
+
td.gadwp-settings-info {
|
38 |
+
padding-bottom: 15px;
|
39 |
+
}
|
40 |
+
|
41 |
+
td.gadwp-settings-title label {
|
42 |
+
font-weight: bold;
|
43 |
+
}
|
44 |
+
|
45 |
+
.gadash-title {
|
46 |
+
float: left;
|
47 |
+
margin-right: 10px;
|
48 |
+
margin-top: 2px;
|
49 |
+
clear: left;
|
50 |
+
}
|
51 |
+
|
52 |
+
.gadash-desc {
|
53 |
+
font-size: 1em;
|
54 |
+
}
|
55 |
+
|
56 |
+
.gadash-top {
|
57 |
+
vertical-align: top;
|
58 |
+
}
|
59 |
+
|
60 |
+
pre.gadwp-settings-logdata {
|
61 |
+
white-space: pre-wrap;
|
62 |
+
}
|
63 |
+
|
64 |
+
td.gadwp-settings-roles {
|
65 |
+
padding-bottom: 15px;
|
66 |
+
}
|
67 |
+
|
68 |
+
#ga_speed_samplerate, #ga_realtime_pages {
|
69 |
+
width: 50px;
|
70 |
+
}
|
71 |
+
|
72 |
+
#gapi-access-code {
|
73 |
+
color: red !important;
|
74 |
+
}
|
75 |
+
|
76 |
+
#poststuff.gadwp h2 {
|
77 |
+
padding-bottom: 0;
|
78 |
+
font-size: 19.5px;
|
79 |
+
font-weight: normal;
|
80 |
+
padding: 0;
|
81 |
+
margin: 20px 0 15px 0;
|
82 |
+
}
|
83 |
+
|
84 |
+
#poststuff.gadwp h2.nav-tab-wrapper {
|
85 |
+
border-bottom: 1px solid #ccc;
|
86 |
+
padding-bottom: 0;
|
87 |
+
}
|
88 |
+
|
89 |
+
/* Options pages ON/OFF Switch */
|
90 |
+
.button-primary.gadwp-settings-switchoo {
|
91 |
+
position: relative;
|
92 |
+
width: 50px;
|
93 |
+
float: left;
|
94 |
+
border: none;
|
95 |
+
padding: 0;
|
96 |
+
height: 22px;
|
97 |
+
-moz-box-shadow: none;
|
98 |
+
-webkit-box-shadow: none;
|
99 |
+
-o-box-shadow: none;
|
100 |
+
box-shadow: none;
|
101 |
+
-webkit-user-select: none;
|
102 |
+
-moz-user-select: none;
|
103 |
+
-ms-user-select: none;
|
104 |
+
}
|
105 |
+
|
106 |
+
input.gadwp-settings-switchoo-checkbox {
|
107 |
+
display: none;
|
108 |
+
}
|
109 |
+
|
110 |
+
.gadwp-settings-switchoo-label {
|
111 |
+
display: block;
|
112 |
+
overflow: hidden;
|
113 |
+
cursor: pointer;
|
114 |
+
background: transparent;
|
115 |
+
border: 1px solid #ddd;
|
116 |
+
border-radius: 2px;
|
117 |
+
text-shadow: none;
|
118 |
+
}
|
119 |
+
|
120 |
+
.gadwp-settings-switchoo-inner {
|
121 |
+
width: 200%;
|
122 |
+
margin-left: -100%;
|
123 |
+
border-radius: 2px;
|
124 |
+
-moz-transition: margin 0.2s ease-in 0s;
|
125 |
+
-webkit-transition: margin 0.2s ease-in 0s;
|
126 |
+
-o-transition: margin 0.2s ease-in 0s;
|
127 |
+
transition: margin 0.2s ease-in 0s;
|
128 |
+
}
|
129 |
+
|
130 |
+
.gadwp-settings-switchoo-inner:before, .gadwp-settings-switchoo-inner:after {
|
131 |
+
float: left;
|
132 |
+
width: 50%;
|
133 |
+
font-weight: normal;
|
134 |
+
-moz-box-sizing: border-box;
|
135 |
+
-webkit-box-sizing: border-box;
|
136 |
+
-o-box-sizing: border-box;
|
137 |
+
box-sizing: border-box;
|
138 |
+
height: 22px;
|
139 |
+
line-height: 22px;
|
140 |
+
font-size: 12px;
|
141 |
+
text-shadow: none;
|
142 |
+
}
|
143 |
+
|
144 |
+
.gadwp-settings-switchoo-inner:before {
|
145 |
+
content: "On";
|
146 |
+
padding-left: 5px;
|
147 |
+
border-bottom: none;
|
148 |
+
/* background-color: #00a0d2;
|
149 |
+
color: #fff; /* inherit from button props */
|
150 |
+
}
|
151 |
+
|
152 |
+
.gadwp-settings-switchoo-inner:after {
|
153 |
+
content: "Off";
|
154 |
+
padding-right: 5px;
|
155 |
+
background-color: #ddd;
|
156 |
+
text-align: right;
|
157 |
+
}
|
158 |
+
|
159 |
+
.gadwp-settings-switchoo-switch {
|
160 |
+
width: 22px;
|
161 |
+
height: 22px;
|
162 |
+
background: #fff;
|
163 |
+
color: #ddd;
|
164 |
+
border: 1px solid #ddd;
|
165 |
+
border-radius: 2px;
|
166 |
+
position: absolute;
|
167 |
+
top: 0;
|
168 |
+
bottom: 0;
|
169 |
+
right: 27px;
|
170 |
+
-moz-transition: all 0.2s ease-in 0s;
|
171 |
+
-webkit-transition: all 0.2s ease-in 0s;
|
172 |
+
-o-transition: all 0.2s ease-in 0s;
|
173 |
+
transition: all 0.2s ease-in 0s;
|
174 |
+
}
|
175 |
+
|
176 |
+
.gadwp-settings-switchoo-switch:hover {
|
177 |
+
color: #aaa;
|
178 |
+
border-color: #aaa;
|
179 |
+
}
|
180 |
+
|
181 |
+
.gadwp-settings-switchoo-switch:after {
|
182 |
+
margin: 0;
|
183 |
+
outline: 0;
|
184 |
+
display: inline-block;
|
185 |
+
font: 400 16px/16px dashicons;
|
186 |
+
content: "\f228";
|
187 |
+
padding: 3px 0 0 3px;
|
188 |
+
text-align: left;
|
189 |
+
text-decoration: none;
|
190 |
+
-webkit-font-smoothing: antialiased;
|
191 |
+
-moz-osx-font-smoothing: grayscale;
|
192 |
+
}
|
193 |
+
|
194 |
+
.gadwp-settings-switchoo-checkbox:checked+.gadwp-settings-switchoo-label .gadwp-settings-switchoo-inner {
|
195 |
+
margin-left: 0;
|
196 |
+
}
|
197 |
+
|
198 |
+
.gadwp-settings-switchoo-checkbox:checked+.gadwp-settings-switchoo-label .gadwp-settings-switchoo-switch {
|
199 |
+
right: 0px;
|
200 |
+
}
|
201 |
+
|
202 |
+
.switch-desc {
|
203 |
+
float: left;
|
204 |
+
margin-left: 10px;
|
205 |
+
line-height: 20px;
|
206 |
}
|
admin/css/item-reports.css
CHANGED
@@ -1,124 +1,124 @@
|
|
1 |
-
/**
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
/* Backend Item Reports */
|
10 |
-
.column-gadwp_stats {
|
11 |
-
width: 70px;
|
12 |
-
}
|
13 |
-
|
14 |
-
.gadwp-icon {
|
15 |
-
color: #555;
|
16 |
-
}
|
17 |
-
|
18 |
-
.gadwp-icon:hover {
|
19 |
-
color: #2ea2cc;
|
20 |
-
}
|
21 |
-
|
22 |
-
.gadwp-icon-oldwp {
|
23 |
-
padding-top: 5px;
|
24 |
-
}
|
25 |
-
|
26 |
-
[id^=gadwp-container-] {
|
27 |
-
width: 480px;
|
28 |
-
}
|
29 |
-
|
30 |
-
[id^=gadwp-areachart-] {
|
31 |
-
height: 280px;
|
32 |
-
}
|
33 |
-
|
34 |
-
[id^=gadwp-progressbar-] {
|
35 |
-
width: 100%;
|
36 |
-
height: 3px;
|
37 |
-
margin: 5px 0 0px 0;
|
38 |
-
}
|
39 |
-
|
40 |
-
[id^=gadwp-bottomstats-] {
|
41 |
-
width: 100%;
|
42 |
-
}
|
43 |
-
|
44 |
-
[id^=gadwp-bottomstats-] .inside {
|
45 |
-
display: table;
|
46 |
-
margin: 0 auto;
|
47 |
-
padding: 0px;
|
48 |
-
}
|
49 |
-
|
50 |
-
[id^=gadwp-bottomstats-] .inside .small-box {
|
51 |
-
width: 31.2%;
|
52 |
-
float: left;
|
53 |
-
margin: 10px 5px 10px 5px;
|
54 |
-
background: #fff;
|
55 |
-
text-align: center;
|
56 |
-
-moz-box-shadow: 0px 0px 7px 0px #BBB;
|
57 |
-
-webkit-box-shadow: 0px 0px 7px 0px #BBB;
|
58 |
-
box-shadow: 0px 0px 7px 0px #BBB;
|
59 |
-
}
|
60 |
-
|
61 |
-
[id^=gadwp-bottomstats-] .inside .small-box h3 {
|
62 |
-
font-family: 'Open Sans', sans-serif;
|
63 |
-
font-size: 1em;
|
64 |
-
color: #777;
|
65 |
-
padding: 0px 5px 0px 5px;
|
66 |
-
margin: 0px 0px 0px 0px;
|
67 |
-
text-overflow: ellipsis;
|
68 |
-
overflow: hidden;
|
69 |
-
white-space: nowrap;
|
70 |
-
}
|
71 |
-
|
72 |
-
[id^=gadwp-bottomstats-] .inside .small-box p {
|
73 |
-
font-size: 1.2em;
|
74 |
-
margin: 0px 0px 2px 0px;
|
75 |
-
}
|
76 |
-
|
77 |
-
.gadwp-floatwraper {
|
78 |
-
display: table;
|
79 |
-
width: 100%;
|
80 |
-
height: 100%;
|
81 |
-
}
|
82 |
-
|
83 |
-
[id^=gadwp-piechart-].halfsize {
|
84 |
-
width: 47%;
|
85 |
-
margin: 10px 0 0 0;
|
86 |
-
height: 200px;
|
87 |
-
float: left;
|
88 |
-
}
|
89 |
-
|
90 |
-
[id^=gadwp-piechart-].floatleft {
|
91 |
-
float: left;
|
92 |
-
}
|
93 |
-
|
94 |
-
[id^=gadwp-piechart-].floatright {
|
95 |
-
float: right;
|
96 |
-
}
|
97 |
-
|
98 |
-
[id^=gadwp-tablechart-], [id^=gadwp-tablechart-] {
|
99 |
-
margin: 10px 0 0 0;
|
100 |
-
}
|
101 |
-
|
102 |
-
.gadwp .ui-dialog-titlebar {
|
103 |
-
font-size: 1.1em;
|
104 |
-
text-overflow: ellipsis;
|
105 |
-
overflow: hidden;
|
106 |
-
}
|
107 |
-
|
108 |
-
@media screen and (max-width: 500px) {
|
109 |
-
[id^=gadwp-container-] {
|
110 |
-
width: 410px;
|
111 |
-
}
|
112 |
-
[id^=gadwp-bottomstats-] .inside .small-box {
|
113 |
-
width: 30.8%;
|
114 |
-
}
|
115 |
-
}
|
116 |
-
|
117 |
-
@media screen and (max-width: 410px) {
|
118 |
-
[id^=gadwp-container-] {
|
119 |
-
width: 260px;
|
120 |
-
}
|
121 |
-
[id^=gadwp-bottomstats-] .inside .small-box {
|
122 |
-
width: 46%;
|
123 |
-
}
|
124 |
}
|
1 |
+
/**
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
/* Backend Item Reports */
|
10 |
+
.column-gadwp_stats {
|
11 |
+
width: 70px;
|
12 |
+
}
|
13 |
+
|
14 |
+
.gadwp-icon {
|
15 |
+
color: #555;
|
16 |
+
}
|
17 |
+
|
18 |
+
.gadwp-icon:hover {
|
19 |
+
color: #2ea2cc;
|
20 |
+
}
|
21 |
+
|
22 |
+
.gadwp-icon-oldwp {
|
23 |
+
padding-top: 5px;
|
24 |
+
}
|
25 |
+
|
26 |
+
[id^=gadwp-container-] {
|
27 |
+
width: 480px;
|
28 |
+
}
|
29 |
+
|
30 |
+
[id^=gadwp-areachart-] {
|
31 |
+
height: 280px;
|
32 |
+
}
|
33 |
+
|
34 |
+
[id^=gadwp-progressbar-] {
|
35 |
+
width: 100%;
|
36 |
+
height: 3px;
|
37 |
+
margin: 5px 0 0px 0;
|
38 |
+
}
|
39 |
+
|
40 |
+
[id^=gadwp-bottomstats-] {
|
41 |
+
width: 100%;
|
42 |
+
}
|
43 |
+
|
44 |
+
[id^=gadwp-bottomstats-] .inside {
|
45 |
+
display: table;
|
46 |
+
margin: 0 auto;
|
47 |
+
padding: 0px;
|
48 |
+
}
|
49 |
+
|
50 |
+
[id^=gadwp-bottomstats-] .inside .small-box {
|
51 |
+
width: 31.2%;
|
52 |
+
float: left;
|
53 |
+
margin: 10px 5px 10px 5px;
|
54 |
+
background: #fff;
|
55 |
+
text-align: center;
|
56 |
+
-moz-box-shadow: 0px 0px 7px 0px #BBB;
|
57 |
+
-webkit-box-shadow: 0px 0px 7px 0px #BBB;
|
58 |
+
box-shadow: 0px 0px 7px 0px #BBB;
|
59 |
+
}
|
60 |
+
|
61 |
+
[id^=gadwp-bottomstats-] .inside .small-box h3 {
|
62 |
+
font-family: 'Open Sans', sans-serif;
|
63 |
+
font-size: 1em;
|
64 |
+
color: #777;
|
65 |
+
padding: 0px 5px 0px 5px;
|
66 |
+
margin: 0px 0px 0px 0px;
|
67 |
+
text-overflow: ellipsis;
|
68 |
+
overflow: hidden;
|
69 |
+
white-space: nowrap;
|
70 |
+
}
|
71 |
+
|
72 |
+
[id^=gadwp-bottomstats-] .inside .small-box p {
|
73 |
+
font-size: 1.2em;
|
74 |
+
margin: 0px 0px 2px 0px;
|
75 |
+
}
|
76 |
+
|
77 |
+
.gadwp-floatwraper {
|
78 |
+
display: table;
|
79 |
+
width: 100%;
|
80 |
+
height: 100%;
|
81 |
+
}
|
82 |
+
|
83 |
+
[id^=gadwp-piechart-].halfsize {
|
84 |
+
width: 47%;
|
85 |
+
margin: 10px 0 0 0;
|
86 |
+
height: 200px;
|
87 |
+
float: left;
|
88 |
+
}
|
89 |
+
|
90 |
+
[id^=gadwp-piechart-].floatleft {
|
91 |
+
float: left;
|
92 |
+
}
|
93 |
+
|
94 |
+
[id^=gadwp-piechart-].floatright {
|
95 |
+
float: right;
|
96 |
+
}
|
97 |
+
|
98 |
+
[id^=gadwp-tablechart-], [id^=gadwp-tablechart-] {
|
99 |
+
margin: 10px 0 0 0;
|
100 |
+
}
|
101 |
+
|
102 |
+
.gadwp .ui-dialog-titlebar {
|
103 |
+
font-size: 1.1em;
|
104 |
+
text-overflow: ellipsis;
|
105 |
+
overflow: hidden;
|
106 |
+
}
|
107 |
+
|
108 |
+
@media screen and (max-width: 500px) {
|
109 |
+
[id^=gadwp-container-] {
|
110 |
+
width: 410px;
|
111 |
+
}
|
112 |
+
[id^=gadwp-bottomstats-] .inside .small-box {
|
113 |
+
width: 30.8%;
|
114 |
+
}
|
115 |
+
}
|
116 |
+
|
117 |
+
@media screen and (max-width: 410px) {
|
118 |
+
[id^=gadwp-container-] {
|
119 |
+
width: 260px;
|
120 |
+
}
|
121 |
+
[id^=gadwp-bottomstats-] .inside .small-box {
|
122 |
+
width: 46%;
|
123 |
+
}
|
124 |
}
|
admin/item-reports.php
CHANGED
@@ -1,56 +1,56 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Backend_Item_Reports' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Backend_Item_Reports {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && 1 == $this->gadwp->config->options['backend_item_reports'] ) {
|
24 |
-
// Add custom column in Posts List
|
25 |
-
add_filter( 'manage_posts_columns', array( $this, 'add_columns' ) );
|
26 |
-
|
27 |
-
// Populate custom column in Posts List
|
28 |
-
add_action( 'manage_posts_custom_column', array( $this, 'add_icons' ), 10, 2 );
|
29 |
-
|
30 |
-
// Add custom column in Pages List
|
31 |
-
add_filter( 'manage_pages_columns', array( $this, 'add_columns' ) );
|
32 |
-
|
33 |
-
// Populate custom column in Pages List
|
34 |
-
add_action( 'manage_pages_custom_column', array( $this, 'add_icons' ), 10, 2 );
|
35 |
-
}
|
36 |
-
}
|
37 |
-
|
38 |
-
public function add_icons( $column, $id ) {
|
39 |
-
global $wp_version;
|
40 |
-
|
41 |
-
if ( $column != 'gadwp_stats' ) {
|
42 |
-
return;
|
43 |
-
}
|
44 |
-
|
45 |
-
if ( version_compare( $wp_version, '3.8.0', '>=' ) ) {
|
46 |
-
echo '<a id="gadwp-' . $id . '" title="' . get_the_title( $id ) . '" href="#' . $id . '" class="gadwp-icon dashicons-before dashicons-chart-area"></a>';
|
47 |
-
} else {
|
48 |
-
echo '<a id="gadwp-' . $id . '" title="' . get_the_title( $id ) . '" href="#' . $id . '"><img class="gadwp-icon-oldwp" src="' . GADWP_URL . 'admin/images/gadash-icon.png"</a>';
|
49 |
-
}
|
50 |
-
}
|
51 |
-
|
52 |
-
public function add_columns( $columns ) {
|
53 |
-
return array_merge( $columns, array( 'gadwp_stats' => __( 'Analytics', 'google-analytics-dashboard-for-wp' ) ) );
|
54 |
-
}
|
55 |
-
}
|
56 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Backend_Item_Reports' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Backend_Item_Reports {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && 1 == $this->gadwp->config->options['backend_item_reports'] ) {
|
24 |
+
// Add custom column in Posts List
|
25 |
+
add_filter( 'manage_posts_columns', array( $this, 'add_columns' ) );
|
26 |
+
|
27 |
+
// Populate custom column in Posts List
|
28 |
+
add_action( 'manage_posts_custom_column', array( $this, 'add_icons' ), 10, 2 );
|
29 |
+
|
30 |
+
// Add custom column in Pages List
|
31 |
+
add_filter( 'manage_pages_columns', array( $this, 'add_columns' ) );
|
32 |
+
|
33 |
+
// Populate custom column in Pages List
|
34 |
+
add_action( 'manage_pages_custom_column', array( $this, 'add_icons' ), 10, 2 );
|
35 |
+
}
|
36 |
+
}
|
37 |
+
|
38 |
+
public function add_icons( $column, $id ) {
|
39 |
+
global $wp_version;
|
40 |
+
|
41 |
+
if ( $column != 'gadwp_stats' ) {
|
42 |
+
return;
|
43 |
+
}
|
44 |
+
|
45 |
+
if ( version_compare( $wp_version, '3.8.0', '>=' ) ) {
|
46 |
+
echo '<a id="gadwp-' . $id . '" title="' . get_the_title( $id ) . '" href="#' . $id . '" class="gadwp-icon dashicons-before dashicons-chart-area"></a>';
|
47 |
+
} else {
|
48 |
+
echo '<a id="gadwp-' . $id . '" title="' . get_the_title( $id ) . '" href="#' . $id . '"><img class="gadwp-icon-oldwp" src="' . GADWP_URL . 'admin/images/gadash-icon.png"</a>';
|
49 |
+
}
|
50 |
+
}
|
51 |
+
|
52 |
+
public function add_columns( $columns ) {
|
53 |
+
return array_merge( $columns, array( 'gadwp_stats' => __( 'Analytics', 'google-analytics-dashboard-for-wp' ) ) );
|
54 |
+
}
|
55 |
+
}
|
56 |
+
}
|
admin/js/settings.js
CHANGED
@@ -1,40 +1,40 @@
|
|
1 |
-
/*-
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
/*
|
10 |
-
* Navigation Tabs
|
11 |
-
*/
|
12 |
-
jQuery( document ).ready( function () {
|
13 |
-
if ( window.location.href.indexOf( "page=gadash_" ) != -1 ) {
|
14 |
-
var ident = 'basic';
|
15 |
-
|
16 |
-
if ( window.location.hash ) {
|
17 |
-
ident = window.location.hash.split( '#' )[ 2 ].split( '-' )[ 1 ];
|
18 |
-
} else if ( window.location.href.indexOf( "page=gadash_errors_debugging" ) != -1 ) {
|
19 |
-
ident = 'errors';
|
20 |
-
}
|
21 |
-
|
22 |
-
jQuery( ".nav-tab-wrapper a" ).each( function ( index ) {
|
23 |
-
jQuery( this ).removeClass( "nav-tab-active" );
|
24 |
-
jQuery( "#" + this.hash.split( '#' )[ 2 ] ).hide();
|
25 |
-
} );
|
26 |
-
jQuery( "#tab-" + ident ).addClass( "nav-tab-active" );
|
27 |
-
jQuery( "#gadwp-" + ident ).show();
|
28 |
-
}
|
29 |
-
|
30 |
-
jQuery( 'a[href^="#"]' ).click( function ( e ) {
|
31 |
-
if ( window.location.href.indexOf( "page=gadash_" ) != -1 ) {
|
32 |
-
jQuery( ".nav-tab-wrapper a" ).each( function ( index ) {
|
33 |
-
jQuery( this ).removeClass( "nav-tab-active" );
|
34 |
-
jQuery( "#" + this.hash.split( '#' )[ 2 ] ).hide();
|
35 |
-
} );
|
36 |
-
jQuery( this ).addClass( "nav-tab-active" );
|
37 |
-
jQuery( "#" + this.hash.split( '#' )[ 2 ] ).show();
|
38 |
-
}
|
39 |
-
} );
|
40 |
} );
|
1 |
+
/*-
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
/*
|
10 |
+
* Navigation Tabs
|
11 |
+
*/
|
12 |
+
jQuery( document ).ready( function () {
|
13 |
+
if ( window.location.href.indexOf( "page=gadash_" ) != -1 ) {
|
14 |
+
var ident = 'basic';
|
15 |
+
|
16 |
+
if ( window.location.hash ) {
|
17 |
+
ident = window.location.hash.split( '#' )[ 2 ].split( '-' )[ 1 ];
|
18 |
+
} else if ( window.location.href.indexOf( "page=gadash_errors_debugging" ) != -1 ) {
|
19 |
+
ident = 'errors';
|
20 |
+
}
|
21 |
+
|
22 |
+
jQuery( ".nav-tab-wrapper a" ).each( function ( index ) {
|
23 |
+
jQuery( this ).removeClass( "nav-tab-active" );
|
24 |
+
jQuery( "#" + this.hash.split( '#' )[ 2 ] ).hide();
|
25 |
+
} );
|
26 |
+
jQuery( "#tab-" + ident ).addClass( "nav-tab-active" );
|
27 |
+
jQuery( "#gadwp-" + ident ).show();
|
28 |
+
}
|
29 |
+
|
30 |
+
jQuery( 'a[href^="#"]' ).click( function ( e ) {
|
31 |
+
if ( window.location.href.indexOf( "page=gadash_" ) != -1 ) {
|
32 |
+
jQuery( ".nav-tab-wrapper a" ).each( function ( index ) {
|
33 |
+
jQuery( this ).removeClass( "nav-tab-active" );
|
34 |
+
jQuery( "#" + this.hash.split( '#' )[ 2 ] ).hide();
|
35 |
+
} );
|
36 |
+
jQuery( this ).addClass( "nav-tab-active" );
|
37 |
+
jQuery( "#" + this.hash.split( '#' )[ 2 ] ).show();
|
38 |
+
}
|
39 |
+
} );
|
40 |
} );
|
admin/js/ui.js
CHANGED
@@ -1,26 +1,26 @@
|
|
1 |
-
/*-
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
"use strict";
|
10 |
-
|
11 |
-
jQuery( document ).ready( function () {
|
12 |
-
|
13 |
-
var gadwp_ui = {
|
14 |
-
action : 'gadwp_dismiss_notices',
|
15 |
-
gadwp_security_dismiss_notices : gadwp_ui_data.security,
|
16 |
-
}
|
17 |
-
|
18 |
-
jQuery( "#gadwp-notice .notice-dismiss" ).click( function () {
|
19 |
-
jQuery.post( gadwp_ui_data.ajaxurl, gadwp_ui );
|
20 |
-
} );
|
21 |
-
|
22 |
-
if ( gadwp_ui_data.ed_bubble != '' ) {
|
23 |
-
jQuery( '#toplevel_page_gadash_settings li > a[href*="page=gadash_errors_debugging"]' ).append( ' <span class="awaiting-mod count-1"><span class="pending-count" style="padding:0 7px;">' + gadwp_ui_data.ed_bubble + '</span></span>' );
|
24 |
-
}
|
25 |
-
|
26 |
} );
|
1 |
+
/*-
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
"use strict";
|
10 |
+
|
11 |
+
jQuery( document ).ready( function () {
|
12 |
+
|
13 |
+
var gadwp_ui = {
|
14 |
+
action : 'gadwp_dismiss_notices',
|
15 |
+
gadwp_security_dismiss_notices : gadwp_ui_data.security,
|
16 |
+
}
|
17 |
+
|
18 |
+
jQuery( "#gadwp-notice .notice-dismiss" ).click( function () {
|
19 |
+
jQuery.post( gadwp_ui_data.ajaxurl, gadwp_ui );
|
20 |
+
} );
|
21 |
+
|
22 |
+
if ( gadwp_ui_data.ed_bubble != '' ) {
|
23 |
+
jQuery( '#toplevel_page_gadash_settings li > a[href*="page=gadash_errors_debugging"]' ).append( ' <span class="awaiting-mod count-1"><span class="pending-count" style="padding:0 7px;">' + gadwp_ui_data.ed_bubble + '</span></span>' );
|
24 |
+
}
|
25 |
+
|
26 |
} );
|
admin/js/wp-color-picker-script.js
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*-
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
jQuery( document ).ready( function () {
|
10 |
-
jQuery( '.ga_dash_style' ).wpColorPicker();
|
11 |
} );
|
1 |
+
/*-
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
jQuery( document ).ready( function () {
|
10 |
+
jQuery( '.ga_dash_style' ).wpColorPicker();
|
11 |
} );
|
admin/settings.php
CHANGED
@@ -1,1358 +1,1358 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
final class GADWP_Settings {
|
15 |
-
|
16 |
-
private static function update_options( $who ) {
|
17 |
-
$gadwp = GADWP();
|
18 |
-
$network_settings = false;
|
19 |
-
$options = $gadwp->config->options; // Get current options
|
20 |
-
if ( isset( $_POST['options']['ga_dash_hidden'] ) && isset( $_POST['options'] ) && ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) && $who != 'Reset' ) {
|
21 |
-
$new_options = $_POST['options'];
|
22 |
-
if ( $who == 'tracking' ) {
|
23 |
-
$options['ga_dash_anonim'] = 0;
|
24 |
-
$options['ga_event_tracking'] = 0;
|
25 |
-
$options['ga_enhanced_links'] = 0;
|
26 |
-
$options['ga_dash_remarketing'] = 0;
|
27 |
-
$options['ga_dash_adsense'] = 0;
|
28 |
-
$options['ga_event_bouncerate'] = 0;
|
29 |
-
$options['ga_crossdomain_tracking'] = 0;
|
30 |
-
$options['ga_aff_tracking'] = 0;
|
31 |
-
$options['ga_hash_tracking'] = 0;
|
32 |
-
if ( isset( $_POST['options']['ga_tracking_code'] ) ) {
|
33 |
-
$new_options['ga_tracking_code'] = trim( $new_options['ga_tracking_code'], "\t" );
|
34 |
-
}
|
35 |
-
if ( empty( $new_options['ga_track_exclude'] ) ) {
|
36 |
-
$new_options['ga_track_exclude'] = array();
|
37 |
-
}
|
38 |
-
} else if ( $who == 'backend' ) {
|
39 |
-
$options['switch_profile'] = 0;
|
40 |
-
$options['backend_item_reports'] = 0;
|
41 |
-
$options['dashboard_widget'] = 0;
|
42 |
-
if ( empty( $new_options['ga_dash_access_back'] ) ) {
|
43 |
-
$new_options['ga_dash_access_back'][] = 'administrator';
|
44 |
-
}
|
45 |
-
} else if ( $who == 'frontend' ) {
|
46 |
-
$options['frontend_item_reports'] = 0;
|
47 |
-
if ( empty( $new_options['ga_dash_access_front'] ) ) {
|
48 |
-
$new_options['ga_dash_access_front'][] = 'administrator';
|
49 |
-
}
|
50 |
-
} else if ( $who == 'general' ) {
|
51 |
-
$options['ga_dash_userapi'] = 0;
|
52 |
-
if ( ! is_multisite() ) {
|
53 |
-
$options['automatic_updates_minorversion'] = 0;
|
54 |
-
}
|
55 |
-
} else if ( $who == 'network' ) {
|
56 |
-
$options['ga_dash_userapi'] = 0;
|
57 |
-
$options['ga_dash_network'] = 0;
|
58 |
-
$options['ga_dash_excludesa'] = 0;
|
59 |
-
$options['automatic_updates_minorversion'] = 0;
|
60 |
-
$network_settings = true;
|
61 |
-
}
|
62 |
-
$options = array_merge( $options, $new_options );
|
63 |
-
$gadwp->config->options = $options;
|
64 |
-
$gadwp->config->set_plugin_options( $network_settings );
|
65 |
-
}
|
66 |
-
return $options;
|
67 |
-
}
|
68 |
-
|
69 |
-
private static function navigation_tabs( $tabs ) {
|
70 |
-
echo '<h2 class="nav-tab-wrapper">';
|
71 |
-
foreach ( $tabs as $tab => $name ) {
|
72 |
-
echo "<a class='nav-tab' id='tab-$tab' href='#top#gadwp-$tab'>$name</a>";
|
73 |
-
}
|
74 |
-
echo '</h2>';
|
75 |
-
}
|
76 |
-
|
77 |
-
public static function frontend_settings() {
|
78 |
-
$gadwp = GADWP();
|
79 |
-
if ( ! current_user_can( 'manage_options' ) ) {
|
80 |
-
return;
|
81 |
-
}
|
82 |
-
$options = self::update_options( 'frontend' );
|
83 |
-
if ( isset( $_POST['options']['ga_dash_hidden'] ) ) {
|
84 |
-
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
85 |
-
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
86 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
87 |
-
}
|
88 |
-
}
|
89 |
-
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] || ! $gadwp->config->options['ga_dash_token'] ) {
|
90 |
-
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
91 |
-
}
|
92 |
-
?>
|
93 |
-
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
94 |
-
<div class="wrap">
|
95 |
-
<?php echo "<h2>" . __( "Google Analytics Frontend Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?><hr>
|
96 |
-
</div>
|
97 |
-
<div id="poststuff" class="gadwp">
|
98 |
-
<div id="post-body" class="metabox-holder columns-2">
|
99 |
-
<div id="post-body-content">
|
100 |
-
<div class="settings-wrapper">
|
101 |
-
<div class="inside">
|
102 |
-
<?php if (isset($message)) echo $message; ?>
|
103 |
-
<table class="gadwp-settings-options">
|
104 |
-
<tr>
|
105 |
-
<td colspan="2"><?php echo "<h2>" . __( "Permissions", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
106 |
-
</tr>
|
107 |
-
<tr>
|
108 |
-
<td class="roles gadwp-settings-title"><label for="ga_dash_access_front"><?php _e("Show stats to:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
109 |
-
<td class="gadwp-settings-roles">
|
110 |
-
<?php
|
111 |
-
if ( ! isset( $wp_roles ) ) {
|
112 |
-
$wp_roles = new WP_Roles();
|
113 |
-
}
|
114 |
-
$i = 0;
|
115 |
-
?>
|
116 |
-
<table>
|
117 |
-
<tr>
|
118 |
-
<?php
|
119 |
-
foreach ( $wp_roles->role_names as $role => $name ) {
|
120 |
-
if ( $role != 'subscriber' ) {
|
121 |
-
$i++;
|
122 |
-
?>
|
123 |
-
<td><label> <input type="checkbox" name="options[ga_dash_access_front][]" value="<?php echo $role; ?>" <?php if (in_array($role,$options['ga_dash_access_front']) || $role=='administrator') echo 'checked="checked"'; if ($role=='administrator') echo 'disabled="disabled"';?> /><?php echo $name; ?>
|
124 |
-
</label></td>
|
125 |
-
<?php
|
126 |
-
}
|
127 |
-
if ( $i % 4 == 0 ) {
|
128 |
-
?>
|
129 |
-
</tr>
|
130 |
-
<tr>
|
131 |
-
<?php
|
132 |
-
}
|
133 |
-
}
|
134 |
-
?>
|
135 |
-
</table>
|
136 |
-
</td>
|
137 |
-
</tr>
|
138 |
-
<tr>
|
139 |
-
<td colspan="2" class="gadwp-settings-title">
|
140 |
-
<div class="button-primary gadwp-settings-switchoo">
|
141 |
-
<input type="checkbox" name="options[frontend_item_reports]" value="1" class="gadwp-settings-switchoo-checkbox" id="frontend_item_reports" <?php checked( $options['frontend_item_reports'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="frontend_item_reports">
|
142 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
143 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
144 |
-
</label>
|
145 |
-
</div>
|
146 |
-
<div class="switch-desc"><?php echo " ".__("enable web page reports on frontend", 'google-analytics-dashboard-for-wp' );?></div>
|
147 |
-
</td>
|
148 |
-
</tr>
|
149 |
-
<tr>
|
150 |
-
<td colspan="2"><hr></td>
|
151 |
-
</tr>
|
152 |
-
<tr>
|
153 |
-
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
154 |
-
</tr>
|
155 |
-
</table>
|
156 |
-
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
157 |
-
<?php wp_nonce_field('gadash_form','gadash_security');?>
|
158 |
-
</form>
|
159 |
-
<?php
|
160 |
-
self::output_sidebar();
|
161 |
-
}
|
162 |
-
|
163 |
-
public static function backend_settings() {
|
164 |
-
$gadwp = GADWP();
|
165 |
-
if ( ! current_user_can( 'manage_options' ) ) {
|
166 |
-
return;
|
167 |
-
}
|
168 |
-
$options = self::update_options( 'backend' );
|
169 |
-
if ( isset( $_POST['options']['ga_dash_hidden'] ) ) {
|
170 |
-
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
171 |
-
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
172 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
173 |
-
}
|
174 |
-
}
|
175 |
-
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] || ! $gadwp->config->options['ga_dash_token'] ) {
|
176 |
-
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
177 |
-
}
|
178 |
-
?>
|
179 |
-
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
180 |
-
<div class="wrap">
|
181 |
-
<?php echo "<h2>" . __( "Google Analytics Backend Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?><hr>
|
182 |
-
</div>
|
183 |
-
<div id="poststuff" class="gadwp">
|
184 |
-
<div id="post-body" class="metabox-holder columns-2">
|
185 |
-
<div id="post-body-content">
|
186 |
-
<div class="settings-wrapper">
|
187 |
-
<div class="inside">
|
188 |
-
<?php if (isset($message)) echo $message; ?>
|
189 |
-
<table class="gadwp-settings-options">
|
190 |
-
<tr>
|
191 |
-
<td colspan="2"><?php echo "<h2>" . __( "Permissions", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
192 |
-
</tr>
|
193 |
-
<tr>
|
194 |
-
<td class="roles gadwp-settings-title"><label for="ga_dash_access_back"><?php _e("Show stats to:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
195 |
-
<td class="gadwp-settings-roles">
|
196 |
-
<?php
|
197 |
-
if ( ! isset( $wp_roles ) ) {
|
198 |
-
$wp_roles = new WP_Roles();
|
199 |
-
}
|
200 |
-
$i = 0;
|
201 |
-
?>
|
202 |
-
<table>
|
203 |
-
<tr>
|
204 |
-
<?php
|
205 |
-
|
206 |
-
foreach ( $wp_roles->role_names as $role => $name ) {
|
207 |
-
if ( $role != 'subscriber' ) {
|
208 |
-
$i++;
|
209 |
-
?>
|
210 |
-
<td><label> <input type="checkbox" name="options[ga_dash_access_back][]" value="<?php echo $role; ?>" <?php if (in_array($role,$options['ga_dash_access_back']) || $role=='administrator') echo 'checked="checked"'; if ($role=='administrator') echo 'disabled="disabled"';?> />
|
211 |
-
<?php echo $name; ?>
|
212 |
-
</label></td>
|
213 |
-
<?php
|
214 |
-
}
|
215 |
-
if ( $i % 4 == 0 ) {
|
216 |
-
?>
|
217 |
-
</tr>
|
218 |
-
<tr>
|
219 |
-
<?php
|
220 |
-
}
|
221 |
-
}
|
222 |
-
?>
|
223 |
-
</table>
|
224 |
-
</td>
|
225 |
-
</tr>
|
226 |
-
<tr>
|
227 |
-
<td colspan="2" class="gadwp-settings-title">
|
228 |
-
<div class="button-primary gadwp-settings-switchoo">
|
229 |
-
<input type="checkbox" name="options[switch_profile]" value="1" class="gadwp-settings-switchoo-checkbox" id="switch_profile" <?php checked( $options['switch_profile'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="switch_profile">
|
230 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
231 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
232 |
-
</label>
|
233 |
-
</div>
|
234 |
-
<div class="switch-desc"><?php _e ( "enable Switch View functionality", 'google-analytics-dashboard-for-wp' );?></div>
|
235 |
-
</td>
|
236 |
-
</tr>
|
237 |
-
<tr>
|
238 |
-
<td colspan="2" class="gadwp-settings-title">
|
239 |
-
<div class="button-primary gadwp-settings-switchoo">
|
240 |
-
<input type="checkbox" name="options[backend_item_reports]" value="1" class="gadwp-settings-switchoo-checkbox" id="backend_item_reports" <?php checked( $options['backend_item_reports'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="backend_item_reports">
|
241 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
242 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
243 |
-
</label>
|
244 |
-
</div>
|
245 |
-
<div class="switch-desc"><?php _e ( "enable reports on Posts List and Pages List", 'google-analytics-dashboard-for-wp' );?></div>
|
246 |
-
</td>
|
247 |
-
</tr>
|
248 |
-
<tr>
|
249 |
-
<td colspan="2" class="gadwp-settings-title">
|
250 |
-
<div class="button-primary gadwp-settings-switchoo">
|
251 |
-
<input type="checkbox" name="options[dashboard_widget]" value="1" class="gadwp-settings-switchoo-checkbox" id="dashboard_widget" <?php checked( $options['dashboard_widget'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="dashboard_widget">
|
252 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
253 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
254 |
-
</label>
|
255 |
-
</div>
|
256 |
-
<div class="switch-desc"><?php _e ( "enable the main Dashboard Widget", 'google-analytics-dashboard-for-wp' );?></div>
|
257 |
-
</td>
|
258 |
-
</tr>
|
259 |
-
<tr>
|
260 |
-
<td colspan="2"><hr><?php echo "<h2>" . __( "Real-Time Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
261 |
-
</tr>
|
262 |
-
<tr>
|
263 |
-
<td colspan="2" class="gadwp-settings-title"> <?php _e("Maximum number of pages to display on real-time tab:", 'google-analytics-dashboard-for-wp'); ?>
|
264 |
-
<input type="number" name="options[ga_realtime_pages]" id="ga_realtime_pages" value="<?php echo (int)$options['ga_realtime_pages']; ?>" size="3">
|
265 |
-
</td>
|
266 |
-
</tr>
|
267 |
-
<tr>
|
268 |
-
<td colspan="2"><hr><?php echo "<h2>" . __( "Location Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
269 |
-
</tr>
|
270 |
-
<tr>
|
271 |
-
<td colspan="2" class="gadwp-settings-title">
|
272 |
-
<?php echo __("Target Geo Map to country:", 'google-analytics-dashboard-for-wp'); ?>
|
273 |
-
<input type="text" style="text-align: center;" name="options[ga_target_geomap]" value="<?php echo esc_attr($options['ga_target_geomap']); ?>" size="3">
|
274 |
-
</td>
|
275 |
-
</tr>
|
276 |
-
<tr>
|
277 |
-
<td colspan="2" class="gadwp-settings-title">
|
278 |
-
<?php echo __("Maps API Key:", 'google-analytics-dashboard-for-wp'); ?>
|
279 |
-
<input type="text" style="text-align: center;" name="options[maps_api_key]" value="<?php echo esc_attr($options['maps_api_key']); ?>" size="50">
|
280 |
-
</td>
|
281 |
-
</tr>
|
282 |
-
<tr>
|
283 |
-
<td colspan="2"><hr><?php echo "<h2>" . __( "404 Errors Report", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
284 |
-
</tr>
|
285 |
-
<tr>
|
286 |
-
<td colspan="2" class="gadwp-settings-title">
|
287 |
-
<?php echo __("404 Page Title contains:", 'google-analytics-dashboard-for-wp'); ?>
|
288 |
-
<input type="text" style="text-align: center;" name="options[pagetitle_404]" value="<?php echo esc_attr($options['pagetitle_404']); ?>" size="20">
|
289 |
-
</td>
|
290 |
-
</tr>
|
291 |
-
<tr>
|
292 |
-
<td colspan="2"><hr></td>
|
293 |
-
</tr>
|
294 |
-
<tr>
|
295 |
-
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
296 |
-
</tr>
|
297 |
-
</table>
|
298 |
-
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
299 |
-
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
300 |
-
|
301 |
-
</form>
|
302 |
-
<?php
|
303 |
-
self::output_sidebar();
|
304 |
-
}
|
305 |
-
|
306 |
-
public static function tracking_settings() {
|
307 |
-
$gadwp = GADWP();
|
308 |
-
|
309 |
-
if ( ! current_user_can( 'manage_options' ) ) {
|
310 |
-
return;
|
311 |
-
}
|
312 |
-
$options = self::update_options( 'tracking' );
|
313 |
-
if ( isset( $_POST['options']['ga_dash_hidden'] ) ) {
|
314 |
-
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
315 |
-
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
316 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
317 |
-
}
|
318 |
-
}
|
319 |
-
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
320 |
-
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
321 |
-
}
|
322 |
-
if ( ! $options['ga_dash_tracking'] ) {
|
323 |
-
$message = "<div class='error'><p>" . __( "The tracking component is disabled. You should set <strong>Tracking Options</strong> to <strong>Enabled</strong>", 'google-analytics-dashboard-for-wp' ) . ".</p></div>";
|
324 |
-
}
|
325 |
-
?>
|
326 |
-
<form name="ga_dash_form" method="post" action="<?php esc_url($_SERVER['REQUEST_URI']); ?>">
|
327 |
-
<div class="wrap">
|
328 |
-
<?php echo "<h2>" . __( "Google Analytics Tracking Code", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
329 |
-
</div>
|
330 |
-
<div id="poststuff" class="gadwp">
|
331 |
-
<div id="post-body" class="metabox-holder columns-2">
|
332 |
-
<div id="post-body-content">
|
333 |
-
<div class="settings-wrapper">
|
334 |
-
<div class="inside">
|
335 |
-
<?php
|
336 |
-
$tabs = array( 'basic' => __( "Basic Settings", 'google-analytics-dashboard-for-wp' ), 'events' => __( "Events Tracking", 'google-analytics-dashboard-for-wp' ), 'custom' => __( "Custom Definitions", 'google-analytics-dashboard-for-wp' ), 'exclude' => __( "Exclude Tracking", 'google-analytics-dashboard-for-wp' ), 'advanced' => __( "Advanced Settings", 'google-analytics-dashboard-for-wp' ) );
|
337 |
-
self::navigation_tabs( $tabs );
|
338 |
-
if ( isset( $message ) )
|
339 |
-
echo $message;
|
340 |
-
?>
|
341 |
-
<div id="gadwp-basic">
|
342 |
-
<table class="gadwp-settings-options">
|
343 |
-
<tr>
|
344 |
-
<td colspan="2"><?php echo "<h2>" . __( "Tracking Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
345 |
-
</tr>
|
346 |
-
<tr>
|
347 |
-
<td class="gadwp-settings-title"><label for="ga_dash_tracking"><?php _e("Tracking Options:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
348 |
-
<td><select id="ga_dash_tracking" name="options[ga_dash_tracking]" onchange="this.form.submit()">
|
349 |
-
<option value="0" <?php selected( $options['ga_dash_tracking'], 0 ); ?>><?php _e("Disabled", 'google-analytics-dashboard-for-wp');?></option>
|
350 |
-
<option value="1" <?php selected( $options['ga_dash_tracking'], 1 ); ?>><?php _e("Enabled", 'google-analytics-dashboard-for-wp');?></option>
|
351 |
-
</select></td>
|
352 |
-
</tr>
|
353 |
-
<?php if ($options['ga_dash_tracking']) {?>
|
354 |
-
<tr>
|
355 |
-
<td class="gadwp-settings-title"></td>
|
356 |
-
<td>
|
357 |
-
<?php $profile_info = GADWP_Tools::get_selected_profile($gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail']); ?>
|
358 |
-
<?php echo '<pre>' . __("View Name:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[0]) . "<br />" . __("Tracking ID:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[2]) . "<br />" . __("Default URL:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[3]) . "<br />" . __("Time Zone:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[5]) . '</pre>';?>
|
359 |
-
</td>
|
360 |
-
</tr>
|
361 |
-
<?php }?>
|
362 |
-
<tr>
|
363 |
-
<td colspan="2"><hr><?php echo "<h2>" . __( "Basic Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
364 |
-
</tr>
|
365 |
-
<tr>
|
366 |
-
<td class="gadwp-settings-title"><label for="ga_dash_tracking_type"><?php _e("Tracking Type:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
367 |
-
<td><select id="ga_dash_tracking_type" name="options[ga_dash_tracking_type]">
|
368 |
-
<option value="classic" <?php selected( $options['ga_dash_tracking_type'], 'classic' ); ?>><?php _e("Classic Analytics", 'google-analytics-dashboard-for-wp');?></option>
|
369 |
-
<option value="universal" <?php selected( $options['ga_dash_tracking_type'], 'universal' ); ?>><?php _e("Universal Analytics", 'google-analytics-dashboard-for-wp');?></option>
|
370 |
-
</select></td>
|
371 |
-
</tr>
|
372 |
-
<tr>
|
373 |
-
<td colspan="2" class="gadwp-settings-title">
|
374 |
-
<div class="button-primary gadwp-settings-switchoo">
|
375 |
-
<input type="checkbox" name="options[ga_dash_anonim]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_anonim" <?php checked( $options['ga_dash_anonim'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_dash_anonim">
|
376 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
377 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
378 |
-
</label>
|
379 |
-
</div>
|
380 |
-
<div class="switch-desc"><?php echo " ".__("anonymize IPs while tracking", 'google-analytics-dashboard-for-wp' );?></div>
|
381 |
-
</td>
|
382 |
-
</tr>
|
383 |
-
<tr>
|
384 |
-
<td colspan="2" class="gadwp-settings-title">
|
385 |
-
<div class="button-primary gadwp-settings-switchoo">
|
386 |
-
<input type="checkbox" name="options[ga_dash_remarketing]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_remarketing" <?php checked( $options['ga_dash_remarketing'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_dash_remarketing">
|
387 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
388 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
389 |
-
</label>
|
390 |
-
</div>
|
391 |
-
<div class="switch-desc"><?php echo " ".__("enable remarketing, demographics and interests reports", 'google-analytics-dashboard-for-wp' );?></div>
|
392 |
-
</td>
|
393 |
-
</tr>
|
394 |
-
</table>
|
395 |
-
</div>
|
396 |
-
<div id="gadwp-events">
|
397 |
-
<table class="gadwp-settings-options">
|
398 |
-
<tr>
|
399 |
-
<td colspan="2"><?php echo "<h2>" . __( "Events Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
400 |
-
</tr>
|
401 |
-
<tr>
|
402 |
-
<td colspan="2" class="gadwp-settings-title">
|
403 |
-
<div class="button-primary gadwp-settings-switchoo">
|
404 |
-
<input type="checkbox" name="options[ga_event_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_event_tracking" <?php checked( $options['ga_event_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_event_tracking">
|
405 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
406 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
407 |
-
</label>
|
408 |
-
</div>
|
409 |
-
<div class="switch-desc"><?php echo " ".__("track downloads, mailto and outbound links", 'google-analytics-dashboard-for-wp' ); ?></div>
|
410 |
-
</td>
|
411 |
-
</tr>
|
412 |
-
<tr>
|
413 |
-
<td class="gadwp-settings-title"><label for="ga_event_downloads"><?php _e("Downloads Regex:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
414 |
-
<td><input type="text" id="ga_event_downloads" name="options[ga_event_downloads]" value="<?php echo esc_attr($options['ga_event_downloads']); ?>" size="50"></td>
|
415 |
-
</tr>
|
416 |
-
<tr>
|
417 |
-
<td colspan="2" class="gadwp-settings-title">
|
418 |
-
<div class="button-primary gadwp-settings-switchoo">
|
419 |
-
<input type="checkbox" name="options[ga_aff_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_aff_tracking" <?php checked( $options['ga_aff_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_aff_tracking">
|
420 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
421 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
422 |
-
</label>
|
423 |
-
</div>
|
424 |
-
<div class="switch-desc"><?php echo " ".__("track affiliate links matching this regex", 'google-analytics-dashboard-for-wp' ); ?></div>
|
425 |
-
</td>
|
426 |
-
</tr>
|
427 |
-
<tr>
|
428 |
-
<td class="gadwp-settings-title"><label for="ga_event_affiliates"><?php _e("Affiliates Regex:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
429 |
-
<td><input type="text" id="ga_event_affiliates" name="options[ga_event_affiliates]" value="<?php echo esc_attr($options['ga_event_affiliates']); ?>" size="50"></td>
|
430 |
-
</tr>
|
431 |
-
<tr>
|
432 |
-
<td colspan="2" class="gadwp-settings-title">
|
433 |
-
<div class="button-primary gadwp-settings-switchoo">
|
434 |
-
<input type="checkbox" name="options[ga_hash_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_hash_tracking" <?php checked( $options['ga_hash_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_hash_tracking">
|
435 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
436 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
437 |
-
</label>
|
438 |
-
</div>
|
439 |
-
<div class="switch-desc"><?php echo " ".__("track fragment identifiers, hashmarks (#) in URI links", 'google-analytics-dashboard-for-wp' ); ?></div>
|
440 |
-
</td>
|
441 |
-
</tr>
|
442 |
-
</table>
|
443 |
-
</div>
|
444 |
-
<div id="gadwp-custom">
|
445 |
-
<table class="gadwp-settings-options">
|
446 |
-
<tr>
|
447 |
-
<td colspan="2"><?php echo "<h2>" . __( "Custom Definitions", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
448 |
-
</tr>
|
449 |
-
<tr>
|
450 |
-
<td class="gadwp-settings-title"><label for="ga_author_dimindex"><?php _e("Authors:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
451 |
-
<td><select id="ga_author_dimindex" name="options[ga_author_dimindex]">
|
452 |
-
<?php for ($i=0;$i<21;$i++){?>
|
453 |
-
<option value="<?php echo $i;?>" <?php selected( $options['ga_author_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
454 |
-
<?php }?>
|
455 |
-
</select></td>
|
456 |
-
</tr>
|
457 |
-
<tr>
|
458 |
-
<td class="gadwp-settings-title"><label for="ga_pubyear_dimindex"><?php _e("Publication Year:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
459 |
-
<td><select id="ga_pubyear_dimindex" name="options[ga_pubyear_dimindex]">
|
460 |
-
<?php for ($i=0;$i<21;$i++){?>
|
461 |
-
<option value="<?php echo $i;?>" <?php selected( $options['ga_pubyear_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
462 |
-
<?php }?>
|
463 |
-
</select></td>
|
464 |
-
</tr>
|
465 |
-
<tr>
|
466 |
-
<td class="gadwp-settings-title"><label for="ga_pubyearmonth_dimindex"><?php _e("Publication Month:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
467 |
-
<td><select id="ga_pubyearmonth_dimindex" name="options[ga_pubyearmonth_dimindex]">
|
468 |
-
<?php for ($i=0;$i<21;$i++){?>
|
469 |
-
<option value="<?php echo $i;?>" <?php selected( $options['ga_pubyearmonth_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
470 |
-
<?php }?>
|
471 |
-
</select></td>
|
472 |
-
</tr>
|
473 |
-
<tr>
|
474 |
-
<td class="gadwp-settings-title"><label for="ga_category_dimindex"><?php _e("Categories:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
475 |
-
<td><select id="ga_category_dimindex" name="options[ga_category_dimindex]">
|
476 |
-
<?php for ($i=0;$i<21;$i++){?>
|
477 |
-
<option value="<?php echo $i;?>" <?php selected( $options['ga_category_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
478 |
-
<?php }?>
|
479 |
-
</select></td>
|
480 |
-
</tr>
|
481 |
-
<tr>
|
482 |
-
<td class="gadwp-settings-title"><label for="ga_user_dimindex"><?php _e("User Type:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
483 |
-
<td><select id="ga_user_dimindex" name="options[ga_user_dimindex]">
|
484 |
-
<?php for ($i=0;$i<21;$i++){?>
|
485 |
-
<option value="<?php echo $i;?>" <?php selected( $options['ga_user_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
486 |
-
<?php }?>
|
487 |
-
</select></td>
|
488 |
-
</tr>
|
489 |
-
<tr>
|
490 |
-
<td class="gadwp-settings-title"><label for="ga_tag_dimindex"><?php _e("Tags:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
491 |
-
<td><select id="ga_tag_dimindex" name="options[ga_tag_dimindex]">
|
492 |
-
<?php for ($i=0;$i<21;$i++){?>
|
493 |
-
<option value="<?php echo $i;?>" <?php selected( $options['ga_tag_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
494 |
-
<?php }?>
|
495 |
-
</select></td>
|
496 |
-
</tr>
|
497 |
-
</table>
|
498 |
-
</div>
|
499 |
-
<div id="gadwp-advanced">
|
500 |
-
<table class="gadwp-settings-options">
|
501 |
-
<tr>
|
502 |
-
<td colspan="2"><?php echo "<h2>" . __( "Advanced Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
503 |
-
</tr>
|
504 |
-
<tr>
|
505 |
-
<td class="gadwp-settings-title"><label for="ga_speed_samplerate"><?php _e("Page Speed SR:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
506 |
-
<td><input type="number" id="ga_speed_samplerate" name="options[ga_speed_samplerate]" value="<?php echo (int)($options['ga_speed_samplerate']); ?>" max="100" min="1"> %</td>
|
507 |
-
</tr>
|
508 |
-
<tr>
|
509 |
-
<td colspan="2" class="gadwp-settings-title">
|
510 |
-
<div class="button-primary gadwp-settings-switchoo">
|
511 |
-
<input type="checkbox" name="options[ga_event_bouncerate]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_event_bouncerate" <?php checked( $options['ga_event_bouncerate'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_event_bouncerate">
|
512 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
513 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
514 |
-
</label>
|
515 |
-
</div>
|
516 |
-
<div class="switch-desc"><?php echo " ".__("exclude events from bounce-rate calculation", 'google-analytics-dashboard-for-wp' );?></div>
|
517 |
-
</td>
|
518 |
-
</tr>
|
519 |
-
<tr>
|
520 |
-
<td colspan="2" class="gadwp-settings-title">
|
521 |
-
<div class="button-primary gadwp-settings-switchoo">
|
522 |
-
<input type="checkbox" name="options[ga_enhanced_links]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_enhanced_links" <?php checked( $options['ga_enhanced_links'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_enhanced_links">
|
523 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
524 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
525 |
-
</label>
|
526 |
-
</div>
|
527 |
-
<div class="switch-desc"><?php echo " ".__("enable enhanced link attribution", 'google-analytics-dashboard-for-wp' );?></div>
|
528 |
-
</td>
|
529 |
-
</tr>
|
530 |
-
<tr>
|
531 |
-
<td colspan="2" class="gadwp-settings-title">
|
532 |
-
<div class="button-primary gadwp-settings-switchoo">
|
533 |
-
<input type="checkbox" name="options[ga_dash_adsense]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_adsense" <?php checked( $options['ga_dash_adsense'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_dash_adsense">
|
534 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
535 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
536 |
-
</label>
|
537 |
-
</div>
|
538 |
-
<div class="switch-desc"><?php echo " ".__("enable AdSense account linking", 'google-analytics-dashboard-for-wp' );?></div>
|
539 |
-
</td>
|
540 |
-
</tr>
|
541 |
-
<tr>
|
542 |
-
<td colspan="2"><?php echo "<h2>" . __( "Cross-domain Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
543 |
-
</tr>
|
544 |
-
<tr>
|
545 |
-
<td colspan="2" class="gadwp-settings-title">
|
546 |
-
<div class="button-primary gadwp-settings-switchoo">
|
547 |
-
<input type="checkbox" name="options[ga_crossdomain_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_crossdomain_tracking" <?php checked( $options['ga_crossdomain_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_crossdomain_tracking">
|
548 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
549 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
550 |
-
</label>
|
551 |
-
</div>
|
552 |
-
<div class="switch-desc"><?php echo " ".__("enable cross domain tracking", 'google-analytics-dashboard-for-wp' ); ?></div>
|
553 |
-
</td>
|
554 |
-
</tr>
|
555 |
-
<tr>
|
556 |
-
<td class="gadwp-settings-title"><label for="ga_crossdomain_list"><?php _e("Cross Domains:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
557 |
-
<td><input type="text" id="ga_crossdomain_list" name="options[ga_crossdomain_list]" value="<?php echo esc_attr($options['ga_crossdomain_list']); ?>" size="50"></td>
|
558 |
-
</tr>
|
559 |
-
<tr>
|
560 |
-
<td colspan="2"><?php echo "<h2>" . __( "Cookie Customization", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
561 |
-
</tr>
|
562 |
-
<tr>
|
563 |
-
<td class="gadwp-settings-title"><label for="ga_cookiedomain"><?php _e("Cookie Domain:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
564 |
-
<td><input type="text" id="ga_cookiedomain" name="options[ga_cookiedomain]" value="<?php echo esc_attr($options['ga_cookiedomain']); ?>" size="50"></td>
|
565 |
-
</tr>
|
566 |
-
<tr>
|
567 |
-
<td class="gadwp-settings-title"><label for="ga_cookiename"><?php _e("Cookie Name:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
568 |
-
<td><input type="text" id="ga_cookiename" name="options[ga_cookiename]" value="<?php echo esc_attr($options['ga_cookiename']); ?>" size="50"></td>
|
569 |
-
</tr>
|
570 |
-
<tr>
|
571 |
-
<td class="gadwp-settings-title"><label for="ga_cookieexpires"><?php _e("Cookie Expires:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
572 |
-
<td><input type="text" id="ga_cookieexpires" name="options[ga_cookieexpires]" value="<?php echo esc_attr($options['ga_cookieexpires']); ?>" size="10"> seconds</td>
|
573 |
-
</tr>
|
574 |
-
</table>
|
575 |
-
</div>
|
576 |
-
<div id="gadwp-exclude">
|
577 |
-
<table class="gadwp-settings-options">
|
578 |
-
<tr>
|
579 |
-
<td colspan="2"><?php echo "<h2>" . __( "Exclude Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
580 |
-
</tr>
|
581 |
-
<tr>
|
582 |
-
<td class="roles gadwp-settings-title"><label for="ga_track_exclude"><?php _e("Exclude tracking for:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
583 |
-
<td class="gadwp-settings-roles">
|
584 |
-
<?php
|
585 |
-
if ( ! isset( $wp_roles ) ) {
|
586 |
-
$wp_roles = new WP_Roles();
|
587 |
-
}
|
588 |
-
$i = 0;
|
589 |
-
?> <table>
|
590 |
-
<tr>
|
591 |
-
<?php
|
592 |
-
foreach ( $wp_roles->role_names as $role => $name ) {
|
593 |
-
$i++;
|
594 |
-
?>
|
595 |
-
<td><label> <input type="checkbox" name="options[ga_track_exclude][]" value="<?php echo $role; ?>" <?php if (in_array($role,$options['ga_track_exclude'])) echo 'checked="checked"'; ?> />
|
596 |
-
<?php echo $name; ?>
|
597 |
-
</label></td>
|
598 |
-
<?php
|
599 |
-
if ( $i % 4 == 0 ) {
|
600 |
-
?>
|
601 |
-
</tr>
|
602 |
-
<tr>
|
603 |
-
<?php
|
604 |
-
}
|
605 |
-
}
|
606 |
-
?>
|
607 |
-
</table>
|
608 |
-
</td>
|
609 |
-
</tr>
|
610 |
-
</table>
|
611 |
-
</div>
|
612 |
-
<table class="gadwp-settings-options">
|
613 |
-
<tr>
|
614 |
-
<td colspan="2"><hr></td>
|
615 |
-
</tr>
|
616 |
-
<tr>
|
617 |
-
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
618 |
-
</tr>
|
619 |
-
</table>
|
620 |
-
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
621 |
-
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
622 |
-
</form>
|
623 |
-
<?php
|
624 |
-
self::output_sidebar();
|
625 |
-
}
|
626 |
-
|
627 |
-
public static function errors_debugging() {
|
628 |
-
global $wp_version;
|
629 |
-
|
630 |
-
$gadwp = GADWP();
|
631 |
-
|
632 |
-
if ( ! current_user_can( 'manage_options' ) ) {
|
633 |
-
return;
|
634 |
-
}
|
635 |
-
|
636 |
-
$anonim = $gadwp->config->options;
|
637 |
-
$anonim['wp_version'] = $wp_version;
|
638 |
-
$anonim['gadwp_version'] = GADWP_CURRENT_VERSION;
|
639 |
-
if ( $anonim['ga_dash_token'] ) {
|
640 |
-
$anonim['ga_dash_token'] = 'HIDDEN';
|
641 |
-
}
|
642 |
-
if ( $anonim['ga_dash_clientid'] ) {
|
643 |
-
$anonim['ga_dash_clientid'] = 'HIDDEN';
|
644 |
-
}
|
645 |
-
if ( $anonim['ga_dash_clientsecret'] ) {
|
646 |
-
$anonim['ga_dash_clientsecret'] = 'HIDDEN';
|
647 |
-
}
|
648 |
-
$options = self::update_options( 'frontend' );
|
649 |
-
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] || ! $gadwp->config->options['ga_dash_token'] ) {
|
650 |
-
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
651 |
-
}
|
652 |
-
?>
|
653 |
-
<div class="wrap">
|
654 |
-
<?php echo "<h2>" . __( "Google Analytics Errors & Debugging", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
655 |
-
</div>
|
656 |
-
<div id="poststuff" class="gadwp">
|
657 |
-
<div id="post-body" class="metabox-holder columns-2">
|
658 |
-
<div id="post-body-content">
|
659 |
-
<div class="settings-wrapper">
|
660 |
-
<div class="inside">
|
661 |
-
<?php if (isset($message)) echo $message; ?>
|
662 |
-
<?php
|
663 |
-
$tabs = array( 'errors' => __( "Errors & Details", 'google-analytics-dashboard-for-wp' ), 'config' => __( "Plugin Settings", 'google-analytics-dashboard-for-wp' ) );
|
664 |
-
self::navigation_tabs( $tabs );
|
665 |
-
?>
|
666 |
-
<div id="gadwp-errors">
|
667 |
-
<table class="gadwp-settings-options">
|
668 |
-
<tr>
|
669 |
-
<td>
|
670 |
-
<?php echo "<h2>" . __( "Last Error detected", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
671 |
-
</td>
|
672 |
-
</tr>
|
673 |
-
<tr>
|
674 |
-
<td>
|
675 |
-
<?php
|
676 |
-
$errors = print_r( GADWP_Tools::get_cache( 'last_error' ), true ) ? esc_html( print_r( GADWP_Tools::get_cache( 'last_error' ), true ) ) : __( "None", 'google-analytics-dashboard-for-wp' );
|
677 |
-
echo '<pre class="gadwp-settings-logdata">Last Error: ';
|
678 |
-
echo $errors;
|
679 |
-
?></pre>
|
680 |
-
</td>
|
681 |
-
</tr>
|
682 |
-
<tr>
|
683 |
-
<td colspan="2"><hr><?php echo "<h2>" . __( "Error Details", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
684 |
-
</tr>
|
685 |
-
<tr>
|
686 |
-
<td>
|
687 |
-
<?php
|
688 |
-
echo '<pre class="gadwp-settings-logdata">Error Details: ';
|
689 |
-
$error_details = print_r( GADWP_Tools::get_cache( 'gapi_errors' ), true ) ? "\n" . esc_html( print_r( GADWP_Tools::get_cache( 'last_error' ), true ) ) : __( "None", 'google-analytics-dashboard-for-wp' );
|
690 |
-
echo $error_details;
|
691 |
-
?></pre><br />
|
692 |
-
<hr>
|
693 |
-
</td>
|
694 |
-
|
695 |
-
|
696 |
-
<tr>
|
697 |
-
|
698 |
-
</table>
|
699 |
-
</div>
|
700 |
-
<div id="gadwp-config">
|
701 |
-
<table class="gadwp-settings-options">
|
702 |
-
<tr>
|
703 |
-
<td><?php echo "<h2>" . __( "Plugin Configuration", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
704 |
-
</tr>
|
705 |
-
<tr>
|
706 |
-
<td><pre class="gadwp-settings-logdata"><?php echo esc_html(print_r($anonim, true));?></pre><br />
|
707 |
-
<hr></td>
|
708 |
-
</tr>
|
709 |
-
</table>
|
710 |
-
</div>
|
711 |
-
<?php
|
712 |
-
self::output_sidebar();
|
713 |
-
}
|
714 |
-
|
715 |
-
public static function general_settings() {
|
716 |
-
$gadwp = GADWP();
|
717 |
-
|
718 |
-
global $wp_version;
|
719 |
-
|
720 |
-
if ( ! current_user_can( 'manage_options' ) ) {
|
721 |
-
return;
|
722 |
-
}
|
723 |
-
$options = self::update_options( 'general' );
|
724 |
-
printf( '<div id="gapi-warning" class="updated"><p>%1$s <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=general_screen&utm_campaign=gadwp">%2$s</a></p></div>', __( 'Loading the required libraries. If this results in a blank screen or a fatal error, try this solution:', 'google-analytics-dashboard-for-wp' ), __( 'Library conflicts between WordPress plugins', 'google-analytics-dashboard-for-wp' ) );
|
725 |
-
if ( null === $gadwp->gapi_controller ) {
|
726 |
-
$gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
727 |
-
}
|
728 |
-
echo '<script type="text/javascript">jQuery("#gapi-warning").hide()</script>';
|
729 |
-
if ( isset( $_POST['ga_dash_code'] ) ) {
|
730 |
-
if ( ! stripos( 'x' . $_POST['ga_dash_code'], 'UA-', 1 ) == 1 ) {
|
731 |
-
try {
|
732 |
-
$gadwp->gapi_controller->client->authenticate( $_POST['ga_dash_code'] );
|
733 |
-
$gadwp->config->options['ga_dash_token'] = $gadwp->gapi_controller->client->getAccessToken();
|
734 |
-
$gadwp->config->options['automatic_updates_minorversion'] = 1;
|
735 |
-
$gadwp->config->set_plugin_options();
|
736 |
-
$options = self::update_options( 'general' );
|
737 |
-
$message = "<div class='updated'><p>" . __( "Plugin authorization succeeded.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
738 |
-
GADWP_Tools::delete_cache( 'gapi_errors' );
|
739 |
-
GADWP_Tools::delete_cache( 'last_error' );
|
740 |
-
if ( $gadwp->config->options['ga_dash_token'] && $gadwp->gapi_controller->client->getAccessToken() ) {
|
741 |
-
if ( ! empty( $gadwp->config->options['ga_dash_profile_list'] ) ) {
|
742 |
-
$profiles = $gadwp->config->options['ga_dash_profile_list'];
|
743 |
-
} else {
|
744 |
-
$profiles = $gadwp->gapi_controller->refresh_profiles();
|
745 |
-
}
|
746 |
-
if ( $profiles ) {
|
747 |
-
$gadwp->config->options['ga_dash_profile_list'] = $profiles;
|
748 |
-
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
749 |
-
$profile = GADWP_Tools::guess_default_domain( $profiles );
|
750 |
-
$gadwp->config->options['ga_dash_tableid_jail'] = $profile;
|
751 |
-
// $gadwp->config->options['ga_dash_tableid'] = $profile;
|
752 |
-
}
|
753 |
-
$gadwp->config->set_plugin_options();
|
754 |
-
$options = self::update_options( 'general' );
|
755 |
-
}
|
756 |
-
}
|
757 |
-
} catch ( Google_IO_Exception $e ) {
|
758 |
-
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $gadwp->gapi_controller->error_timeout );
|
759 |
-
return false;
|
760 |
-
} catch ( Google_Service_Exception $e ) {
|
761 |
-
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $gadwp->gapi_controller->error_timeout );
|
762 |
-
GADWP_Tools::set_cache( 'gapi_errors', $e->getErrors(), $gadwp->gapi_controller->error_timeout );
|
763 |
-
return $e->getCode();
|
764 |
-
} catch ( Exception $e ) {
|
765 |
-
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ) . "\nResponseHttpCode:" . $e->getCode(), $gadwp->gapi_controller->error_timeout );
|
766 |
-
$gadwp->gapi_controller->reset_token( false );
|
767 |
-
}
|
768 |
-
} else {
|
769 |
-
$message = "<div class='error'><p>" . __( "The access code is <strong>NOT</strong> your <strong>Tracking ID</strong> (UA-XXXXX-X). Try again, and use the red link to get your access code", 'google-analytics-dashboard-for-wp' ) . ".</p></div>";
|
770 |
-
}
|
771 |
-
}
|
772 |
-
if ( isset( $_POST['Clear'] ) ) {
|
773 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
774 |
-
GADWP_Tools::clear_cache();
|
775 |
-
$message = "<div class='updated'><p>" . __( "Cleared Cache.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
776 |
-
} else {
|
777 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
778 |
-
}
|
779 |
-
}
|
780 |
-
if ( isset( $_POST['Reset'] ) ) {
|
781 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
782 |
-
$gadwp->gapi_controller->reset_token( true );
|
783 |
-
GADWP_Tools::clear_cache();
|
784 |
-
$message = "<div class='updated'><p>" . __( "Token Reseted and Revoked.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
785 |
-
$options = self::update_options( 'Reset' );
|
786 |
-
} else {
|
787 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
788 |
-
}
|
789 |
-
}
|
790 |
-
if ( isset( $_POST['Reset_Err'] ) ) {
|
791 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
792 |
-
GADWP_Tools::delete_cache( 'last_error' );
|
793 |
-
GADWP_Tools::delete_cache( 'gapi_errors' );
|
794 |
-
$message = "<div class='updated'><p>" . __( "All errors reseted.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
795 |
-
} else {
|
796 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
797 |
-
}
|
798 |
-
}
|
799 |
-
if ( isset( $_POST['options']['ga_dash_hidden'] ) && ! isset( $_POST['Clear'] ) && ! isset( $_POST['Reset'] ) && ! isset( $_POST['Reset_Err'] ) ) {
|
800 |
-
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
801 |
-
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
802 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
803 |
-
}
|
804 |
-
}
|
805 |
-
if ( isset( $_POST['Hide'] ) ) {
|
806 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
807 |
-
$message = "<div class='updated'><p>" . __( "All other domains/properties were removed.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
808 |
-
$lock_profile = GADWP_Tools::get_selected_profile( $gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail'] );
|
809 |
-
$gadwp->config->options['ga_dash_profile_list'] = array( $lock_profile );
|
810 |
-
$options = self::update_options( 'general' );
|
811 |
-
} else {
|
812 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
813 |
-
}
|
814 |
-
}
|
815 |
-
?>
|
816 |
-
<div class="wrap">
|
817 |
-
<?php echo "<h2>" . __( "Google Analytics Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
818 |
-
<hr>
|
819 |
-
</div>
|
820 |
-
<div id="poststuff" class="gadwp">
|
821 |
-
<div id="post-body" class="metabox-holder columns-2">
|
822 |
-
<div id="post-body-content">
|
823 |
-
<div class="settings-wrapper">
|
824 |
-
<div class="inside">
|
825 |
-
<?php
|
826 |
-
if ( $gadwp->gapi_controller->gapi_errors_handler() || GADWP_Tools::get_cache( 'last_error' ) ) {
|
827 |
-
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
828 |
-
}
|
829 |
-
if ( isset( $_POST['Authorize'] ) ) {
|
830 |
-
GADWP_Tools::clear_cache();
|
831 |
-
$gadwp->gapi_controller->token_request();
|
832 |
-
echo "<div class='updated'><p>" . __( "Use the red link (see below) to generate and get your access code!", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
833 |
-
} else {
|
834 |
-
if ( isset( $message ) ) {
|
835 |
-
echo $message;
|
836 |
-
}
|
837 |
-
?>
|
838 |
-
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
839 |
-
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
840 |
-
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
841 |
-
<table class="gadwp-settings-options">
|
842 |
-
<tr>
|
843 |
-
<td colspan="2">
|
844 |
-
<?php echo "<h2>" . __( "Plugin Authorization", 'google-analytics-dashboard-for-wp' ) . "</h2>";?>
|
845 |
-
</td>
|
846 |
-
</tr>
|
847 |
-
<tr>
|
848 |
-
<td colspan="2" class="gadwp-settings-info">
|
849 |
-
<?php printf(__('You should watch the %1$s and read this %2$s before proceeding to authorization. This plugin requires a properly configured Google Analytics account!', 'google-analytics-dashboard-for-wp'), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_video&utm_campaign=gadwp', __("video", 'google-analytics-dashboard-for-wp')), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_tutorial&utm_campaign=gadwp', __("tutorial", 'google-analytics-dashboard-for-wp')));?>
|
850 |
-
</td>
|
851 |
-
</tr>
|
852 |
-
<?php if (! $options['ga_dash_token'] || $options['ga_dash_userapi']) {?>
|
853 |
-
<tr>
|
854 |
-
<td colspan="2" class="gadwp-settings-info"><input name="options[ga_dash_userapi]" type="checkbox" id="ga_dash_userapi" value="1" <?php checked( $options['ga_dash_userapi'], 1 ); ?> onchange="this.form.submit()" <?php echo ($options['ga_dash_network'])?'disabled="disabled"':''; ?> /><?php echo " ".__("use your own API Project credentials", 'google-analytics-dashboard-for-wp' );?>
|
855 |
-
</td>
|
856 |
-
</tr>
|
857 |
-
<?php } if ($options['ga_dash_userapi']) { ?>
|
858 |
-
<tr>
|
859 |
-
<td class="gadwp-settings-title"><label for="options[ga_dash_clientid]"><?php _e("Client ID:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
860 |
-
<td><input type="text" name="options[ga_dash_clientid]" value="<?php echo esc_attr($options['ga_dash_clientid']); ?>" size="40" required="required"></td>
|
861 |
-
</tr>
|
862 |
-
<tr>
|
863 |
-
<td class="gadwp-settings-title"><label for="options[ga_dash_clientsecret]"><?php _e("Client Secret:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
864 |
-
<td><input type="text" name="options[ga_dash_clientsecret]" value="<?php echo esc_attr($options['ga_dash_clientsecret']); ?>" size="40" required="required"> <input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
865 |
-
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
866 |
-
</td>
|
867 |
-
</tr>
|
868 |
-
<?php
|
869 |
-
}
|
870 |
-
if ( $options['ga_dash_token'] ) {
|
871 |
-
?>
|
872 |
-
<tr>
|
873 |
-
<td colspan="2"><input type="submit" name="Reset" class="button button-secondary" value="<?php _e( "Clear Authorization", 'google-analytics-dashboard-for-wp' ); ?>" <?php echo $options['ga_dash_network']?'disabled="disabled"':''; ?> /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Reset_Err" class="button button-secondary" value="<?php _e( "Reset Errors", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
874 |
-
</tr>
|
875 |
-
<tr>
|
876 |
-
<td colspan="2"><hr></td>
|
877 |
-
</tr>
|
878 |
-
<tr>
|
879 |
-
<td colspan="2"><?php echo "<h2>" . __( "General Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
880 |
-
</tr>
|
881 |
-
<tr>
|
882 |
-
<td class="gadwp-settings-title"><label for="ga_dash_tableid_jail"><?php _e("Select View:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
883 |
-
<td><select id="ga_dash_tableid_jail" <?php disabled(empty($options['ga_dash_profile_list']) || 1 == count($options['ga_dash_profile_list']), true); ?> name="options[ga_dash_tableid_jail]">
|
884 |
-
<?php
|
885 |
-
if ( ! empty( $options['ga_dash_profile_list'] ) ) {
|
886 |
-
foreach ( $options['ga_dash_profile_list'] as $items ) {
|
887 |
-
if ( $items[3] ) {
|
888 |
-
echo '<option value="' . esc_attr( $items[1] ) . '" ' . selected( $items[1], $options['ga_dash_tableid_jail'], false );
|
889 |
-
echo ' title="' . __( "View Name:", 'google-analytics-dashboard-for-wp' ) . ' ' . esc_attr( $items[0] ) . '">' . esc_html( GADWP_Tools::strip_protocol( $items[3] ) ) . ' ⇒ ' . esc_attr( $items[0] ) . '</option>';
|
890 |
-
}
|
891 |
-
}
|
892 |
-
} else {
|
893 |
-
echo '<option value="">' . __( "Property not found", 'google-analytics-dashboard-for-wp' ) . '</option>';
|
894 |
-
}
|
895 |
-
?>
|
896 |
-
</select>
|
897 |
-
<?php
|
898 |
-
if ( count( $options['ga_dash_profile_list'] ) > 1 ) {
|
899 |
-
?> <input type="submit" name="Hide" class="button button-secondary" value="<?php _e( "Lock Selection", 'google-analytics-dashboard-for-wp' ); ?>" /><?php
|
900 |
-
}
|
901 |
-
?>
|
902 |
-
</td>
|
903 |
-
</tr>
|
904 |
-
<?php
|
905 |
-
if ( $options['ga_dash_tableid_jail'] ) {
|
906 |
-
?>
|
907 |
-
<tr>
|
908 |
-
<td class="gadwp-settings-title"></td>
|
909 |
-
<td><?php
|
910 |
-
$profile_info = GADWP_Tools::get_selected_profile( $gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail'] );
|
911 |
-
echo '<pre>' . __( "View Name:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[0] ) . "<br />" . __( "Tracking ID:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[2] ) . "<br />" . __( "Default URL:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[3] ) . "<br />" . __( "Time Zone:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[5] ) . '</pre>';
|
912 |
-
?></td>
|
913 |
-
</tr>
|
914 |
-
<?php
|
915 |
-
}
|
916 |
-
?>
|
917 |
-
<tr>
|
918 |
-
<td class="gadwp-settings-title"><label for="ga_dash_style"><?php _e("Theme Color:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
919 |
-
<td><input type="text" id="ga_dash_style" class="ga_dash_style" name="options[ga_dash_style]" value="<?php echo esc_attr($options['ga_dash_style']); ?>" size="10"></td>
|
920 |
-
</tr>
|
921 |
-
<tr>
|
922 |
-
<td colspan="2"><hr></td>
|
923 |
-
</tr>
|
924 |
-
<?php if ( !is_multisite()) {?>
|
925 |
-
<tr>
|
926 |
-
<td colspan="2"><?php echo "<h2>" . __( "Automatic Updates", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
927 |
-
</tr>
|
928 |
-
<tr>
|
929 |
-
<td colspan="2" class="gadwp-settings-title">
|
930 |
-
<div class="button-primary gadwp-settings-switchoo">
|
931 |
-
<input type="checkbox" name="options[automatic_updates_minorversion]" value="1" class="gadwp-settings-switchoo-checkbox" id="automatic_updates_minorversion" <?php checked( $options['automatic_updates_minorversion'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="automatic_updates_minorversion">
|
932 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
933 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
934 |
-
</label>
|
935 |
-
</div>
|
936 |
-
<div class="switch-desc"><?php echo " ".__( "automatic updates for minor versions (security and maintenance releases only)", 'google-analytics-dashboard-for-wp' );?></div>
|
937 |
-
</td>
|
938 |
-
</tr>
|
939 |
-
<tr>
|
940 |
-
<td colspan="2"><hr></td>
|
941 |
-
</tr>
|
942 |
-
<?php }?>
|
943 |
-
<tr>
|
944 |
-
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
945 |
-
</tr>
|
946 |
-
<?php } else {?>
|
947 |
-
<tr>
|
948 |
-
<td colspan="2"><hr></td>
|
949 |
-
</tr>
|
950 |
-
<tr>
|
951 |
-
<td colspan="2"><input type="submit" name="Authorize" class="button button-secondary" id="authorize" value="<?php _e( "Authorize Plugin", 'google-analytics-dashboard-for-wp' ); ?>" <?php echo $options['ga_dash_network']?'disabled="disabled"':''; ?> /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
952 |
-
</tr>
|
953 |
-
<tr>
|
954 |
-
<td colspan="2"><hr></td>
|
955 |
-
</tr>
|
956 |
-
</table>
|
957 |
-
</form>
|
958 |
-
<?php
|
959 |
-
self::output_sidebar();
|
960 |
-
return;
|
961 |
-
}
|
962 |
-
?>
|
963 |
-
</table>
|
964 |
-
</form>
|
965 |
-
<?php
|
966 |
-
}
|
967 |
-
self::output_sidebar();
|
968 |
-
}
|
969 |
-
// Network Settings
|
970 |
-
public static function general_settings_network() {
|
971 |
-
$gadwp = GADWP();
|
972 |
-
global $wp_version;
|
973 |
-
|
974 |
-
if ( ! current_user_can( 'manage_network_options' ) ) {
|
975 |
-
return;
|
976 |
-
}
|
977 |
-
$options = self::update_options( 'network' );
|
978 |
-
/*
|
979 |
-
* Include GAPI
|
980 |
-
*/
|
981 |
-
echo '<div id="gapi-warning" class="updated"><p>' . __( 'Loading the required libraries. If this results in a blank screen or a fatal error, try this solution:', 'google-analytics-dashboard-for-wp' ) . ' <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=general_screen&utm_campaign=gadwp">Library conflicts between WordPress plugins</a></p></div>';
|
982 |
-
|
983 |
-
if ( null === $gadwp->gapi_controller ) {
|
984 |
-
$gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
985 |
-
}
|
986 |
-
|
987 |
-
echo '<script type="text/javascript">jQuery("#gapi-warning").hide()</script>';
|
988 |
-
if ( isset( $_POST['ga_dash_code'] ) ) {
|
989 |
-
if ( ! stripos( 'x' . $_POST['ga_dash_code'], 'UA-', 1 ) == 1 ) {
|
990 |
-
try {
|
991 |
-
$gadwp->gapi_controller->client->authenticate( $_POST['ga_dash_code'] );
|
992 |
-
$gadwp->config->options['ga_dash_token'] = $gadwp->gapi_controller->client->getAccessToken();
|
993 |
-
$gadwp->config->options['automatic_updates_minorversion'] = 1;
|
994 |
-
$gadwp->config->set_plugin_options( true );
|
995 |
-
$options = self::update_options( 'network' );
|
996 |
-
$message = "<div class='updated'><p>" . __( "Plugin authorization succeeded.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
997 |
-
if ( is_multisite() ) { // Cleanup errors on the entire network
|
998 |
-
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
999 |
-
switch_to_blog( $blog['blog_id'] );
|
1000 |
-
GADWP_Tools::delete_cache( 'gapi_errors' );
|
1001 |
-
restore_current_blog();
|
1002 |
-
}
|
1003 |
-
} else {
|
1004 |
-
GADWP_Tools::delete_cache( 'gapi_errors' );
|
1005 |
-
}
|
1006 |
-
if ( $gadwp->config->options['ga_dash_token'] && $gadwp->gapi_controller->client->getAccessToken() ) {
|
1007 |
-
if ( ! empty( $gadwp->config->options['ga_dash_profile_list'] ) ) {
|
1008 |
-
$profiles = $gadwp->config->options['ga_dash_profile_list'];
|
1009 |
-
} else {
|
1010 |
-
$profiles = $gadwp->gapi_controller->refresh_profiles();
|
1011 |
-
}
|
1012 |
-
if ( $profiles ) {
|
1013 |
-
$gadwp->config->options['ga_dash_profile_list'] = $profiles;
|
1014 |
-
if ( isset( $gadwp->config->options['ga_dash_tableid_jail'] ) && ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
1015 |
-
$profile = GADWP_Tools::guess_default_domain( $profiles );
|
1016 |
-
$gadwp->config->options['ga_dash_tableid_jail'] = $profile;
|
1017 |
-
// $gadwp->config->options['ga_dash_tableid'] = $profile;
|
1018 |
-
}
|
1019 |
-
$gadwp->config->set_plugin_options( true );
|
1020 |
-
$options = self::update_options( 'network' );
|
1021 |
-
}
|
1022 |
-
}
|
1023 |
-
} catch ( Google_IO_Exception $e ) {
|
1024 |
-
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $gadwp->gapi_controller->error_timeout );
|
1025 |
-
return false;
|
1026 |
-
} catch ( Google_Service_Exception $e ) {
|
1027 |
-
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $gadwp->gapi_controller->error_timeout );
|
1028 |
-
GADWP_Tools::set_cache( 'gapi_errors', $e->getErrors(), $gadwp->gapi_controller->error_timeout );
|
1029 |
-
return $e->getCode();
|
1030 |
-
} catch ( Exception $e ) {
|
1031 |
-
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ) . "\nResponseHttpCode:" . $e->getCode(), $gadwp->gapi_controller->error_timeout );
|
1032 |
-
$gadwp->gapi_controller->reset_token( false );
|
1033 |
-
}
|
1034 |
-
} else {
|
1035 |
-
$message = "<div class='error'><p>" . __( "The access code is <strong>NOT</strong> your <strong>Tracking ID</strong> (UA-XXXXX-X). Try again, and use the red link to get your access code", 'google-analytics-dashboard-for-wp' ) . ".</p></div>";
|
1036 |
-
}
|
1037 |
-
}
|
1038 |
-
if ( isset( $_POST['Refresh'] ) ) {
|
1039 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1040 |
-
$gadwp->config->options['ga_dash_profile_list'] = array();
|
1041 |
-
$message = "<div class='updated'><p>" . __( "Properties refreshed.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1042 |
-
$options = self::update_options( 'network' );
|
1043 |
-
if ( $gadwp->config->options['ga_dash_token'] && $gadwp->gapi_controller->client->getAccessToken() ) {
|
1044 |
-
if ( ! empty( $gadwp->config->options['ga_dash_profile_list'] ) ) {
|
1045 |
-
$profiles = $gadwp->config->options['ga_dash_profile_list'];
|
1046 |
-
} else {
|
1047 |
-
$profiles = $gadwp->gapi_controller->refresh_profiles();
|
1048 |
-
}
|
1049 |
-
if ( $profiles ) {
|
1050 |
-
$gadwp->config->options['ga_dash_profile_list'] = $profiles;
|
1051 |
-
if ( isset( $gadwp->config->options['ga_dash_tableid_jail'] ) && ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
1052 |
-
$profile = GADWP_Tools::guess_default_domain( $profiles );
|
1053 |
-
$gadwp->config->options['ga_dash_tableid_jail'] = $profile;
|
1054 |
-
// $gadwp->config->options['ga_dash_tableid'] = $profile;
|
1055 |
-
}
|
1056 |
-
$gadwp->config->set_plugin_options( true );
|
1057 |
-
$options = self::update_options( 'network' );
|
1058 |
-
}
|
1059 |
-
}
|
1060 |
-
} else {
|
1061 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1062 |
-
}
|
1063 |
-
}
|
1064 |
-
if ( isset( $_POST['Clear'] ) ) {
|
1065 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1066 |
-
GADWP_Tools::clear_cache();
|
1067 |
-
$message = "<div class='updated'><p>" . __( "Cleared Cache.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1068 |
-
} else {
|
1069 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1070 |
-
}
|
1071 |
-
}
|
1072 |
-
if ( isset( $_POST['Reset'] ) ) {
|
1073 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1074 |
-
$gadwp->gapi_controller->reset_token( true );
|
1075 |
-
GADWP_Tools::clear_cache();
|
1076 |
-
$message = "<div class='updated'><p>" . __( "Token Reseted and Revoked.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1077 |
-
$options = self::update_options( 'Reset' );
|
1078 |
-
} else {
|
1079 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1080 |
-
}
|
1081 |
-
}
|
1082 |
-
if ( isset( $_POST['options']['ga_dash_hidden'] ) && ! isset( $_POST['Clear'] ) && ! isset( $_POST['Reset'] ) && ! isset( $_POST['Refresh'] ) ) {
|
1083 |
-
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1084 |
-
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
1085 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1086 |
-
}
|
1087 |
-
}
|
1088 |
-
if ( isset( $_POST['Hide'] ) ) {
|
1089 |
-
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1090 |
-
$message = "<div class='updated'><p>" . __( "All other domains/properties were removed.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1091 |
-
$lock_profile = GADWP_Tools::get_selected_profile( $gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail'] );
|
1092 |
-
$gadwp->config->options['ga_dash_profile_list'] = array( $lock_profile );
|
1093 |
-
$options = self::update_options( 'network' );
|
1094 |
-
} else {
|
1095 |
-
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1096 |
-
}
|
1097 |
-
}
|
1098 |
-
?>
|
1099 |
-
<div class="wrap">
|
1100 |
-
<?php echo "<h2>" . __( "Google Analytics Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?><hr>
|
1101 |
-
</div>
|
1102 |
-
<div id="poststuff" class="gadwp">
|
1103 |
-
<div id="post-body" class="metabox-holder columns-2">
|
1104 |
-
<div id="post-body-content">
|
1105 |
-
<div class="settings-wrapper">
|
1106 |
-
<div class="inside">
|
1107 |
-
<?php
|
1108 |
-
if ( $gadwp->gapi_controller->gapi_errors_handler() || GADWP_Tools::get_cache( 'last_error' ) ) {
|
1109 |
-
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
1110 |
-
}
|
1111 |
-
if ( isset( $_POST['Authorize'] ) ) {
|
1112 |
-
GADWP_Tools::clear_cache();
|
1113 |
-
$gadwp->gapi_controller->token_request();
|
1114 |
-
echo "<div class='updated'><p>" . __( "Use the red link (see below) to generate and get your access code!", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1115 |
-
} else {
|
1116 |
-
if ( isset( $message ) ) {
|
1117 |
-
echo $message;
|
1118 |
-
}
|
1119 |
-
?>
|
1120 |
-
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
1121 |
-
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
1122 |
-
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
1123 |
-
<table class="gadwp-settings-options">
|
1124 |
-
<tr>
|
1125 |
-
<td colspan="2"><?php echo "<h2>" . __( "Network Setup", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1126 |
-
</tr>
|
1127 |
-
<tr>
|
1128 |
-
<td colspan="2" class="gadwp-settings-title">
|
1129 |
-
<div class="button-primary gadwp-settings-switchoo">
|
1130 |
-
<input type="checkbox" name="options[ga_dash_network]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_network" <?php checked( $options['ga_dash_network'], 1); ?> onchange="this.form.submit()"> <label class="gadwp-settings-switchoo-label" for="ga_dash_network">
|
1131 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
1132 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
1133 |
-
</label>
|
1134 |
-
</div>
|
1135 |
-
<div class="switch-desc"><?php echo " ".__("use a single Google Analytics account for the entire network", 'google-analytics-dashboard-for-wp' );?></div>
|
1136 |
-
</td>
|
1137 |
-
</tr>
|
1138 |
-
<?php if ($options['ga_dash_network']){ //Network Mode check?>
|
1139 |
-
<tr>
|
1140 |
-
<td colspan="2"><hr></td>
|
1141 |
-
</tr>
|
1142 |
-
<tr>
|
1143 |
-
<td colspan="2"><?php echo "<h2>" . __( "Plugin Authorization", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1144 |
-
</tr>
|
1145 |
-
<tr>
|
1146 |
-
<td colspan="2" class="gadwp-settings-info">
|
1147 |
-
<?php printf(__('You should watch the %1$s and read this %2$s before proceeding to authorization. This plugin requires a properly configured Google Analytics account!', 'google-analytics-dashboard-for-wp'), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_video&utm_campaign=gadwp', __("video", 'google-analytics-dashboard-for-wp')), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_tutorial&utm_campaign=gadwp', __("tutorial", 'google-analytics-dashboard-for-wp')));?>
|
1148 |
-
</td>
|
1149 |
-
</tr>
|
1150 |
-
<?php
|
1151 |
-
if ( ! $options['ga_dash_token'] || $options['ga_dash_userapi'] ) {
|
1152 |
-
?>
|
1153 |
-
<tr>
|
1154 |
-
<td colspan="2" class="gadwp-settings-info"><input name="options[ga_dash_userapi]" type="checkbox" id="ga_dash_userapi" value="1" <?php checked( $options['ga_dash_userapi'], 1 ); ?> onchange="this.form.submit()" /><?php echo " ".__("use your own API Project credentials", 'google-analytics-dashboard-for-wp' );?>
|
1155 |
-
</td>
|
1156 |
-
</tr>
|
1157 |
-
<?php
|
1158 |
-
}
|
1159 |
-
if ( $options['ga_dash_userapi'] ) {
|
1160 |
-
?>
|
1161 |
-
<tr>
|
1162 |
-
<td class="gadwp-settings-title"><label for="options[ga_dash_clientid]"><?php _e("Client ID:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
1163 |
-
<td><input type="text" name="options[ga_dash_clientid]" value="<?php echo esc_attr($options['ga_dash_clientid']); ?>" size="40" required="required"></td>
|
1164 |
-
</tr>
|
1165 |
-
<tr>
|
1166 |
-
<td class="gadwp-settings-title"><label for="options[ga_dash_clientsecret]"><?php _e("Client Secret:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
1167 |
-
<td><input type="text" name="options[ga_dash_clientsecret]" value="<?php echo esc_attr($options['ga_dash_clientsecret']); ?>" size="40" required="required"> <input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
1168 |
-
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
1169 |
-
</td>
|
1170 |
-
</tr>
|
1171 |
-
<?php
|
1172 |
-
}
|
1173 |
-
if ( $options['ga_dash_token'] ) {
|
1174 |
-
?>
|
1175 |
-
<tr>
|
1176 |
-
<td colspan="2"><input type="submit" name="Reset" class="button button-secondary" value="<?php _e( "Clear Authorization", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Refresh" class="button button-secondary" value="<?php _e( "Refresh Properties", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
1177 |
-
</tr>
|
1178 |
-
<tr>
|
1179 |
-
<td colspan="2"><hr></td>
|
1180 |
-
</tr>
|
1181 |
-
<tr>
|
1182 |
-
<td colspan="2"><?php echo "<h2>" . __( "Properties/Views Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1183 |
-
</tr>
|
1184 |
-
<?php
|
1185 |
-
if ( isset( $options['ga_dash_tableid_network'] ) ) {
|
1186 |
-
$options['ga_dash_tableid_network'] = json_decode( json_encode( $options['ga_dash_tableid_network'] ), false );
|
1187 |
-
}
|
1188 |
-
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
1189 |
-
?>
|
1190 |
-
<tr>
|
1191 |
-
<td class="gadwp-settings-title-s"><label for="ga_dash_tableid_network"><?php echo '<strong>'.$blog['domain'].$blog['path'].'</strong>: ';?></label></td>
|
1192 |
-
<td><select id="ga_dash_tableid_network" <?php disabled(!empty($options['ga_dash_profile_list']),false);?> name="options[ga_dash_tableid_network][<?php echo $blog['blog_id'];?>]">
|
1193 |
-
<?php
|
1194 |
-
if ( ! empty( $options['ga_dash_profile_list'] ) ) {
|
1195 |
-
foreach ( $options['ga_dash_profile_list'] as $items ) {
|
1196 |
-
if ( $items[3] ) {
|
1197 |
-
$temp_id = $blog['blog_id'];
|
1198 |
-
echo '<option value="' . esc_attr( $items[1] ) . '" ' . selected( $items[1], isset( $options['ga_dash_tableid_network']->$temp_id ) ? $options['ga_dash_tableid_network']->$temp_id : '', false );
|
1199 |
-
echo ' title="' . __( "View Name:", 'google-analytics-dashboard-for-wp' ) . ' ' . esc_attr( $items[0] ) . '">' . esc_html( GADWP_Tools::strip_protocol( $items[3] ) ) . ' ⇒ ' . esc_attr( $items[0] ) . '</option>';
|
1200 |
-
}
|
1201 |
-
}
|
1202 |
-
} else {
|
1203 |
-
echo '<option value="">' . __( "Property not found", 'google-analytics-dashboard-for-wp' ) . '</option>';
|
1204 |
-
}
|
1205 |
-
?>
|
1206 |
-
</select> <br /></td>
|
1207 |
-
</tr>
|
1208 |
-
<?php
|
1209 |
-
}
|
1210 |
-
?>
|
1211 |
-
<tr>
|
1212 |
-
<td colspan="2"><?php echo "<h2>" . __( "Automatic Updates", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1213 |
-
</tr>
|
1214 |
-
<tr>
|
1215 |
-
<td colspan="2" class="gadwp-settings-title">
|
1216 |
-
<div class="button-primary gadwp-settings-switchoo">
|
1217 |
-
<input type="checkbox" name="options[automatic_updates_minorversion]" value="1" class="gadwp-settings-switchoo-checkbox" id="automatic_updates_minorversion" <?php checked( $options['automatic_updates_minorversion'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="automatic_updates_minorversion">
|
1218 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
1219 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
1220 |
-
</label>
|
1221 |
-
</div>
|
1222 |
-
<div class="switch-desc"><?php echo " ".__( "automatic updates for minor versions (security and maintenance releases only)", 'google-analytics-dashboard-for-wp' );?></div>
|
1223 |
-
</td>
|
1224 |
-
</tr>
|
1225 |
-
<tr>
|
1226 |
-
<td colspan="2"><hr><?php echo "<h2>" . __( "Exclude Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1227 |
-
</tr>
|
1228 |
-
<tr>
|
1229 |
-
<td colspan="2" class="gadwp-settings-title">
|
1230 |
-
<div class="button-primary gadwp-settings-switchoo">
|
1231 |
-
<input type="checkbox" name="options[ga_dash_excludesa]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_excludesa"<?php checked( $options['ga_dash_excludesa'], 1); ?>"> <label class="gadwp-settings-switchoo-label" for="ga_dash_excludesa">
|
1232 |
-
<div class="gadwp-settings-switchoo-inner"></div>
|
1233 |
-
<div class="gadwp-settings-switchoo-switch"></div>
|
1234 |
-
</label>
|
1235 |
-
</div>
|
1236 |
-
<div class="switch-desc"><?php echo " ".__("exclude Super Admin tracking for the entire network", 'google-analytics-dashboard-for-wp' );?></div>
|
1237 |
-
</td>
|
1238 |
-
</tr>
|
1239 |
-
<tr>
|
1240 |
-
<td colspan="2"><hr></td>
|
1241 |
-
</tr>
|
1242 |
-
<tr>
|
1243 |
-
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
1244 |
-
</tr>
|
1245 |
-
<?php
|
1246 |
-
} else {
|
1247 |
-
?>
|
1248 |
-
<tr>
|
1249 |
-
<td colspan="2"><hr></td>
|
1250 |
-
</tr>
|
1251 |
-
<tr>
|
1252 |
-
<td colspan="2"><input type="submit" name="Authorize" class="button button-secondary" id="authorize" value="<?php _e( "Authorize Plugin", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
1253 |
-
</tr>
|
1254 |
-
<?php } //Network Mode check?>
|
1255 |
-
<tr>
|
1256 |
-
<td colspan="2"><hr></td>
|
1257 |
-
</tr>
|
1258 |
-
</table>
|
1259 |
-
</form>
|
1260 |
-
<?php
|
1261 |
-
self::output_sidebar();
|
1262 |
-
return;
|
1263 |
-
}
|
1264 |
-
?>
|
1265 |
-
</table>
|
1266 |
-
</form>
|
1267 |
-
<?php
|
1268 |
-
}
|
1269 |
-
self::output_sidebar();
|
1270 |
-
}
|
1271 |
-
|
1272 |
-
public static function output_sidebar() {
|
1273 |
-
global $wp_version;
|
1274 |
-
|
1275 |
-
$gadwp = GADWP();
|
1276 |
-
?>
|
1277 |
-
</div>
|
1278 |
-
</div>
|
1279 |
-
</div>
|
1280 |
-
<div id="postbox-container-1" class="postbox-container">
|
1281 |
-
<div class="meta-box-sortables">
|
1282 |
-
<div class="postbox">
|
1283 |
-
<h3>
|
1284 |
-
<span><?php _e("Setup Tutorial & Demo",'google-analytics-dashboard-for-wp') ?></span>
|
1285 |
-
</h3>
|
1286 |
-
<div class="inside">
|
1287 |
-
<a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=video&utm_campaign=gadwp" target="_blank"><img src="<?php echo plugins_url( 'images/google-analytics-dashboard.png' , __FILE__ );?>" width="100%" alt="" /></a>
|
1288 |
-
</div>
|
1289 |
-
</div>
|
1290 |
-
<div class="postbox">
|
1291 |
-
<h3>
|
1292 |
-
<span><?php _e("Follow & Review",'google-analytics-dashboard-for-wp')?></span>
|
1293 |
-
</h3>
|
1294 |
-
<div class="inside">
|
1295 |
-
<div class="gadash-desc">
|
1296 |
-
<div style="margin-left: -10px;">
|
1297 |
-
<div class="g-page" data-width="273" data-href="//plus.google.com/+Deconfcom" data-layout="landscape" data-showtagline="false" data-showcoverphoto="false" data-rel="publisher"></div>
|
1298 |
-
</div>
|
1299 |
-
<script type="text/javascript">
|
1300 |
-
(function() {
|
1301 |
-
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
|
1302 |
-
po.src = 'https://apis.google.com/js/platform.js';
|
1303 |
-
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
|
1304 |
-
})();
|
1305 |
-
</script>
|
1306 |
-
</div>
|
1307 |
-
<br />
|
1308 |
-
<div class="gadash-desc">
|
1309 |
-
<a href="https://twitter.com/deconfcom" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @deconfcom</a>
|
1310 |
-
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
|
1311 |
-
</div>
|
1312 |
-
<br />
|
1313 |
-
<div class="gadash-title">
|
1314 |
-
<a href="http://wordpress.org/support/view/plugin-reviews/google-analytics-dashboard-for-wp#plugin-info"><img src="<?php echo plugins_url( 'images/star.png' , __FILE__ ); ?>" /></a>
|
1315 |
-
</div>
|
1316 |
-
<div class="gadash-desc">
|
1317 |
-
<?php printf(__('Your feedback and review are both important, %s!', 'google-analytics-dashboard-for-wp'), sprintf('<a href="http://wordpress.org/support/view/plugin-reviews/google-analytics-dashboard-for-wp#plugin-info">%s</a>', __('rate this plugin', 'google-analytics-dashboard-for-wp')));?>
|
1318 |
-
</div>
|
1319 |
-
</div>
|
1320 |
-
</div>
|
1321 |
-
<div class="postbox">
|
1322 |
-
<h3>
|
1323 |
-
<span><?php _e("Further Reading",'google-analytics-dashboard-for-wp')?></span>
|
1324 |
-
</h3>
|
1325 |
-
<div class="inside">
|
1326 |
-
<div class="gadash-title">
|
1327 |
-
<a href="https://deconf.com/clicky-web-analytics-review/?utm_source=gadwp_config&utm_medium=link&utm_content=clicky&utm_campaign=gadwp"><img src="<?php echo plugins_url( 'images/clicky.png' , __FILE__ ); ?>" /></a>
|
1328 |
-
</div>
|
1329 |
-
<div class="gadash-desc">
|
1330 |
-
<?php printf(__('%s service with users tracking at IP level.', 'google-analytics-dashboard-for-wp'), sprintf('<a href="https://deconf.com/clicky-web-analytics-review/?utm_source=gadwp_config&utm_medium=link&utm_content=clicky&utm_campaign=gadwp">%s</a>', __('Web Analytics', 'google-analytics-dashboard-for-wp')));?>
|
1331 |
-
</div>
|
1332 |
-
<br />
|
1333 |
-
<div class="gadash-title">
|
1334 |
-
<a href="https://deconf.com/move-website-https-ssl/?utm_source=gadwp_config&utm_medium=link&utm_content=ssl&utm_campaign=gadwp"><img src="<?php echo plugins_url( 'images/ssl.png' , __FILE__ ); ?>" /></a>
|
1335 |
-
</div>
|
1336 |
-
<div class="gadash-desc">
|
1337 |
-
<?php printf(__('%s by moving your website to HTTPS/SSL.', 'google-analytics-dashboard-for-wp'), sprintf('<a href="https://deconf.com/move-website-https-ssl/?utm_source=gadwp_config&utm_medium=link&utm_content=ssl&utm_campaign=gadwp">%s</a>', __('Improve search rankings', 'google-analytics-dashboard-for-wp')));?>
|
1338 |
-
</div>
|
1339 |
-
<br />
|
1340 |
-
<div class="gadash-title">
|
1341 |
-
<a href="https://deconf.com/wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=plugins&utm_campaign=gadwp"><img src="<?php echo plugins_url( 'images/wp.png' , __FILE__ ); ?>" /></a>
|
1342 |
-
</div>
|
1343 |
-
<div class="gadash-desc">
|
1344 |
-
<?php printf(__('Other %s written by the same author', 'google-analytics-dashboard-for-wp'), sprintf('<a href="https://deconf.com/wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=plugins&utm_campaign=gadwp">%s</a>', __('WordPress Plugins', 'google-analytics-dashboard-for-wp')));?>
|
1345 |
-
</div>
|
1346 |
-
</div>
|
1347 |
-
</div>
|
1348 |
-
</div>
|
1349 |
-
</div>
|
1350 |
-
</div>
|
1351 |
-
</div>
|
1352 |
-
<?php
|
1353 |
-
//Dismiss the admin update notice
|
1354 |
-
if ( version_compare( $wp_version, '4.2', '<' ) && current_user_can('manage_options') ) {
|
1355 |
-
delete_option('gadwp_got_updated');
|
1356 |
-
}
|
1357 |
-
}
|
1358 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
final class GADWP_Settings {
|
15 |
+
|
16 |
+
private static function update_options( $who ) {
|
17 |
+
$gadwp = GADWP();
|
18 |
+
$network_settings = false;
|
19 |
+
$options = $gadwp->config->options; // Get current options
|
20 |
+
if ( isset( $_POST['options']['ga_dash_hidden'] ) && isset( $_POST['options'] ) && ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) && $who != 'Reset' ) {
|
21 |
+
$new_options = $_POST['options'];
|
22 |
+
if ( $who == 'tracking' ) {
|
23 |
+
$options['ga_dash_anonim'] = 0;
|
24 |
+
$options['ga_event_tracking'] = 0;
|
25 |
+
$options['ga_enhanced_links'] = 0;
|
26 |
+
$options['ga_dash_remarketing'] = 0;
|
27 |
+
$options['ga_dash_adsense'] = 0;
|
28 |
+
$options['ga_event_bouncerate'] = 0;
|
29 |
+
$options['ga_crossdomain_tracking'] = 0;
|
30 |
+
$options['ga_aff_tracking'] = 0;
|
31 |
+
$options['ga_hash_tracking'] = 0;
|
32 |
+
if ( isset( $_POST['options']['ga_tracking_code'] ) ) {
|
33 |
+
$new_options['ga_tracking_code'] = trim( $new_options['ga_tracking_code'], "\t" );
|
34 |
+
}
|
35 |
+
if ( empty( $new_options['ga_track_exclude'] ) ) {
|
36 |
+
$new_options['ga_track_exclude'] = array();
|
37 |
+
}
|
38 |
+
} else if ( $who == 'backend' ) {
|
39 |
+
$options['switch_profile'] = 0;
|
40 |
+
$options['backend_item_reports'] = 0;
|
41 |
+
$options['dashboard_widget'] = 0;
|
42 |
+
if ( empty( $new_options['ga_dash_access_back'] ) ) {
|
43 |
+
$new_options['ga_dash_access_back'][] = 'administrator';
|
44 |
+
}
|
45 |
+
} else if ( $who == 'frontend' ) {
|
46 |
+
$options['frontend_item_reports'] = 0;
|
47 |
+
if ( empty( $new_options['ga_dash_access_front'] ) ) {
|
48 |
+
$new_options['ga_dash_access_front'][] = 'administrator';
|
49 |
+
}
|
50 |
+
} else if ( $who == 'general' ) {
|
51 |
+
$options['ga_dash_userapi'] = 0;
|
52 |
+
if ( ! is_multisite() ) {
|
53 |
+
$options['automatic_updates_minorversion'] = 0;
|
54 |
+
}
|
55 |
+
} else if ( $who == 'network' ) {
|
56 |
+
$options['ga_dash_userapi'] = 0;
|
57 |
+
$options['ga_dash_network'] = 0;
|
58 |
+
$options['ga_dash_excludesa'] = 0;
|
59 |
+
$options['automatic_updates_minorversion'] = 0;
|
60 |
+
$network_settings = true;
|
61 |
+
}
|
62 |
+
$options = array_merge( $options, $new_options );
|
63 |
+
$gadwp->config->options = $options;
|
64 |
+
$gadwp->config->set_plugin_options( $network_settings );
|
65 |
+
}
|
66 |
+
return $options;
|
67 |
+
}
|
68 |
+
|
69 |
+
private static function navigation_tabs( $tabs ) {
|
70 |
+
echo '<h2 class="nav-tab-wrapper">';
|
71 |
+
foreach ( $tabs as $tab => $name ) {
|
72 |
+
echo "<a class='nav-tab' id='tab-$tab' href='#top#gadwp-$tab'>$name</a>";
|
73 |
+
}
|
74 |
+
echo '</h2>';
|
75 |
+
}
|
76 |
+
|
77 |
+
public static function frontend_settings() {
|
78 |
+
$gadwp = GADWP();
|
79 |
+
if ( ! current_user_can( 'manage_options' ) ) {
|
80 |
+
return;
|
81 |
+
}
|
82 |
+
$options = self::update_options( 'frontend' );
|
83 |
+
if ( isset( $_POST['options']['ga_dash_hidden'] ) ) {
|
84 |
+
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
85 |
+
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
86 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
87 |
+
}
|
88 |
+
}
|
89 |
+
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] || ! $gadwp->config->options['ga_dash_token'] ) {
|
90 |
+
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
91 |
+
}
|
92 |
+
?>
|
93 |
+
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
94 |
+
<div class="wrap">
|
95 |
+
<?php echo "<h2>" . __( "Google Analytics Frontend Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?><hr>
|
96 |
+
</div>
|
97 |
+
<div id="poststuff" class="gadwp">
|
98 |
+
<div id="post-body" class="metabox-holder columns-2">
|
99 |
+
<div id="post-body-content">
|
100 |
+
<div class="settings-wrapper">
|
101 |
+
<div class="inside">
|
102 |
+
<?php if (isset($message)) echo $message; ?>
|
103 |
+
<table class="gadwp-settings-options">
|
104 |
+
<tr>
|
105 |
+
<td colspan="2"><?php echo "<h2>" . __( "Permissions", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
106 |
+
</tr>
|
107 |
+
<tr>
|
108 |
+
<td class="roles gadwp-settings-title"><label for="ga_dash_access_front"><?php _e("Show stats to:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
109 |
+
<td class="gadwp-settings-roles">
|
110 |
+
<?php
|
111 |
+
if ( ! isset( $wp_roles ) ) {
|
112 |
+
$wp_roles = new WP_Roles();
|
113 |
+
}
|
114 |
+
$i = 0;
|
115 |
+
?>
|
116 |
+
<table>
|
117 |
+
<tr>
|
118 |
+
<?php
|
119 |
+
foreach ( $wp_roles->role_names as $role => $name ) {
|
120 |
+
if ( $role != 'subscriber' ) {
|
121 |
+
$i++;
|
122 |
+
?>
|
123 |
+
<td><label> <input type="checkbox" name="options[ga_dash_access_front][]" value="<?php echo $role; ?>" <?php if (in_array($role,$options['ga_dash_access_front']) || $role=='administrator') echo 'checked="checked"'; if ($role=='administrator') echo 'disabled="disabled"';?> /><?php echo $name; ?>
|
124 |
+
</label></td>
|
125 |
+
<?php
|
126 |
+
}
|
127 |
+
if ( $i % 4 == 0 ) {
|
128 |
+
?>
|
129 |
+
</tr>
|
130 |
+
<tr>
|
131 |
+
<?php
|
132 |
+
}
|
133 |
+
}
|
134 |
+
?>
|
135 |
+
</table>
|
136 |
+
</td>
|
137 |
+
</tr>
|
138 |
+
<tr>
|
139 |
+
<td colspan="2" class="gadwp-settings-title">
|
140 |
+
<div class="button-primary gadwp-settings-switchoo">
|
141 |
+
<input type="checkbox" name="options[frontend_item_reports]" value="1" class="gadwp-settings-switchoo-checkbox" id="frontend_item_reports" <?php checked( $options['frontend_item_reports'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="frontend_item_reports">
|
142 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
143 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
144 |
+
</label>
|
145 |
+
</div>
|
146 |
+
<div class="switch-desc"><?php echo " ".__("enable web page reports on frontend", 'google-analytics-dashboard-for-wp' );?></div>
|
147 |
+
</td>
|
148 |
+
</tr>
|
149 |
+
<tr>
|
150 |
+
<td colspan="2"><hr></td>
|
151 |
+
</tr>
|
152 |
+
<tr>
|
153 |
+
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
154 |
+
</tr>
|
155 |
+
</table>
|
156 |
+
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
157 |
+
<?php wp_nonce_field('gadash_form','gadash_security');?>
|
158 |
+
</form>
|
159 |
+
<?php
|
160 |
+
self::output_sidebar();
|
161 |
+
}
|
162 |
+
|
163 |
+
public static function backend_settings() {
|
164 |
+
$gadwp = GADWP();
|
165 |
+
if ( ! current_user_can( 'manage_options' ) ) {
|
166 |
+
return;
|
167 |
+
}
|
168 |
+
$options = self::update_options( 'backend' );
|
169 |
+
if ( isset( $_POST['options']['ga_dash_hidden'] ) ) {
|
170 |
+
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
171 |
+
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
172 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
173 |
+
}
|
174 |
+
}
|
175 |
+
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] || ! $gadwp->config->options['ga_dash_token'] ) {
|
176 |
+
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
177 |
+
}
|
178 |
+
?>
|
179 |
+
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
180 |
+
<div class="wrap">
|
181 |
+
<?php echo "<h2>" . __( "Google Analytics Backend Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?><hr>
|
182 |
+
</div>
|
183 |
+
<div id="poststuff" class="gadwp">
|
184 |
+
<div id="post-body" class="metabox-holder columns-2">
|
185 |
+
<div id="post-body-content">
|
186 |
+
<div class="settings-wrapper">
|
187 |
+
<div class="inside">
|
188 |
+
<?php if (isset($message)) echo $message; ?>
|
189 |
+
<table class="gadwp-settings-options">
|
190 |
+
<tr>
|
191 |
+
<td colspan="2"><?php echo "<h2>" . __( "Permissions", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
192 |
+
</tr>
|
193 |
+
<tr>
|
194 |
+
<td class="roles gadwp-settings-title"><label for="ga_dash_access_back"><?php _e("Show stats to:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
195 |
+
<td class="gadwp-settings-roles">
|
196 |
+
<?php
|
197 |
+
if ( ! isset( $wp_roles ) ) {
|
198 |
+
$wp_roles = new WP_Roles();
|
199 |
+
}
|
200 |
+
$i = 0;
|
201 |
+
?>
|
202 |
+
<table>
|
203 |
+
<tr>
|
204 |
+
<?php
|
205 |
+
|
206 |
+
foreach ( $wp_roles->role_names as $role => $name ) {
|
207 |
+
if ( $role != 'subscriber' ) {
|
208 |
+
$i++;
|
209 |
+
?>
|
210 |
+
<td><label> <input type="checkbox" name="options[ga_dash_access_back][]" value="<?php echo $role; ?>" <?php if (in_array($role,$options['ga_dash_access_back']) || $role=='administrator') echo 'checked="checked"'; if ($role=='administrator') echo 'disabled="disabled"';?> />
|
211 |
+
<?php echo $name; ?>
|
212 |
+
</label></td>
|
213 |
+
<?php
|
214 |
+
}
|
215 |
+
if ( $i % 4 == 0 ) {
|
216 |
+
?>
|
217 |
+
</tr>
|
218 |
+
<tr>
|
219 |
+
<?php
|
220 |
+
}
|
221 |
+
}
|
222 |
+
?>
|
223 |
+
</table>
|
224 |
+
</td>
|
225 |
+
</tr>
|
226 |
+
<tr>
|
227 |
+
<td colspan="2" class="gadwp-settings-title">
|
228 |
+
<div class="button-primary gadwp-settings-switchoo">
|
229 |
+
<input type="checkbox" name="options[switch_profile]" value="1" class="gadwp-settings-switchoo-checkbox" id="switch_profile" <?php checked( $options['switch_profile'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="switch_profile">
|
230 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
231 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
232 |
+
</label>
|
233 |
+
</div>
|
234 |
+
<div class="switch-desc"><?php _e ( "enable Switch View functionality", 'google-analytics-dashboard-for-wp' );?></div>
|
235 |
+
</td>
|
236 |
+
</tr>
|
237 |
+
<tr>
|
238 |
+
<td colspan="2" class="gadwp-settings-title">
|
239 |
+
<div class="button-primary gadwp-settings-switchoo">
|
240 |
+
<input type="checkbox" name="options[backend_item_reports]" value="1" class="gadwp-settings-switchoo-checkbox" id="backend_item_reports" <?php checked( $options['backend_item_reports'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="backend_item_reports">
|
241 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
242 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
243 |
+
</label>
|
244 |
+
</div>
|
245 |
+
<div class="switch-desc"><?php _e ( "enable reports on Posts List and Pages List", 'google-analytics-dashboard-for-wp' );?></div>
|
246 |
+
</td>
|
247 |
+
</tr>
|
248 |
+
<tr>
|
249 |
+
<td colspan="2" class="gadwp-settings-title">
|
250 |
+
<div class="button-primary gadwp-settings-switchoo">
|
251 |
+
<input type="checkbox" name="options[dashboard_widget]" value="1" class="gadwp-settings-switchoo-checkbox" id="dashboard_widget" <?php checked( $options['dashboard_widget'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="dashboard_widget">
|
252 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
253 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
254 |
+
</label>
|
255 |
+
</div>
|
256 |
+
<div class="switch-desc"><?php _e ( "enable the main Dashboard Widget", 'google-analytics-dashboard-for-wp' );?></div>
|
257 |
+
</td>
|
258 |
+
</tr>
|
259 |
+
<tr>
|
260 |
+
<td colspan="2"><hr><?php echo "<h2>" . __( "Real-Time Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
261 |
+
</tr>
|
262 |
+
<tr>
|
263 |
+
<td colspan="2" class="gadwp-settings-title"> <?php _e("Maximum number of pages to display on real-time tab:", 'google-analytics-dashboard-for-wp'); ?>
|
264 |
+
<input type="number" name="options[ga_realtime_pages]" id="ga_realtime_pages" value="<?php echo (int)$options['ga_realtime_pages']; ?>" size="3">
|
265 |
+
</td>
|
266 |
+
</tr>
|
267 |
+
<tr>
|
268 |
+
<td colspan="2"><hr><?php echo "<h2>" . __( "Location Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
269 |
+
</tr>
|
270 |
+
<tr>
|
271 |
+
<td colspan="2" class="gadwp-settings-title">
|
272 |
+
<?php echo __("Target Geo Map to country:", 'google-analytics-dashboard-for-wp'); ?>
|
273 |
+
<input type="text" style="text-align: center;" name="options[ga_target_geomap]" value="<?php echo esc_attr($options['ga_target_geomap']); ?>" size="3">
|
274 |
+
</td>
|
275 |
+
</tr>
|
276 |
+
<tr>
|
277 |
+
<td colspan="2" class="gadwp-settings-title">
|
278 |
+
<?php echo __("Maps API Key:", 'google-analytics-dashboard-for-wp'); ?>
|
279 |
+
<input type="text" style="text-align: center;" name="options[maps_api_key]" value="<?php echo esc_attr($options['maps_api_key']); ?>" size="50">
|
280 |
+
</td>
|
281 |
+
</tr>
|
282 |
+
<tr>
|
283 |
+
<td colspan="2"><hr><?php echo "<h2>" . __( "404 Errors Report", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
284 |
+
</tr>
|
285 |
+
<tr>
|
286 |
+
<td colspan="2" class="gadwp-settings-title">
|
287 |
+
<?php echo __("404 Page Title contains:", 'google-analytics-dashboard-for-wp'); ?>
|
288 |
+
<input type="text" style="text-align: center;" name="options[pagetitle_404]" value="<?php echo esc_attr($options['pagetitle_404']); ?>" size="20">
|
289 |
+
</td>
|
290 |
+
</tr>
|
291 |
+
<tr>
|
292 |
+
<td colspan="2"><hr></td>
|
293 |
+
</tr>
|
294 |
+
<tr>
|
295 |
+
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
296 |
+
</tr>
|
297 |
+
</table>
|
298 |
+
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
299 |
+
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
300 |
+
|
301 |
+
</form>
|
302 |
+
<?php
|
303 |
+
self::output_sidebar();
|
304 |
+
}
|
305 |
+
|
306 |
+
public static function tracking_settings() {
|
307 |
+
$gadwp = GADWP();
|
308 |
+
|
309 |
+
if ( ! current_user_can( 'manage_options' ) ) {
|
310 |
+
return;
|
311 |
+
}
|
312 |
+
$options = self::update_options( 'tracking' );
|
313 |
+
if ( isset( $_POST['options']['ga_dash_hidden'] ) ) {
|
314 |
+
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
315 |
+
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
316 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
317 |
+
}
|
318 |
+
}
|
319 |
+
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
320 |
+
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
321 |
+
}
|
322 |
+
if ( ! $options['ga_dash_tracking'] ) {
|
323 |
+
$message = "<div class='error'><p>" . __( "The tracking component is disabled. You should set <strong>Tracking Options</strong> to <strong>Enabled</strong>", 'google-analytics-dashboard-for-wp' ) . ".</p></div>";
|
324 |
+
}
|
325 |
+
?>
|
326 |
+
<form name="ga_dash_form" method="post" action="<?php esc_url($_SERVER['REQUEST_URI']); ?>">
|
327 |
+
<div class="wrap">
|
328 |
+
<?php echo "<h2>" . __( "Google Analytics Tracking Code", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
329 |
+
</div>
|
330 |
+
<div id="poststuff" class="gadwp">
|
331 |
+
<div id="post-body" class="metabox-holder columns-2">
|
332 |
+
<div id="post-body-content">
|
333 |
+
<div class="settings-wrapper">
|
334 |
+
<div class="inside">
|
335 |
+
<?php
|
336 |
+
$tabs = array( 'basic' => __( "Basic Settings", 'google-analytics-dashboard-for-wp' ), 'events' => __( "Events Tracking", 'google-analytics-dashboard-for-wp' ), 'custom' => __( "Custom Definitions", 'google-analytics-dashboard-for-wp' ), 'exclude' => __( "Exclude Tracking", 'google-analytics-dashboard-for-wp' ), 'advanced' => __( "Advanced Settings", 'google-analytics-dashboard-for-wp' ) );
|
337 |
+
self::navigation_tabs( $tabs );
|
338 |
+
if ( isset( $message ) )
|
339 |
+
echo $message;
|
340 |
+
?>
|
341 |
+
<div id="gadwp-basic">
|
342 |
+
<table class="gadwp-settings-options">
|
343 |
+
<tr>
|
344 |
+
<td colspan="2"><?php echo "<h2>" . __( "Tracking Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
345 |
+
</tr>
|
346 |
+
<tr>
|
347 |
+
<td class="gadwp-settings-title"><label for="ga_dash_tracking"><?php _e("Tracking Options:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
348 |
+
<td><select id="ga_dash_tracking" name="options[ga_dash_tracking]" onchange="this.form.submit()">
|
349 |
+
<option value="0" <?php selected( $options['ga_dash_tracking'], 0 ); ?>><?php _e("Disabled", 'google-analytics-dashboard-for-wp');?></option>
|
350 |
+
<option value="1" <?php selected( $options['ga_dash_tracking'], 1 ); ?>><?php _e("Enabled", 'google-analytics-dashboard-for-wp');?></option>
|
351 |
+
</select></td>
|
352 |
+
</tr>
|
353 |
+
<?php if ($options['ga_dash_tracking']) {?>
|
354 |
+
<tr>
|
355 |
+
<td class="gadwp-settings-title"></td>
|
356 |
+
<td>
|
357 |
+
<?php $profile_info = GADWP_Tools::get_selected_profile($gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail']); ?>
|
358 |
+
<?php echo '<pre>' . __("View Name:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[0]) . "<br />" . __("Tracking ID:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[2]) . "<br />" . __("Default URL:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[3]) . "<br />" . __("Time Zone:", 'google-analytics-dashboard-for-wp') . "\t" . esc_html($profile_info[5]) . '</pre>';?>
|
359 |
+
</td>
|
360 |
+
</tr>
|
361 |
+
<?php }?>
|
362 |
+
<tr>
|
363 |
+
<td colspan="2"><hr><?php echo "<h2>" . __( "Basic Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
364 |
+
</tr>
|
365 |
+
<tr>
|
366 |
+
<td class="gadwp-settings-title"><label for="ga_dash_tracking_type"><?php _e("Tracking Type:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
367 |
+
<td><select id="ga_dash_tracking_type" name="options[ga_dash_tracking_type]">
|
368 |
+
<option value="classic" <?php selected( $options['ga_dash_tracking_type'], 'classic' ); ?>><?php _e("Classic Analytics", 'google-analytics-dashboard-for-wp');?></option>
|
369 |
+
<option value="universal" <?php selected( $options['ga_dash_tracking_type'], 'universal' ); ?>><?php _e("Universal Analytics", 'google-analytics-dashboard-for-wp');?></option>
|
370 |
+
</select></td>
|
371 |
+
</tr>
|
372 |
+
<tr>
|
373 |
+
<td colspan="2" class="gadwp-settings-title">
|
374 |
+
<div class="button-primary gadwp-settings-switchoo">
|
375 |
+
<input type="checkbox" name="options[ga_dash_anonim]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_anonim" <?php checked( $options['ga_dash_anonim'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_dash_anonim">
|
376 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
377 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
378 |
+
</label>
|
379 |
+
</div>
|
380 |
+
<div class="switch-desc"><?php echo " ".__("anonymize IPs while tracking", 'google-analytics-dashboard-for-wp' );?></div>
|
381 |
+
</td>
|
382 |
+
</tr>
|
383 |
+
<tr>
|
384 |
+
<td colspan="2" class="gadwp-settings-title">
|
385 |
+
<div class="button-primary gadwp-settings-switchoo">
|
386 |
+
<input type="checkbox" name="options[ga_dash_remarketing]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_remarketing" <?php checked( $options['ga_dash_remarketing'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_dash_remarketing">
|
387 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
388 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
389 |
+
</label>
|
390 |
+
</div>
|
391 |
+
<div class="switch-desc"><?php echo " ".__("enable remarketing, demographics and interests reports", 'google-analytics-dashboard-for-wp' );?></div>
|
392 |
+
</td>
|
393 |
+
</tr>
|
394 |
+
</table>
|
395 |
+
</div>
|
396 |
+
<div id="gadwp-events">
|
397 |
+
<table class="gadwp-settings-options">
|
398 |
+
<tr>
|
399 |
+
<td colspan="2"><?php echo "<h2>" . __( "Events Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
400 |
+
</tr>
|
401 |
+
<tr>
|
402 |
+
<td colspan="2" class="gadwp-settings-title">
|
403 |
+
<div class="button-primary gadwp-settings-switchoo">
|
404 |
+
<input type="checkbox" name="options[ga_event_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_event_tracking" <?php checked( $options['ga_event_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_event_tracking">
|
405 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
406 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
407 |
+
</label>
|
408 |
+
</div>
|
409 |
+
<div class="switch-desc"><?php echo " ".__("track downloads, mailto and outbound links", 'google-analytics-dashboard-for-wp' ); ?></div>
|
410 |
+
</td>
|
411 |
+
</tr>
|
412 |
+
<tr>
|
413 |
+
<td class="gadwp-settings-title"><label for="ga_event_downloads"><?php _e("Downloads Regex:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
414 |
+
<td><input type="text" id="ga_event_downloads" name="options[ga_event_downloads]" value="<?php echo esc_attr($options['ga_event_downloads']); ?>" size="50"></td>
|
415 |
+
</tr>
|
416 |
+
<tr>
|
417 |
+
<td colspan="2" class="gadwp-settings-title">
|
418 |
+
<div class="button-primary gadwp-settings-switchoo">
|
419 |
+
<input type="checkbox" name="options[ga_aff_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_aff_tracking" <?php checked( $options['ga_aff_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_aff_tracking">
|
420 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
421 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
422 |
+
</label>
|
423 |
+
</div>
|
424 |
+
<div class="switch-desc"><?php echo " ".__("track affiliate links matching this regex", 'google-analytics-dashboard-for-wp' ); ?></div>
|
425 |
+
</td>
|
426 |
+
</tr>
|
427 |
+
<tr>
|
428 |
+
<td class="gadwp-settings-title"><label for="ga_event_affiliates"><?php _e("Affiliates Regex:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
429 |
+
<td><input type="text" id="ga_event_affiliates" name="options[ga_event_affiliates]" value="<?php echo esc_attr($options['ga_event_affiliates']); ?>" size="50"></td>
|
430 |
+
</tr>
|
431 |
+
<tr>
|
432 |
+
<td colspan="2" class="gadwp-settings-title">
|
433 |
+
<div class="button-primary gadwp-settings-switchoo">
|
434 |
+
<input type="checkbox" name="options[ga_hash_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_hash_tracking" <?php checked( $options['ga_hash_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_hash_tracking">
|
435 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
436 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
437 |
+
</label>
|
438 |
+
</div>
|
439 |
+
<div class="switch-desc"><?php echo " ".__("track fragment identifiers, hashmarks (#) in URI links", 'google-analytics-dashboard-for-wp' ); ?></div>
|
440 |
+
</td>
|
441 |
+
</tr>
|
442 |
+
</table>
|
443 |
+
</div>
|
444 |
+
<div id="gadwp-custom">
|
445 |
+
<table class="gadwp-settings-options">
|
446 |
+
<tr>
|
447 |
+
<td colspan="2"><?php echo "<h2>" . __( "Custom Definitions", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
448 |
+
</tr>
|
449 |
+
<tr>
|
450 |
+
<td class="gadwp-settings-title"><label for="ga_author_dimindex"><?php _e("Authors:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
451 |
+
<td><select id="ga_author_dimindex" name="options[ga_author_dimindex]">
|
452 |
+
<?php for ($i=0;$i<21;$i++){?>
|
453 |
+
<option value="<?php echo $i;?>" <?php selected( $options['ga_author_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
454 |
+
<?php }?>
|
455 |
+
</select></td>
|
456 |
+
</tr>
|
457 |
+
<tr>
|
458 |
+
<td class="gadwp-settings-title"><label for="ga_pubyear_dimindex"><?php _e("Publication Year:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
459 |
+
<td><select id="ga_pubyear_dimindex" name="options[ga_pubyear_dimindex]">
|
460 |
+
<?php for ($i=0;$i<21;$i++){?>
|
461 |
+
<option value="<?php echo $i;?>" <?php selected( $options['ga_pubyear_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
462 |
+
<?php }?>
|
463 |
+
</select></td>
|
464 |
+
</tr>
|
465 |
+
<tr>
|
466 |
+
<td class="gadwp-settings-title"><label for="ga_pubyearmonth_dimindex"><?php _e("Publication Month:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
467 |
+
<td><select id="ga_pubyearmonth_dimindex" name="options[ga_pubyearmonth_dimindex]">
|
468 |
+
<?php for ($i=0;$i<21;$i++){?>
|
469 |
+
<option value="<?php echo $i;?>" <?php selected( $options['ga_pubyearmonth_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
470 |
+
<?php }?>
|
471 |
+
</select></td>
|
472 |
+
</tr>
|
473 |
+
<tr>
|
474 |
+
<td class="gadwp-settings-title"><label for="ga_category_dimindex"><?php _e("Categories:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
475 |
+
<td><select id="ga_category_dimindex" name="options[ga_category_dimindex]">
|
476 |
+
<?php for ($i=0;$i<21;$i++){?>
|
477 |
+
<option value="<?php echo $i;?>" <?php selected( $options['ga_category_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
478 |
+
<?php }?>
|
479 |
+
</select></td>
|
480 |
+
</tr>
|
481 |
+
<tr>
|
482 |
+
<td class="gadwp-settings-title"><label for="ga_user_dimindex"><?php _e("User Type:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
483 |
+
<td><select id="ga_user_dimindex" name="options[ga_user_dimindex]">
|
484 |
+
<?php for ($i=0;$i<21;$i++){?>
|
485 |
+
<option value="<?php echo $i;?>" <?php selected( $options['ga_user_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
486 |
+
<?php }?>
|
487 |
+
</select></td>
|
488 |
+
</tr>
|
489 |
+
<tr>
|
490 |
+
<td class="gadwp-settings-title"><label for="ga_tag_dimindex"><?php _e("Tags:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
491 |
+
<td><select id="ga_tag_dimindex" name="options[ga_tag_dimindex]">
|
492 |
+
<?php for ($i=0;$i<21;$i++){?>
|
493 |
+
<option value="<?php echo $i;?>" <?php selected( $options['ga_tag_dimindex'], $i ); ?>><?php echo $i==0?'Disabled':'dimension '.$i; ?></option>
|
494 |
+
<?php }?>
|
495 |
+
</select></td>
|
496 |
+
</tr>
|
497 |
+
</table>
|
498 |
+
</div>
|
499 |
+
<div id="gadwp-advanced">
|
500 |
+
<table class="gadwp-settings-options">
|
501 |
+
<tr>
|
502 |
+
<td colspan="2"><?php echo "<h2>" . __( "Advanced Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
503 |
+
</tr>
|
504 |
+
<tr>
|
505 |
+
<td class="gadwp-settings-title"><label for="ga_speed_samplerate"><?php _e("Page Speed SR:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
506 |
+
<td><input type="number" id="ga_speed_samplerate" name="options[ga_speed_samplerate]" value="<?php echo (int)($options['ga_speed_samplerate']); ?>" max="100" min="1"> %</td>
|
507 |
+
</tr>
|
508 |
+
<tr>
|
509 |
+
<td colspan="2" class="gadwp-settings-title">
|
510 |
+
<div class="button-primary gadwp-settings-switchoo">
|
511 |
+
<input type="checkbox" name="options[ga_event_bouncerate]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_event_bouncerate" <?php checked( $options['ga_event_bouncerate'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_event_bouncerate">
|
512 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
513 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
514 |
+
</label>
|
515 |
+
</div>
|
516 |
+
<div class="switch-desc"><?php echo " ".__("exclude events from bounce-rate calculation", 'google-analytics-dashboard-for-wp' );?></div>
|
517 |
+
</td>
|
518 |
+
</tr>
|
519 |
+
<tr>
|
520 |
+
<td colspan="2" class="gadwp-settings-title">
|
521 |
+
<div class="button-primary gadwp-settings-switchoo">
|
522 |
+
<input type="checkbox" name="options[ga_enhanced_links]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_enhanced_links" <?php checked( $options['ga_enhanced_links'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_enhanced_links">
|
523 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
524 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
525 |
+
</label>
|
526 |
+
</div>
|
527 |
+
<div class="switch-desc"><?php echo " ".__("enable enhanced link attribution", 'google-analytics-dashboard-for-wp' );?></div>
|
528 |
+
</td>
|
529 |
+
</tr>
|
530 |
+
<tr>
|
531 |
+
<td colspan="2" class="gadwp-settings-title">
|
532 |
+
<div class="button-primary gadwp-settings-switchoo">
|
533 |
+
<input type="checkbox" name="options[ga_dash_adsense]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_adsense" <?php checked( $options['ga_dash_adsense'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_dash_adsense">
|
534 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
535 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
536 |
+
</label>
|
537 |
+
</div>
|
538 |
+
<div class="switch-desc"><?php echo " ".__("enable AdSense account linking", 'google-analytics-dashboard-for-wp' );?></div>
|
539 |
+
</td>
|
540 |
+
</tr>
|
541 |
+
<tr>
|
542 |
+
<td colspan="2"><?php echo "<h2>" . __( "Cross-domain Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
543 |
+
</tr>
|
544 |
+
<tr>
|
545 |
+
<td colspan="2" class="gadwp-settings-title">
|
546 |
+
<div class="button-primary gadwp-settings-switchoo">
|
547 |
+
<input type="checkbox" name="options[ga_crossdomain_tracking]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_crossdomain_tracking" <?php checked( $options['ga_crossdomain_tracking'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="ga_crossdomain_tracking">
|
548 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
549 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
550 |
+
</label>
|
551 |
+
</div>
|
552 |
+
<div class="switch-desc"><?php echo " ".__("enable cross domain tracking", 'google-analytics-dashboard-for-wp' ); ?></div>
|
553 |
+
</td>
|
554 |
+
</tr>
|
555 |
+
<tr>
|
556 |
+
<td class="gadwp-settings-title"><label for="ga_crossdomain_list"><?php _e("Cross Domains:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
557 |
+
<td><input type="text" id="ga_crossdomain_list" name="options[ga_crossdomain_list]" value="<?php echo esc_attr($options['ga_crossdomain_list']); ?>" size="50"></td>
|
558 |
+
</tr>
|
559 |
+
<tr>
|
560 |
+
<td colspan="2"><?php echo "<h2>" . __( "Cookie Customization", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
561 |
+
</tr>
|
562 |
+
<tr>
|
563 |
+
<td class="gadwp-settings-title"><label for="ga_cookiedomain"><?php _e("Cookie Domain:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
564 |
+
<td><input type="text" id="ga_cookiedomain" name="options[ga_cookiedomain]" value="<?php echo esc_attr($options['ga_cookiedomain']); ?>" size="50"></td>
|
565 |
+
</tr>
|
566 |
+
<tr>
|
567 |
+
<td class="gadwp-settings-title"><label for="ga_cookiename"><?php _e("Cookie Name:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
568 |
+
<td><input type="text" id="ga_cookiename" name="options[ga_cookiename]" value="<?php echo esc_attr($options['ga_cookiename']); ?>" size="50"></td>
|
569 |
+
</tr>
|
570 |
+
<tr>
|
571 |
+
<td class="gadwp-settings-title"><label for="ga_cookieexpires"><?php _e("Cookie Expires:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
572 |
+
<td><input type="text" id="ga_cookieexpires" name="options[ga_cookieexpires]" value="<?php echo esc_attr($options['ga_cookieexpires']); ?>" size="10"> seconds</td>
|
573 |
+
</tr>
|
574 |
+
</table>
|
575 |
+
</div>
|
576 |
+
<div id="gadwp-exclude">
|
577 |
+
<table class="gadwp-settings-options">
|
578 |
+
<tr>
|
579 |
+
<td colspan="2"><?php echo "<h2>" . __( "Exclude Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
580 |
+
</tr>
|
581 |
+
<tr>
|
582 |
+
<td class="roles gadwp-settings-title"><label for="ga_track_exclude"><?php _e("Exclude tracking for:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
583 |
+
<td class="gadwp-settings-roles">
|
584 |
+
<?php
|
585 |
+
if ( ! isset( $wp_roles ) ) {
|
586 |
+
$wp_roles = new WP_Roles();
|
587 |
+
}
|
588 |
+
$i = 0;
|
589 |
+
?> <table>
|
590 |
+
<tr>
|
591 |
+
<?php
|
592 |
+
foreach ( $wp_roles->role_names as $role => $name ) {
|
593 |
+
$i++;
|
594 |
+
?>
|
595 |
+
<td><label> <input type="checkbox" name="options[ga_track_exclude][]" value="<?php echo $role; ?>" <?php if (in_array($role,$options['ga_track_exclude'])) echo 'checked="checked"'; ?> />
|
596 |
+
<?php echo $name; ?>
|
597 |
+
</label></td>
|
598 |
+
<?php
|
599 |
+
if ( $i % 4 == 0 ) {
|
600 |
+
?>
|
601 |
+
</tr>
|
602 |
+
<tr>
|
603 |
+
<?php
|
604 |
+
}
|
605 |
+
}
|
606 |
+
?>
|
607 |
+
</table>
|
608 |
+
</td>
|
609 |
+
</tr>
|
610 |
+
</table>
|
611 |
+
</div>
|
612 |
+
<table class="gadwp-settings-options">
|
613 |
+
<tr>
|
614 |
+
<td colspan="2"><hr></td>
|
615 |
+
</tr>
|
616 |
+
<tr>
|
617 |
+
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
618 |
+
</tr>
|
619 |
+
</table>
|
620 |
+
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
621 |
+
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
622 |
+
</form>
|
623 |
+
<?php
|
624 |
+
self::output_sidebar();
|
625 |
+
}
|
626 |
+
|
627 |
+
public static function errors_debugging() {
|
628 |
+
global $wp_version;
|
629 |
+
|
630 |
+
$gadwp = GADWP();
|
631 |
+
|
632 |
+
if ( ! current_user_can( 'manage_options' ) ) {
|
633 |
+
return;
|
634 |
+
}
|
635 |
+
|
636 |
+
$anonim = $gadwp->config->options;
|
637 |
+
$anonim['wp_version'] = $wp_version;
|
638 |
+
$anonim['gadwp_version'] = GADWP_CURRENT_VERSION;
|
639 |
+
if ( $anonim['ga_dash_token'] ) {
|
640 |
+
$anonim['ga_dash_token'] = 'HIDDEN';
|
641 |
+
}
|
642 |
+
if ( $anonim['ga_dash_clientid'] ) {
|
643 |
+
$anonim['ga_dash_clientid'] = 'HIDDEN';
|
644 |
+
}
|
645 |
+
if ( $anonim['ga_dash_clientsecret'] ) {
|
646 |
+
$anonim['ga_dash_clientsecret'] = 'HIDDEN';
|
647 |
+
}
|
648 |
+
$options = self::update_options( 'frontend' );
|
649 |
+
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] || ! $gadwp->config->options['ga_dash_token'] ) {
|
650 |
+
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
651 |
+
}
|
652 |
+
?>
|
653 |
+
<div class="wrap">
|
654 |
+
<?php echo "<h2>" . __( "Google Analytics Errors & Debugging", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
655 |
+
</div>
|
656 |
+
<div id="poststuff" class="gadwp">
|
657 |
+
<div id="post-body" class="metabox-holder columns-2">
|
658 |
+
<div id="post-body-content">
|
659 |
+
<div class="settings-wrapper">
|
660 |
+
<div class="inside">
|
661 |
+
<?php if (isset($message)) echo $message; ?>
|
662 |
+
<?php
|
663 |
+
$tabs = array( 'errors' => __( "Errors & Details", 'google-analytics-dashboard-for-wp' ), 'config' => __( "Plugin Settings", 'google-analytics-dashboard-for-wp' ) );
|
664 |
+
self::navigation_tabs( $tabs );
|
665 |
+
?>
|
666 |
+
<div id="gadwp-errors">
|
667 |
+
<table class="gadwp-settings-options">
|
668 |
+
<tr>
|
669 |
+
<td>
|
670 |
+
<?php echo "<h2>" . __( "Last Error detected", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
671 |
+
</td>
|
672 |
+
</tr>
|
673 |
+
<tr>
|
674 |
+
<td>
|
675 |
+
<?php
|
676 |
+
$errors = print_r( GADWP_Tools::get_cache( 'last_error' ), true ) ? esc_html( print_r( GADWP_Tools::get_cache( 'last_error' ), true ) ) : __( "None", 'google-analytics-dashboard-for-wp' );
|
677 |
+
echo '<pre class="gadwp-settings-logdata">Last Error: ';
|
678 |
+
echo $errors;
|
679 |
+
?></pre>
|
680 |
+
</td>
|
681 |
+
</tr>
|
682 |
+
<tr>
|
683 |
+
<td colspan="2"><hr><?php echo "<h2>" . __( "Error Details", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
684 |
+
</tr>
|
685 |
+
<tr>
|
686 |
+
<td>
|
687 |
+
<?php
|
688 |
+
echo '<pre class="gadwp-settings-logdata">Error Details: ';
|
689 |
+
$error_details = print_r( GADWP_Tools::get_cache( 'gapi_errors' ), true ) ? "\n" . esc_html( print_r( GADWP_Tools::get_cache( 'last_error' ), true ) ) : __( "None", 'google-analytics-dashboard-for-wp' );
|
690 |
+
echo $error_details;
|
691 |
+
?></pre><br />
|
692 |
+
<hr>
|
693 |
+
</td>
|
694 |
+
|
695 |
+
|
696 |
+
<tr>
|
697 |
+
|
698 |
+
</table>
|
699 |
+
</div>
|
700 |
+
<div id="gadwp-config">
|
701 |
+
<table class="gadwp-settings-options">
|
702 |
+
<tr>
|
703 |
+
<td><?php echo "<h2>" . __( "Plugin Configuration", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
704 |
+
</tr>
|
705 |
+
<tr>
|
706 |
+
<td><pre class="gadwp-settings-logdata"><?php echo esc_html(print_r($anonim, true));?></pre><br />
|
707 |
+
<hr></td>
|
708 |
+
</tr>
|
709 |
+
</table>
|
710 |
+
</div>
|
711 |
+
<?php
|
712 |
+
self::output_sidebar();
|
713 |
+
}
|
714 |
+
|
715 |
+
public static function general_settings() {
|
716 |
+
$gadwp = GADWP();
|
717 |
+
|
718 |
+
global $wp_version;
|
719 |
+
|
720 |
+
if ( ! current_user_can( 'manage_options' ) ) {
|
721 |
+
return;
|
722 |
+
}
|
723 |
+
$options = self::update_options( 'general' );
|
724 |
+
printf( '<div id="gapi-warning" class="updated"><p>%1$s <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=general_screen&utm_campaign=gadwp">%2$s</a></p></div>', __( 'Loading the required libraries. If this results in a blank screen or a fatal error, try this solution:', 'google-analytics-dashboard-for-wp' ), __( 'Library conflicts between WordPress plugins', 'google-analytics-dashboard-for-wp' ) );
|
725 |
+
if ( null === $gadwp->gapi_controller ) {
|
726 |
+
$gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
727 |
+
}
|
728 |
+
echo '<script type="text/javascript">jQuery("#gapi-warning").hide()</script>';
|
729 |
+
if ( isset( $_POST['ga_dash_code'] ) ) {
|
730 |
+
if ( ! stripos( 'x' . $_POST['ga_dash_code'], 'UA-', 1 ) == 1 ) {
|
731 |
+
try {
|
732 |
+
$gadwp->gapi_controller->client->authenticate( $_POST['ga_dash_code'] );
|
733 |
+
$gadwp->config->options['ga_dash_token'] = $gadwp->gapi_controller->client->getAccessToken();
|
734 |
+
$gadwp->config->options['automatic_updates_minorversion'] = 1;
|
735 |
+
$gadwp->config->set_plugin_options();
|
736 |
+
$options = self::update_options( 'general' );
|
737 |
+
$message = "<div class='updated'><p>" . __( "Plugin authorization succeeded.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
738 |
+
GADWP_Tools::delete_cache( 'gapi_errors' );
|
739 |
+
GADWP_Tools::delete_cache( 'last_error' );
|
740 |
+
if ( $gadwp->config->options['ga_dash_token'] && $gadwp->gapi_controller->client->getAccessToken() ) {
|
741 |
+
if ( ! empty( $gadwp->config->options['ga_dash_profile_list'] ) ) {
|
742 |
+
$profiles = $gadwp->config->options['ga_dash_profile_list'];
|
743 |
+
} else {
|
744 |
+
$profiles = $gadwp->gapi_controller->refresh_profiles();
|
745 |
+
}
|
746 |
+
if ( $profiles ) {
|
747 |
+
$gadwp->config->options['ga_dash_profile_list'] = $profiles;
|
748 |
+
if ( ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
749 |
+
$profile = GADWP_Tools::guess_default_domain( $profiles );
|
750 |
+
$gadwp->config->options['ga_dash_tableid_jail'] = $profile;
|
751 |
+
// $gadwp->config->options['ga_dash_tableid'] = $profile;
|
752 |
+
}
|
753 |
+
$gadwp->config->set_plugin_options();
|
754 |
+
$options = self::update_options( 'general' );
|
755 |
+
}
|
756 |
+
}
|
757 |
+
} catch ( Google_IO_Exception $e ) {
|
758 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $gadwp->gapi_controller->error_timeout );
|
759 |
+
return false;
|
760 |
+
} catch ( Google_Service_Exception $e ) {
|
761 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $gadwp->gapi_controller->error_timeout );
|
762 |
+
GADWP_Tools::set_cache( 'gapi_errors', $e->getErrors(), $gadwp->gapi_controller->error_timeout );
|
763 |
+
return $e->getCode();
|
764 |
+
} catch ( Exception $e ) {
|
765 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ) . "\nResponseHttpCode:" . $e->getCode(), $gadwp->gapi_controller->error_timeout );
|
766 |
+
$gadwp->gapi_controller->reset_token( false );
|
767 |
+
}
|
768 |
+
} else {
|
769 |
+
$message = "<div class='error'><p>" . __( "The access code is <strong>NOT</strong> your <strong>Tracking ID</strong> (UA-XXXXX-X). Try again, and use the red link to get your access code", 'google-analytics-dashboard-for-wp' ) . ".</p></div>";
|
770 |
+
}
|
771 |
+
}
|
772 |
+
if ( isset( $_POST['Clear'] ) ) {
|
773 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
774 |
+
GADWP_Tools::clear_cache();
|
775 |
+
$message = "<div class='updated'><p>" . __( "Cleared Cache.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
776 |
+
} else {
|
777 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
778 |
+
}
|
779 |
+
}
|
780 |
+
if ( isset( $_POST['Reset'] ) ) {
|
781 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
782 |
+
$gadwp->gapi_controller->reset_token( true );
|
783 |
+
GADWP_Tools::clear_cache();
|
784 |
+
$message = "<div class='updated'><p>" . __( "Token Reseted and Revoked.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
785 |
+
$options = self::update_options( 'Reset' );
|
786 |
+
} else {
|
787 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
788 |
+
}
|
789 |
+
}
|
790 |
+
if ( isset( $_POST['Reset_Err'] ) ) {
|
791 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
792 |
+
GADWP_Tools::delete_cache( 'last_error' );
|
793 |
+
GADWP_Tools::delete_cache( 'gapi_errors' );
|
794 |
+
$message = "<div class='updated'><p>" . __( "All errors reseted.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
795 |
+
} else {
|
796 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
797 |
+
}
|
798 |
+
}
|
799 |
+
if ( isset( $_POST['options']['ga_dash_hidden'] ) && ! isset( $_POST['Clear'] ) && ! isset( $_POST['Reset'] ) && ! isset( $_POST['Reset_Err'] ) ) {
|
800 |
+
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
801 |
+
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
802 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
803 |
+
}
|
804 |
+
}
|
805 |
+
if ( isset( $_POST['Hide'] ) ) {
|
806 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
807 |
+
$message = "<div class='updated'><p>" . __( "All other domains/properties were removed.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
808 |
+
$lock_profile = GADWP_Tools::get_selected_profile( $gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail'] );
|
809 |
+
$gadwp->config->options['ga_dash_profile_list'] = array( $lock_profile );
|
810 |
+
$options = self::update_options( 'general' );
|
811 |
+
} else {
|
812 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
813 |
+
}
|
814 |
+
}
|
815 |
+
?>
|
816 |
+
<div class="wrap">
|
817 |
+
<?php echo "<h2>" . __( "Google Analytics Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?>
|
818 |
+
<hr>
|
819 |
+
</div>
|
820 |
+
<div id="poststuff" class="gadwp">
|
821 |
+
<div id="post-body" class="metabox-holder columns-2">
|
822 |
+
<div id="post-body-content">
|
823 |
+
<div class="settings-wrapper">
|
824 |
+
<div class="inside">
|
825 |
+
<?php
|
826 |
+
if ( $gadwp->gapi_controller->gapi_errors_handler() || GADWP_Tools::get_cache( 'last_error' ) ) {
|
827 |
+
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
828 |
+
}
|
829 |
+
if ( isset( $_POST['Authorize'] ) ) {
|
830 |
+
GADWP_Tools::clear_cache();
|
831 |
+
$gadwp->gapi_controller->token_request();
|
832 |
+
echo "<div class='updated'><p>" . __( "Use the red link (see below) to generate and get your access code!", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
833 |
+
} else {
|
834 |
+
if ( isset( $message ) ) {
|
835 |
+
echo $message;
|
836 |
+
}
|
837 |
+
?>
|
838 |
+
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
839 |
+
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
840 |
+
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
841 |
+
<table class="gadwp-settings-options">
|
842 |
+
<tr>
|
843 |
+
<td colspan="2">
|
844 |
+
<?php echo "<h2>" . __( "Plugin Authorization", 'google-analytics-dashboard-for-wp' ) . "</h2>";?>
|
845 |
+
</td>
|
846 |
+
</tr>
|
847 |
+
<tr>
|
848 |
+
<td colspan="2" class="gadwp-settings-info">
|
849 |
+
<?php printf(__('You should watch the %1$s and read this %2$s before proceeding to authorization. This plugin requires a properly configured Google Analytics account!', 'google-analytics-dashboard-for-wp'), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_video&utm_campaign=gadwp', __("video", 'google-analytics-dashboard-for-wp')), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_tutorial&utm_campaign=gadwp', __("tutorial", 'google-analytics-dashboard-for-wp')));?>
|
850 |
+
</td>
|
851 |
+
</tr>
|
852 |
+
<?php if (! $options['ga_dash_token'] || $options['ga_dash_userapi']) {?>
|
853 |
+
<tr>
|
854 |
+
<td colspan="2" class="gadwp-settings-info"><input name="options[ga_dash_userapi]" type="checkbox" id="ga_dash_userapi" value="1" <?php checked( $options['ga_dash_userapi'], 1 ); ?> onchange="this.form.submit()" <?php echo ($options['ga_dash_network'])?'disabled="disabled"':''; ?> /><?php echo " ".__("use your own API Project credentials", 'google-analytics-dashboard-for-wp' );?>
|
855 |
+
</td>
|
856 |
+
</tr>
|
857 |
+
<?php } if ($options['ga_dash_userapi']) { ?>
|
858 |
+
<tr>
|
859 |
+
<td class="gadwp-settings-title"><label for="options[ga_dash_clientid]"><?php _e("Client ID:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
860 |
+
<td><input type="text" name="options[ga_dash_clientid]" value="<?php echo esc_attr($options['ga_dash_clientid']); ?>" size="40" required="required"></td>
|
861 |
+
</tr>
|
862 |
+
<tr>
|
863 |
+
<td class="gadwp-settings-title"><label for="options[ga_dash_clientsecret]"><?php _e("Client Secret:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
864 |
+
<td><input type="text" name="options[ga_dash_clientsecret]" value="<?php echo esc_attr($options['ga_dash_clientsecret']); ?>" size="40" required="required"> <input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
865 |
+
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
866 |
+
</td>
|
867 |
+
</tr>
|
868 |
+
<?php
|
869 |
+
}
|
870 |
+
if ( $options['ga_dash_token'] ) {
|
871 |
+
?>
|
872 |
+
<tr>
|
873 |
+
<td colspan="2"><input type="submit" name="Reset" class="button button-secondary" value="<?php _e( "Clear Authorization", 'google-analytics-dashboard-for-wp' ); ?>" <?php echo $options['ga_dash_network']?'disabled="disabled"':''; ?> /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Reset_Err" class="button button-secondary" value="<?php _e( "Reset Errors", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
874 |
+
</tr>
|
875 |
+
<tr>
|
876 |
+
<td colspan="2"><hr></td>
|
877 |
+
</tr>
|
878 |
+
<tr>
|
879 |
+
<td colspan="2"><?php echo "<h2>" . __( "General Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
880 |
+
</tr>
|
881 |
+
<tr>
|
882 |
+
<td class="gadwp-settings-title"><label for="ga_dash_tableid_jail"><?php _e("Select View:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
883 |
+
<td><select id="ga_dash_tableid_jail" <?php disabled(empty($options['ga_dash_profile_list']) || 1 == count($options['ga_dash_profile_list']), true); ?> name="options[ga_dash_tableid_jail]">
|
884 |
+
<?php
|
885 |
+
if ( ! empty( $options['ga_dash_profile_list'] ) ) {
|
886 |
+
foreach ( $options['ga_dash_profile_list'] as $items ) {
|
887 |
+
if ( $items[3] ) {
|
888 |
+
echo '<option value="' . esc_attr( $items[1] ) . '" ' . selected( $items[1], $options['ga_dash_tableid_jail'], false );
|
889 |
+
echo ' title="' . __( "View Name:", 'google-analytics-dashboard-for-wp' ) . ' ' . esc_attr( $items[0] ) . '">' . esc_html( GADWP_Tools::strip_protocol( $items[3] ) ) . ' ⇒ ' . esc_attr( $items[0] ) . '</option>';
|
890 |
+
}
|
891 |
+
}
|
892 |
+
} else {
|
893 |
+
echo '<option value="">' . __( "Property not found", 'google-analytics-dashboard-for-wp' ) . '</option>';
|
894 |
+
}
|
895 |
+
?>
|
896 |
+
</select>
|
897 |
+
<?php
|
898 |
+
if ( count( $options['ga_dash_profile_list'] ) > 1 ) {
|
899 |
+
?> <input type="submit" name="Hide" class="button button-secondary" value="<?php _e( "Lock Selection", 'google-analytics-dashboard-for-wp' ); ?>" /><?php
|
900 |
+
}
|
901 |
+
?>
|
902 |
+
</td>
|
903 |
+
</tr>
|
904 |
+
<?php
|
905 |
+
if ( $options['ga_dash_tableid_jail'] ) {
|
906 |
+
?>
|
907 |
+
<tr>
|
908 |
+
<td class="gadwp-settings-title"></td>
|
909 |
+
<td><?php
|
910 |
+
$profile_info = GADWP_Tools::get_selected_profile( $gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail'] );
|
911 |
+
echo '<pre>' . __( "View Name:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[0] ) . "<br />" . __( "Tracking ID:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[2] ) . "<br />" . __( "Default URL:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[3] ) . "<br />" . __( "Time Zone:", 'google-analytics-dashboard-for-wp' ) . "\t" . esc_html( $profile_info[5] ) . '</pre>';
|
912 |
+
?></td>
|
913 |
+
</tr>
|
914 |
+
<?php
|
915 |
+
}
|
916 |
+
?>
|
917 |
+
<tr>
|
918 |
+
<td class="gadwp-settings-title"><label for="ga_dash_style"><?php _e("Theme Color:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
919 |
+
<td><input type="text" id="ga_dash_style" class="ga_dash_style" name="options[ga_dash_style]" value="<?php echo esc_attr($options['ga_dash_style']); ?>" size="10"></td>
|
920 |
+
</tr>
|
921 |
+
<tr>
|
922 |
+
<td colspan="2"><hr></td>
|
923 |
+
</tr>
|
924 |
+
<?php if ( !is_multisite()) {?>
|
925 |
+
<tr>
|
926 |
+
<td colspan="2"><?php echo "<h2>" . __( "Automatic Updates", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
927 |
+
</tr>
|
928 |
+
<tr>
|
929 |
+
<td colspan="2" class="gadwp-settings-title">
|
930 |
+
<div class="button-primary gadwp-settings-switchoo">
|
931 |
+
<input type="checkbox" name="options[automatic_updates_minorversion]" value="1" class="gadwp-settings-switchoo-checkbox" id="automatic_updates_minorversion" <?php checked( $options['automatic_updates_minorversion'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="automatic_updates_minorversion">
|
932 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
933 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
934 |
+
</label>
|
935 |
+
</div>
|
936 |
+
<div class="switch-desc"><?php echo " ".__( "automatic updates for minor versions (security and maintenance releases only)", 'google-analytics-dashboard-for-wp' );?></div>
|
937 |
+
</td>
|
938 |
+
</tr>
|
939 |
+
<tr>
|
940 |
+
<td colspan="2"><hr></td>
|
941 |
+
</tr>
|
942 |
+
<?php }?>
|
943 |
+
<tr>
|
944 |
+
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
945 |
+
</tr>
|
946 |
+
<?php } else {?>
|
947 |
+
<tr>
|
948 |
+
<td colspan="2"><hr></td>
|
949 |
+
</tr>
|
950 |
+
<tr>
|
951 |
+
<td colspan="2"><input type="submit" name="Authorize" class="button button-secondary" id="authorize" value="<?php _e( "Authorize Plugin", 'google-analytics-dashboard-for-wp' ); ?>" <?php echo $options['ga_dash_network']?'disabled="disabled"':''; ?> /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
952 |
+
</tr>
|
953 |
+
<tr>
|
954 |
+
<td colspan="2"><hr></td>
|
955 |
+
</tr>
|
956 |
+
</table>
|
957 |
+
</form>
|
958 |
+
<?php
|
959 |
+
self::output_sidebar();
|
960 |
+
return;
|
961 |
+
}
|
962 |
+
?>
|
963 |
+
</table>
|
964 |
+
</form>
|
965 |
+
<?php
|
966 |
+
}
|
967 |
+
self::output_sidebar();
|
968 |
+
}
|
969 |
+
// Network Settings
|
970 |
+
public static function general_settings_network() {
|
971 |
+
$gadwp = GADWP();
|
972 |
+
global $wp_version;
|
973 |
+
|
974 |
+
if ( ! current_user_can( 'manage_network_options' ) ) {
|
975 |
+
return;
|
976 |
+
}
|
977 |
+
$options = self::update_options( 'network' );
|
978 |
+
/*
|
979 |
+
* Include GAPI
|
980 |
+
*/
|
981 |
+
echo '<div id="gapi-warning" class="updated"><p>' . __( 'Loading the required libraries. If this results in a blank screen or a fatal error, try this solution:', 'google-analytics-dashboard-for-wp' ) . ' <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=general_screen&utm_campaign=gadwp">Library conflicts between WordPress plugins</a></p></div>';
|
982 |
+
|
983 |
+
if ( null === $gadwp->gapi_controller ) {
|
984 |
+
$gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
985 |
+
}
|
986 |
+
|
987 |
+
echo '<script type="text/javascript">jQuery("#gapi-warning").hide()</script>';
|
988 |
+
if ( isset( $_POST['ga_dash_code'] ) ) {
|
989 |
+
if ( ! stripos( 'x' . $_POST['ga_dash_code'], 'UA-', 1 ) == 1 ) {
|
990 |
+
try {
|
991 |
+
$gadwp->gapi_controller->client->authenticate( $_POST['ga_dash_code'] );
|
992 |
+
$gadwp->config->options['ga_dash_token'] = $gadwp->gapi_controller->client->getAccessToken();
|
993 |
+
$gadwp->config->options['automatic_updates_minorversion'] = 1;
|
994 |
+
$gadwp->config->set_plugin_options( true );
|
995 |
+
$options = self::update_options( 'network' );
|
996 |
+
$message = "<div class='updated'><p>" . __( "Plugin authorization succeeded.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
997 |
+
if ( is_multisite() ) { // Cleanup errors on the entire network
|
998 |
+
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
999 |
+
switch_to_blog( $blog['blog_id'] );
|
1000 |
+
GADWP_Tools::delete_cache( 'gapi_errors' );
|
1001 |
+
restore_current_blog();
|
1002 |
+
}
|
1003 |
+
} else {
|
1004 |
+
GADWP_Tools::delete_cache( 'gapi_errors' );
|
1005 |
+
}
|
1006 |
+
if ( $gadwp->config->options['ga_dash_token'] && $gadwp->gapi_controller->client->getAccessToken() ) {
|
1007 |
+
if ( ! empty( $gadwp->config->options['ga_dash_profile_list'] ) ) {
|
1008 |
+
$profiles = $gadwp->config->options['ga_dash_profile_list'];
|
1009 |
+
} else {
|
1010 |
+
$profiles = $gadwp->gapi_controller->refresh_profiles();
|
1011 |
+
}
|
1012 |
+
if ( $profiles ) {
|
1013 |
+
$gadwp->config->options['ga_dash_profile_list'] = $profiles;
|
1014 |
+
if ( isset( $gadwp->config->options['ga_dash_tableid_jail'] ) && ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
1015 |
+
$profile = GADWP_Tools::guess_default_domain( $profiles );
|
1016 |
+
$gadwp->config->options['ga_dash_tableid_jail'] = $profile;
|
1017 |
+
// $gadwp->config->options['ga_dash_tableid'] = $profile;
|
1018 |
+
}
|
1019 |
+
$gadwp->config->set_plugin_options( true );
|
1020 |
+
$options = self::update_options( 'network' );
|
1021 |
+
}
|
1022 |
+
}
|
1023 |
+
} catch ( Google_IO_Exception $e ) {
|
1024 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $gadwp->gapi_controller->error_timeout );
|
1025 |
+
return false;
|
1026 |
+
} catch ( Google_Service_Exception $e ) {
|
1027 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $gadwp->gapi_controller->error_timeout );
|
1028 |
+
GADWP_Tools::set_cache( 'gapi_errors', $e->getErrors(), $gadwp->gapi_controller->error_timeout );
|
1029 |
+
return $e->getCode();
|
1030 |
+
} catch ( Exception $e ) {
|
1031 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ) . "\nResponseHttpCode:" . $e->getCode(), $gadwp->gapi_controller->error_timeout );
|
1032 |
+
$gadwp->gapi_controller->reset_token( false );
|
1033 |
+
}
|
1034 |
+
} else {
|
1035 |
+
$message = "<div class='error'><p>" . __( "The access code is <strong>NOT</strong> your <strong>Tracking ID</strong> (UA-XXXXX-X). Try again, and use the red link to get your access code", 'google-analytics-dashboard-for-wp' ) . ".</p></div>";
|
1036 |
+
}
|
1037 |
+
}
|
1038 |
+
if ( isset( $_POST['Refresh'] ) ) {
|
1039 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1040 |
+
$gadwp->config->options['ga_dash_profile_list'] = array();
|
1041 |
+
$message = "<div class='updated'><p>" . __( "Properties refreshed.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1042 |
+
$options = self::update_options( 'network' );
|
1043 |
+
if ( $gadwp->config->options['ga_dash_token'] && $gadwp->gapi_controller->client->getAccessToken() ) {
|
1044 |
+
if ( ! empty( $gadwp->config->options['ga_dash_profile_list'] ) ) {
|
1045 |
+
$profiles = $gadwp->config->options['ga_dash_profile_list'];
|
1046 |
+
} else {
|
1047 |
+
$profiles = $gadwp->gapi_controller->refresh_profiles();
|
1048 |
+
}
|
1049 |
+
if ( $profiles ) {
|
1050 |
+
$gadwp->config->options['ga_dash_profile_list'] = $profiles;
|
1051 |
+
if ( isset( $gadwp->config->options['ga_dash_tableid_jail'] ) && ! $gadwp->config->options['ga_dash_tableid_jail'] ) {
|
1052 |
+
$profile = GADWP_Tools::guess_default_domain( $profiles );
|
1053 |
+
$gadwp->config->options['ga_dash_tableid_jail'] = $profile;
|
1054 |
+
// $gadwp->config->options['ga_dash_tableid'] = $profile;
|
1055 |
+
}
|
1056 |
+
$gadwp->config->set_plugin_options( true );
|
1057 |
+
$options = self::update_options( 'network' );
|
1058 |
+
}
|
1059 |
+
}
|
1060 |
+
} else {
|
1061 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1062 |
+
}
|
1063 |
+
}
|
1064 |
+
if ( isset( $_POST['Clear'] ) ) {
|
1065 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1066 |
+
GADWP_Tools::clear_cache();
|
1067 |
+
$message = "<div class='updated'><p>" . __( "Cleared Cache.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1068 |
+
} else {
|
1069 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1070 |
+
}
|
1071 |
+
}
|
1072 |
+
if ( isset( $_POST['Reset'] ) ) {
|
1073 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1074 |
+
$gadwp->gapi_controller->reset_token( true );
|
1075 |
+
GADWP_Tools::clear_cache();
|
1076 |
+
$message = "<div class='updated'><p>" . __( "Token Reseted and Revoked.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1077 |
+
$options = self::update_options( 'Reset' );
|
1078 |
+
} else {
|
1079 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1080 |
+
}
|
1081 |
+
}
|
1082 |
+
if ( isset( $_POST['options']['ga_dash_hidden'] ) && ! isset( $_POST['Clear'] ) && ! isset( $_POST['Reset'] ) && ! isset( $_POST['Refresh'] ) ) {
|
1083 |
+
$message = "<div class='updated'><p>" . __( "Settings saved.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1084 |
+
if ( ! ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) ) {
|
1085 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1086 |
+
}
|
1087 |
+
}
|
1088 |
+
if ( isset( $_POST['Hide'] ) ) {
|
1089 |
+
if ( isset( $_POST['gadash_security'] ) && wp_verify_nonce( $_POST['gadash_security'], 'gadash_form' ) ) {
|
1090 |
+
$message = "<div class='updated'><p>" . __( "All other domains/properties were removed.", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1091 |
+
$lock_profile = GADWP_Tools::get_selected_profile( $gadwp->config->options['ga_dash_profile_list'], $gadwp->config->options['ga_dash_tableid_jail'] );
|
1092 |
+
$gadwp->config->options['ga_dash_profile_list'] = array( $lock_profile );
|
1093 |
+
$options = self::update_options( 'network' );
|
1094 |
+
} else {
|
1095 |
+
$message = "<div class='error'><p>" . __( "Cheating Huh?", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1096 |
+
}
|
1097 |
+
}
|
1098 |
+
?>
|
1099 |
+
<div class="wrap">
|
1100 |
+
<?php echo "<h2>" . __( "Google Analytics Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?><hr>
|
1101 |
+
</div>
|
1102 |
+
<div id="poststuff" class="gadwp">
|
1103 |
+
<div id="post-body" class="metabox-holder columns-2">
|
1104 |
+
<div id="post-body-content">
|
1105 |
+
<div class="settings-wrapper">
|
1106 |
+
<div class="inside">
|
1107 |
+
<?php
|
1108 |
+
if ( $gadwp->gapi_controller->gapi_errors_handler() || GADWP_Tools::get_cache( 'last_error' ) ) {
|
1109 |
+
$message = sprintf( '<div class="error"><p>%s</p></div>', sprintf( __( 'Something went wrong, check %1$s or %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_errors_debugging', false ), __( 'Errors & Debug', 'google-analytics-dashboard-for-wp' ) ), sprintf( '<a href="%1$s">%2$s</a>', menu_page_url( 'gadash_settings', false ), __( 'authorize the plugin', 'google-analytics-dashboard-for-wp' ) ) ) );
|
1110 |
+
}
|
1111 |
+
if ( isset( $_POST['Authorize'] ) ) {
|
1112 |
+
GADWP_Tools::clear_cache();
|
1113 |
+
$gadwp->gapi_controller->token_request();
|
1114 |
+
echo "<div class='updated'><p>" . __( "Use the red link (see below) to generate and get your access code!", 'google-analytics-dashboard-for-wp' ) . "</p></div>";
|
1115 |
+
} else {
|
1116 |
+
if ( isset( $message ) ) {
|
1117 |
+
echo $message;
|
1118 |
+
}
|
1119 |
+
?>
|
1120 |
+
<form name="ga_dash_form" method="post" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
|
1121 |
+
<input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
1122 |
+
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
1123 |
+
<table class="gadwp-settings-options">
|
1124 |
+
<tr>
|
1125 |
+
<td colspan="2"><?php echo "<h2>" . __( "Network Setup", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1126 |
+
</tr>
|
1127 |
+
<tr>
|
1128 |
+
<td colspan="2" class="gadwp-settings-title">
|
1129 |
+
<div class="button-primary gadwp-settings-switchoo">
|
1130 |
+
<input type="checkbox" name="options[ga_dash_network]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_network" <?php checked( $options['ga_dash_network'], 1); ?> onchange="this.form.submit()"> <label class="gadwp-settings-switchoo-label" for="ga_dash_network">
|
1131 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
1132 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
1133 |
+
</label>
|
1134 |
+
</div>
|
1135 |
+
<div class="switch-desc"><?php echo " ".__("use a single Google Analytics account for the entire network", 'google-analytics-dashboard-for-wp' );?></div>
|
1136 |
+
</td>
|
1137 |
+
</tr>
|
1138 |
+
<?php if ($options['ga_dash_network']){ //Network Mode check?>
|
1139 |
+
<tr>
|
1140 |
+
<td colspan="2"><hr></td>
|
1141 |
+
</tr>
|
1142 |
+
<tr>
|
1143 |
+
<td colspan="2"><?php echo "<h2>" . __( "Plugin Authorization", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1144 |
+
</tr>
|
1145 |
+
<tr>
|
1146 |
+
<td colspan="2" class="gadwp-settings-info">
|
1147 |
+
<?php printf(__('You should watch the %1$s and read this %2$s before proceeding to authorization. This plugin requires a properly configured Google Analytics account!', 'google-analytics-dashboard-for-wp'), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_video&utm_campaign=gadwp', __("video", 'google-analytics-dashboard-for-wp')), sprintf('<a href="%1$s" target="_blank">%2$s</a>', 'https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=top_tutorial&utm_campaign=gadwp', __("tutorial", 'google-analytics-dashboard-for-wp')));?>
|
1148 |
+
</td>
|
1149 |
+
</tr>
|
1150 |
+
<?php
|
1151 |
+
if ( ! $options['ga_dash_token'] || $options['ga_dash_userapi'] ) {
|
1152 |
+
?>
|
1153 |
+
<tr>
|
1154 |
+
<td colspan="2" class="gadwp-settings-info"><input name="options[ga_dash_userapi]" type="checkbox" id="ga_dash_userapi" value="1" <?php checked( $options['ga_dash_userapi'], 1 ); ?> onchange="this.form.submit()" /><?php echo " ".__("use your own API Project credentials", 'google-analytics-dashboard-for-wp' );?>
|
1155 |
+
</td>
|
1156 |
+
</tr>
|
1157 |
+
<?php
|
1158 |
+
}
|
1159 |
+
if ( $options['ga_dash_userapi'] ) {
|
1160 |
+
?>
|
1161 |
+
<tr>
|
1162 |
+
<td class="gadwp-settings-title"><label for="options[ga_dash_clientid]"><?php _e("Client ID:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
1163 |
+
<td><input type="text" name="options[ga_dash_clientid]" value="<?php echo esc_attr($options['ga_dash_clientid']); ?>" size="40" required="required"></td>
|
1164 |
+
</tr>
|
1165 |
+
<tr>
|
1166 |
+
<td class="gadwp-settings-title"><label for="options[ga_dash_clientsecret]"><?php _e("Client Secret:", 'google-analytics-dashboard-for-wp'); ?></label></td>
|
1167 |
+
<td><input type="text" name="options[ga_dash_clientsecret]" value="<?php echo esc_attr($options['ga_dash_clientsecret']); ?>" size="40" required="required"> <input type="hidden" name="options[ga_dash_hidden]" value="Y">
|
1168 |
+
<?php wp_nonce_field('gadash_form','gadash_security'); ?>
|
1169 |
+
</td>
|
1170 |
+
</tr>
|
1171 |
+
<?php
|
1172 |
+
}
|
1173 |
+
if ( $options['ga_dash_token'] ) {
|
1174 |
+
?>
|
1175 |
+
<tr>
|
1176 |
+
<td colspan="2"><input type="submit" name="Reset" class="button button-secondary" value="<?php _e( "Clear Authorization", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Refresh" class="button button-secondary" value="<?php _e( "Refresh Properties", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
1177 |
+
</tr>
|
1178 |
+
<tr>
|
1179 |
+
<td colspan="2"><hr></td>
|
1180 |
+
</tr>
|
1181 |
+
<tr>
|
1182 |
+
<td colspan="2"><?php echo "<h2>" . __( "Properties/Views Settings", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1183 |
+
</tr>
|
1184 |
+
<?php
|
1185 |
+
if ( isset( $options['ga_dash_tableid_network'] ) ) {
|
1186 |
+
$options['ga_dash_tableid_network'] = json_decode( json_encode( $options['ga_dash_tableid_network'] ), false );
|
1187 |
+
}
|
1188 |
+
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
1189 |
+
?>
|
1190 |
+
<tr>
|
1191 |
+
<td class="gadwp-settings-title-s"><label for="ga_dash_tableid_network"><?php echo '<strong>'.$blog['domain'].$blog['path'].'</strong>: ';?></label></td>
|
1192 |
+
<td><select id="ga_dash_tableid_network" <?php disabled(!empty($options['ga_dash_profile_list']),false);?> name="options[ga_dash_tableid_network][<?php echo $blog['blog_id'];?>]">
|
1193 |
+
<?php
|
1194 |
+
if ( ! empty( $options['ga_dash_profile_list'] ) ) {
|
1195 |
+
foreach ( $options['ga_dash_profile_list'] as $items ) {
|
1196 |
+
if ( $items[3] ) {
|
1197 |
+
$temp_id = $blog['blog_id'];
|
1198 |
+
echo '<option value="' . esc_attr( $items[1] ) . '" ' . selected( $items[1], isset( $options['ga_dash_tableid_network']->$temp_id ) ? $options['ga_dash_tableid_network']->$temp_id : '', false );
|
1199 |
+
echo ' title="' . __( "View Name:", 'google-analytics-dashboard-for-wp' ) . ' ' . esc_attr( $items[0] ) . '">' . esc_html( GADWP_Tools::strip_protocol( $items[3] ) ) . ' ⇒ ' . esc_attr( $items[0] ) . '</option>';
|
1200 |
+
}
|
1201 |
+
}
|
1202 |
+
} else {
|
1203 |
+
echo '<option value="">' . __( "Property not found", 'google-analytics-dashboard-for-wp' ) . '</option>';
|
1204 |
+
}
|
1205 |
+
?>
|
1206 |
+
</select> <br /></td>
|
1207 |
+
</tr>
|
1208 |
+
<?php
|
1209 |
+
}
|
1210 |
+
?>
|
1211 |
+
<tr>
|
1212 |
+
<td colspan="2"><?php echo "<h2>" . __( "Automatic Updates", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1213 |
+
</tr>
|
1214 |
+
<tr>
|
1215 |
+
<td colspan="2" class="gadwp-settings-title">
|
1216 |
+
<div class="button-primary gadwp-settings-switchoo">
|
1217 |
+
<input type="checkbox" name="options[automatic_updates_minorversion]" value="1" class="gadwp-settings-switchoo-checkbox" id="automatic_updates_minorversion" <?php checked( $options['automatic_updates_minorversion'], 1 ); ?>> <label class="gadwp-settings-switchoo-label" for="automatic_updates_minorversion">
|
1218 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
1219 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
1220 |
+
</label>
|
1221 |
+
</div>
|
1222 |
+
<div class="switch-desc"><?php echo " ".__( "automatic updates for minor versions (security and maintenance releases only)", 'google-analytics-dashboard-for-wp' );?></div>
|
1223 |
+
</td>
|
1224 |
+
</tr>
|
1225 |
+
<tr>
|
1226 |
+
<td colspan="2"><hr><?php echo "<h2>" . __( "Exclude Tracking", 'google-analytics-dashboard-for-wp' ) . "</h2>"; ?></td>
|
1227 |
+
</tr>
|
1228 |
+
<tr>
|
1229 |
+
<td colspan="2" class="gadwp-settings-title">
|
1230 |
+
<div class="button-primary gadwp-settings-switchoo">
|
1231 |
+
<input type="checkbox" name="options[ga_dash_excludesa]" value="1" class="gadwp-settings-switchoo-checkbox" id="ga_dash_excludesa"<?php checked( $options['ga_dash_excludesa'], 1); ?>"> <label class="gadwp-settings-switchoo-label" for="ga_dash_excludesa">
|
1232 |
+
<div class="gadwp-settings-switchoo-inner"></div>
|
1233 |
+
<div class="gadwp-settings-switchoo-switch"></div>
|
1234 |
+
</label>
|
1235 |
+
</div>
|
1236 |
+
<div class="switch-desc"><?php echo " ".__("exclude Super Admin tracking for the entire network", 'google-analytics-dashboard-for-wp' );?></div>
|
1237 |
+
</td>
|
1238 |
+
</tr>
|
1239 |
+
<tr>
|
1240 |
+
<td colspan="2"><hr></td>
|
1241 |
+
</tr>
|
1242 |
+
<tr>
|
1243 |
+
<td colspan="2" class="submit"><input type="submit" name="Submit" class="button button-primary" value="<?php _e('Save Changes', 'google-analytics-dashboard-for-wp' ) ?>" /></td>
|
1244 |
+
</tr>
|
1245 |
+
<?php
|
1246 |
+
} else {
|
1247 |
+
?>
|
1248 |
+
<tr>
|
1249 |
+
<td colspan="2"><hr></td>
|
1250 |
+
</tr>
|
1251 |
+
<tr>
|
1252 |
+
<td colspan="2"><input type="submit" name="Authorize" class="button button-secondary" id="authorize" value="<?php _e( "Authorize Plugin", 'google-analytics-dashboard-for-wp' ); ?>" /> <input type="submit" name="Clear" class="button button-secondary" value="<?php _e( "Clear Cache", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
1253 |
+
</tr>
|
1254 |
+
<?php } //Network Mode check?>
|
1255 |
+
<tr>
|
1256 |
+
<td colspan="2"><hr></td>
|
1257 |
+
</tr>
|
1258 |
+
</table>
|
1259 |
+
</form>
|
1260 |
+
<?php
|
1261 |
+
self::output_sidebar();
|
1262 |
+
return;
|
1263 |
+
}
|
1264 |
+
?>
|
1265 |
+
</table>
|
1266 |
+
</form>
|
1267 |
+
<?php
|
1268 |
+
}
|
1269 |
+
self::output_sidebar();
|
1270 |
+
}
|
1271 |
+
|
1272 |
+
public static function output_sidebar() {
|
1273 |
+
global $wp_version;
|
1274 |
+
|
1275 |
+
$gadwp = GADWP();
|
1276 |
+
?>
|
1277 |
+
</div>
|
1278 |
+
</div>
|
1279 |
+
</div>
|
1280 |
+
<div id="postbox-container-1" class="postbox-container">
|
1281 |
+
<div class="meta-box-sortables">
|
1282 |
+
<div class="postbox">
|
1283 |
+
<h3>
|
1284 |
+
<span><?php _e("Setup Tutorial & Demo",'google-analytics-dashboard-for-wp') ?></span>
|
1285 |
+
</h3>
|
1286 |
+
<div class="inside">
|
1287 |
+
<a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=video&utm_campaign=gadwp" target="_blank"><img src="<?php echo plugins_url( 'images/google-analytics-dashboard.png' , __FILE__ );?>" width="100%" alt="" /></a>
|
1288 |
+
</div>
|
1289 |
+
</div>
|
1290 |
+
<div class="postbox">
|
1291 |
+
<h3>
|
1292 |
+
<span><?php _e("Follow & Review",'google-analytics-dashboard-for-wp')?></span>
|
1293 |
+
</h3>
|
1294 |
+
<div class="inside">
|
1295 |
+
<div class="gadash-desc">
|
1296 |
+
<div style="margin-left: -10px;">
|
1297 |
+
<div class="g-page" data-width="273" data-href="//plus.google.com/+Deconfcom" data-layout="landscape" data-showtagline="false" data-showcoverphoto="false" data-rel="publisher"></div>
|
1298 |
+
</div>
|
1299 |
+
<script type="text/javascript">
|
1300 |
+
(function() {
|
1301 |
+
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
|
1302 |
+
po.src = 'https://apis.google.com/js/platform.js';
|
1303 |
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
|
1304 |
+
})();
|
1305 |
+
</script>
|
1306 |
+
</div>
|
1307 |
+
<br />
|
1308 |
+
<div class="gadash-desc">
|
1309 |
+
<a href="https://twitter.com/deconfcom" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @deconfcom</a>
|
1310 |
+
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
|
1311 |
+
</div>
|
1312 |
+
<br />
|
1313 |
+
<div class="gadash-title">
|
1314 |
+
<a href="http://wordpress.org/support/view/plugin-reviews/google-analytics-dashboard-for-wp#plugin-info"><img src="<?php echo plugins_url( 'images/star.png' , __FILE__ ); ?>" /></a>
|
1315 |
+
</div>
|
1316 |
+
<div class="gadash-desc">
|
1317 |
+
<?php printf(__('Your feedback and review are both important, %s!', 'google-analytics-dashboard-for-wp'), sprintf('<a href="http://wordpress.org/support/view/plugin-reviews/google-analytics-dashboard-for-wp#plugin-info">%s</a>', __('rate this plugin', 'google-analytics-dashboard-for-wp')));?>
|
1318 |
+
</div>
|
1319 |
+
</div>
|
1320 |
+
</div>
|
1321 |
+
<div class="postbox">
|
1322 |
+
<h3>
|
1323 |
+
<span><?php _e("Further Reading",'google-analytics-dashboard-for-wp')?></span>
|
1324 |
+
</h3>
|
1325 |
+
<div class="inside">
|
1326 |
+
<div class="gadash-title">
|
1327 |
+
<a href="https://deconf.com/clicky-web-analytics-review/?utm_source=gadwp_config&utm_medium=link&utm_content=clicky&utm_campaign=gadwp"><img src="<?php echo plugins_url( 'images/clicky.png' , __FILE__ ); ?>" /></a>
|
1328 |
+
</div>
|
1329 |
+
<div class="gadash-desc">
|
1330 |
+
<?php printf(__('%s service with users tracking at IP level.', 'google-analytics-dashboard-for-wp'), sprintf('<a href="https://deconf.com/clicky-web-analytics-review/?utm_source=gadwp_config&utm_medium=link&utm_content=clicky&utm_campaign=gadwp">%s</a>', __('Web Analytics', 'google-analytics-dashboard-for-wp')));?>
|
1331 |
+
</div>
|
1332 |
+
<br />
|
1333 |
+
<div class="gadash-title">
|
1334 |
+
<a href="https://deconf.com/move-website-https-ssl/?utm_source=gadwp_config&utm_medium=link&utm_content=ssl&utm_campaign=gadwp"><img src="<?php echo plugins_url( 'images/ssl.png' , __FILE__ ); ?>" /></a>
|
1335 |
+
</div>
|
1336 |
+
<div class="gadash-desc">
|
1337 |
+
<?php printf(__('%s by moving your website to HTTPS/SSL.', 'google-analytics-dashboard-for-wp'), sprintf('<a href="https://deconf.com/move-website-https-ssl/?utm_source=gadwp_config&utm_medium=link&utm_content=ssl&utm_campaign=gadwp">%s</a>', __('Improve search rankings', 'google-analytics-dashboard-for-wp')));?>
|
1338 |
+
</div>
|
1339 |
+
<br />
|
1340 |
+
<div class="gadash-title">
|
1341 |
+
<a href="https://deconf.com/wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=plugins&utm_campaign=gadwp"><img src="<?php echo plugins_url( 'images/wp.png' , __FILE__ ); ?>" /></a>
|
1342 |
+
</div>
|
1343 |
+
<div class="gadash-desc">
|
1344 |
+
<?php printf(__('Other %s written by the same author', 'google-analytics-dashboard-for-wp'), sprintf('<a href="https://deconf.com/wordpress/?utm_source=gadwp_config&utm_medium=link&utm_content=plugins&utm_campaign=gadwp">%s</a>', __('WordPress Plugins', 'google-analytics-dashboard-for-wp')));?>
|
1345 |
+
</div>
|
1346 |
+
</div>
|
1347 |
+
</div>
|
1348 |
+
</div>
|
1349 |
+
</div>
|
1350 |
+
</div>
|
1351 |
+
</div>
|
1352 |
+
<?php
|
1353 |
+
//Dismiss the admin update notice
|
1354 |
+
if ( version_compare( $wp_version, '4.2', '<' ) && current_user_can('manage_options') ) {
|
1355 |
+
delete_option('gadwp_got_updated');
|
1356 |
+
}
|
1357 |
+
}
|
1358 |
+
}
|
admin/setup.php
CHANGED
@@ -1,357 +1,357 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Backend_Setup' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Backend_Setup {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
// Styles & Scripts
|
24 |
-
add_action( 'admin_enqueue_scripts', array( $this, 'load_styles_scripts' ) );
|
25 |
-
// Site Menu
|
26 |
-
add_action( 'admin_menu', array( $this, 'site_menu' ) );
|
27 |
-
// Network Menu
|
28 |
-
add_action( 'network_admin_menu', array( $this, 'network_menu' ) );
|
29 |
-
// Settings link
|
30 |
-
add_filter( "plugin_action_links_" . plugin_basename( GADWP_DIR . 'gadwp.php' ), array( $this, 'settings_link' ) );
|
31 |
-
// Updated admin notice
|
32 |
-
add_action( 'admin_notices', array( $this, 'admin_notice' ) );
|
33 |
-
}
|
34 |
-
|
35 |
-
/**
|
36 |
-
* Add Site Menu
|
37 |
-
*/
|
38 |
-
public function site_menu() {
|
39 |
-
global $wp_version;
|
40 |
-
if ( current_user_can( 'manage_options' ) ) {
|
41 |
-
include ( GADWP_DIR . 'admin/settings.php' );
|
42 |
-
add_menu_page( __( "Google Analytics", 'google-analytics-dashboard-for-wp' ), __( "Google Analytics", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_settings', array( 'GADWP_Settings', 'general_settings' ), version_compare( $wp_version, '3.8.0', '>=' ) ? 'dashicons-chart-area' : GADWP_URL . 'admin/images/gadash-icon.png' );
|
43 |
-
add_submenu_page( 'gadash_settings', __( "General Settings", 'google-analytics-dashboard-for-wp' ), __( "General Settings", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_settings', array( 'GADWP_Settings', 'general_settings' ) );
|
44 |
-
add_submenu_page( 'gadash_settings', __( "Backend Settings", 'google-analytics-dashboard-for-wp' ), __( "Backend Settings", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_backend_settings', array( 'GADWP_Settings', 'backend_settings' ) );
|
45 |
-
add_submenu_page( 'gadash_settings', __( "Frontend Settings", 'google-analytics-dashboard-for-wp' ), __( "Frontend Settings", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_frontend_settings', array( 'GADWP_Settings', 'frontend_settings' ) );
|
46 |
-
add_submenu_page( 'gadash_settings', __( "Tracking Code", 'google-analytics-dashboard-for-wp' ), __( "Tracking Code", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_tracking_settings', array( 'GADWP_Settings', 'tracking_settings' ) );
|
47 |
-
add_submenu_page( 'gadash_settings', __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_errors_debugging', array( 'GADWP_Settings', 'errors_debugging' ) );
|
48 |
-
}
|
49 |
-
}
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Add Network Menu
|
53 |
-
*/
|
54 |
-
public function network_menu() {
|
55 |
-
global $wp_version;
|
56 |
-
if ( current_user_can( 'manage_netwrok' ) ) {
|
57 |
-
include ( GADWP_DIR . 'admin/settings.php' );
|
58 |
-
add_menu_page( __( "Google Analytics", 'google-analytics-dashboard-for-wp' ), "Google Analytics", 'manage_netwrok', 'gadash_settings', array( 'GADWP_Settings', 'general_settings_network' ), version_compare( $wp_version, '3.8.0', '>=' ) ? 'dashicons-chart-area' : GADWP_URL . 'admin/images/gadash-icon.png' );
|
59 |
-
add_submenu_page( 'gadash_settings', __( "General Settings", 'google-analytics-dashboard-for-wp' ), __( "General Settings", 'google-analytics-dashboard-for-wp' ), 'manage_netwrok', 'gadash_settings', array( 'GADWP_Settings', 'general_settings_network' ) );
|
60 |
-
add_submenu_page( 'gadash_settings', __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), 'manage_network', 'gadash_errors_debugging', array( 'GADWP_Settings', 'errors_debugging' ) );
|
61 |
-
}
|
62 |
-
}
|
63 |
-
|
64 |
-
/**
|
65 |
-
* Styles & Scripts conditional loading (based on current URI)
|
66 |
-
*
|
67 |
-
* @param
|
68 |
-
* $hook
|
69 |
-
*/
|
70 |
-
public function load_styles_scripts( $hook ) {
|
71 |
-
$new_hook = explode( '_page_', $hook );
|
72 |
-
|
73 |
-
if ( isset( $new_hook[1] ) ) {
|
74 |
-
$new_hook = '_page_' . $new_hook[1];
|
75 |
-
} else {
|
76 |
-
$new_hook = $hook;
|
77 |
-
}
|
78 |
-
|
79 |
-
/*
|
80 |
-
* GADWP main stylesheet
|
81 |
-
*/
|
82 |
-
wp_enqueue_style( 'gadwp', GADWP_URL . 'admin/css/gadwp.css', null, GADWP_CURRENT_VERSION );
|
83 |
-
|
84 |
-
/*
|
85 |
-
* GADWP UI
|
86 |
-
*/
|
87 |
-
|
88 |
-
if ( GADWP_Tools::get_cache( 'gapi_errors' ) ) {
|
89 |
-
$ed_bubble = '!';
|
90 |
-
} else {
|
91 |
-
$ed_bubble = '';
|
92 |
-
}
|
93 |
-
|
94 |
-
wp_enqueue_script( 'gadwp-backend-ui', plugins_url( 'js/ui.js', __FILE__ ), array( 'jquery' ), GADWP_CURRENT_VERSION, true );
|
95 |
-
|
96 |
-
/* @formatter:off */
|
97 |
-
wp_localize_script( 'gadwp-backend-ui', 'gadwp_ui_data', array(
|
98 |
-
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
99 |
-
'security' => wp_create_nonce( 'gadwp_dismiss_notices' ),
|
100 |
-
'ed_bubble' => $ed_bubble,
|
101 |
-
)
|
102 |
-
);
|
103 |
-
/* @formatter:on */
|
104 |
-
|
105 |
-
if ( $this->gadwp->config->options['switch_profile'] && count( $this->gadwp->config->options['ga_dash_profile_list'] ) > 1 ) {
|
106 |
-
$views = array();
|
107 |
-
foreach ( $this->gadwp->config->options['ga_dash_profile_list'] as $items ) {
|
108 |
-
if ( $items[3] ) {
|
109 |
-
$views[$items[1]] = esc_js( GADWP_Tools::strip_protocol( $items[3] ) ); // . ' ⇒ ' . $items[0] );
|
110 |
-
}
|
111 |
-
}
|
112 |
-
} else {
|
113 |
-
$views = false;
|
114 |
-
}
|
115 |
-
|
116 |
-
/*
|
117 |
-
* Main Dashboard Widgets Styles & Scripts
|
118 |
-
*/
|
119 |
-
$widgets_hooks = array( 'index.php' );
|
120 |
-
|
121 |
-
if ( in_array( $new_hook, $widgets_hooks ) ) {
|
122 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && $this->gadwp->config->options['dashboard_widget'] ) {
|
123 |
-
|
124 |
-
if ( $this->gadwp->config->options['ga_target_geomap'] ) {
|
125 |
-
$country_codes = GADWP_Tools::get_countrycodes();
|
126 |
-
if ( isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
|
127 |
-
$region = $this->gadwp->config->options['ga_target_geomap'];
|
128 |
-
} else {
|
129 |
-
$region = false;
|
130 |
-
}
|
131 |
-
} else {
|
132 |
-
$region = false;
|
133 |
-
}
|
134 |
-
|
135 |
-
wp_enqueue_style( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.css', null, GADWP_CURRENT_VERSION );
|
136 |
-
|
137 |
-
wp_enqueue_style( 'gadwp-backend-item-reports', GADWP_URL . 'admin/css/admin-widgets.css', null, GADWP_CURRENT_VERSION );
|
138 |
-
|
139 |
-
wp_register_style( 'jquery-ui-tooltip-html', GADWP_URL . 'common/realtime/jquery.ui.tooltip.html.css' );
|
140 |
-
|
141 |
-
wp_enqueue_style( 'jquery-ui-tooltip-html' );
|
142 |
-
|
143 |
-
wp_register_script( 'jquery-ui-tooltip-html', GADWP_URL . 'common/realtime/jquery.ui.tooltip.html.js' );
|
144 |
-
|
145 |
-
wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
146 |
-
|
147 |
-
wp_enqueue_script( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
148 |
-
|
149 |
-
wp_enqueue_script( 'gadwp-backend-dashboard-reports', GADWP_URL . 'common/js/reports.js', array( 'jquery', 'googlecharts', 'gadwp-nprogress', 'jquery-ui-tooltip', 'jquery-ui-core', 'jquery-ui-position', 'jquery-ui-tooltip-html' ), GADWP_CURRENT_VERSION, true );
|
150 |
-
|
151 |
-
/* @formatter:off */
|
152 |
-
wp_localize_script( 'gadwp-backend-dashboard-reports', 'gadwpItemData', array(
|
153 |
-
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
154 |
-
'security' => wp_create_nonce( 'gadwp_backend_item_reports' ),
|
155 |
-
'dateList' => array(
|
156 |
-
'realtime' => __( "Real-Time", 'google-analytics-dashboard-for-wp' ),
|
157 |
-
'today' => __( "Today", 'google-analytics-dashboard-for-wp' ),
|
158 |
-
'yesterday' => __( "Yesterday", 'google-analytics-dashboard-for-wp' ),
|
159 |
-
'7daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 7 ),
|
160 |
-
'14daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 14 ),
|
161 |
-
'30daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 30 ),
|
162 |
-
'90daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 90 ),
|
163 |
-
'365daysAgo' => sprintf( _n( "%s Year", "%s Years", 1, 'google-analytics-dashboard-for-wp' ), __('One', 'google-analytics-dashboard-for-wp') ),
|
164 |
-
'1095daysAgo' => sprintf( _n( "%s Year", "%s Years", 3, 'google-analytics-dashboard-for-wp' ), __('Three', 'google-analytics-dashboard-for-wp') ),
|
165 |
-
),
|
166 |
-
'reportList' => array(
|
167 |
-
'sessions' => __( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
168 |
-
'users' => __( "Users", 'google-analytics-dashboard-for-wp' ),
|
169 |
-
'organicSearches' => __( "Organic", 'google-analytics-dashboard-for-wp' ),
|
170 |
-
'pageviews' => __( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
171 |
-
'visitBounceRate' => __( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
172 |
-
'locations' => __( "Location", 'google-analytics-dashboard-for-wp' ),
|
173 |
-
'contentpages' => __( "Pages", 'google-analytics-dashboard-for-wp' ),
|
174 |
-
'referrers' => __( "Referrers", 'google-analytics-dashboard-for-wp' ),
|
175 |
-
'searches' => __( "Searches", 'google-analytics-dashboard-for-wp' ),
|
176 |
-
'trafficdetails' => __( "Traffic", 'google-analytics-dashboard-for-wp' ),
|
177 |
-
'technologydetails' => __( "Technology", 'google-analytics-dashboard-for-wp' ),
|
178 |
-
'404errors' => __( "404 Errors", 'google-analytics-dashboard-for-wp' ),
|
179 |
-
),
|
180 |
-
'i18n' => array(
|
181 |
-
__( "A JavaScript Error is blocking plugin resources!", 'google-analytics-dashboard-for-wp' ), //0
|
182 |
-
__( "Traffic Mediums", 'google-analytics-dashboard-for-wp' ),
|
183 |
-
__( "Visitor Type", 'google-analytics-dashboard-for-wp' ),
|
184 |
-
__( "Search Engines", 'google-analytics-dashboard-for-wp' ),
|
185 |
-
__( "Social Networks", 'google-analytics-dashboard-for-wp' ),
|
186 |
-
__( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
187 |
-
__( "Users", 'google-analytics-dashboard-for-wp' ),
|
188 |
-
__( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
189 |
-
__( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
190 |
-
__( "Organic Search", 'google-analytics-dashboard-for-wp' ),
|
191 |
-
__( "Pages/Session", 'google-analytics-dashboard-for-wp' ),
|
192 |
-
__( "Invalid response", 'google-analytics-dashboard-for-wp' ),
|
193 |
-
__( "Not enough data collected", 'google-analytics-dashboard-for-wp' ),
|
194 |
-
__( "This report is unavailable", 'google-analytics-dashboard-for-wp' ),
|
195 |
-
__( "report generated by", 'google-analytics-dashboard-for-wp' ), //14
|
196 |
-
__( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . ' <a href="' . menu_page_url( 'gadash_settings', false ) . '">' . __( "authorize the plugin", 'google-analytics-dashboard-for-wp' ) . '</a>.',
|
197 |
-
__( "Browser", 'google-analytics-dashboard-for-wp' ), //16
|
198 |
-
__( "Operating System", 'google-analytics-dashboard-for-wp' ),
|
199 |
-
__( "Screen Resolution", 'google-analytics-dashboard-for-wp' ),
|
200 |
-
__( "Mobile Brand", 'google-analytics-dashboard-for-wp' ),
|
201 |
-
__( "REFERRALS", 'google-analytics-dashboard-for-wp' ), //20
|
202 |
-
__( "KEYWORDS", 'google-analytics-dashboard-for-wp' ),
|
203 |
-
__( "SOCIAL", 'google-analytics-dashboard-for-wp' ),
|
204 |
-
__( "CAMPAIGN", 'google-analytics-dashboard-for-wp' ),
|
205 |
-
__( "DIRECT", 'google-analytics-dashboard-for-wp' ),
|
206 |
-
__( "NEW", 'google-analytics-dashboard-for-wp' ), //25
|
207 |
-
),
|
208 |
-
'rtLimitPages' => $this->gadwp->config->options['ga_realtime_pages'],
|
209 |
-
'colorVariations' => GADWP_Tools::variations( $this->gadwp->config->options['ga_dash_style'] ),
|
210 |
-
'region' => $region,
|
211 |
-
'mapsApiKey' => $this->gadwp->config->options['maps_api_key'],
|
212 |
-
'language' => get_bloginfo( 'language' ),
|
213 |
-
'viewList' => $views,
|
214 |
-
'scope' => 'admin-widgets',
|
215 |
-
)
|
216 |
-
);
|
217 |
-
/* @formatter:on */
|
218 |
-
}
|
219 |
-
}
|
220 |
-
|
221 |
-
/*
|
222 |
-
* Posts/Pages List Styles & Scripts
|
223 |
-
*/
|
224 |
-
$contentstats_hooks = array( 'edit.php' );
|
225 |
-
if ( in_array( $hook, $contentstats_hooks ) ) {
|
226 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && $this->gadwp->config->options['backend_item_reports'] ) {
|
227 |
-
|
228 |
-
if ( $this->gadwp->config->options['ga_target_geomap'] ) {
|
229 |
-
$country_codes = GADWP_Tools::get_countrycodes();
|
230 |
-
if ( isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
|
231 |
-
$region = $this->gadwp->config->options['ga_target_geomap'];
|
232 |
-
} else {
|
233 |
-
$region = false;
|
234 |
-
}
|
235 |
-
} else {
|
236 |
-
$region = false;
|
237 |
-
}
|
238 |
-
|
239 |
-
wp_enqueue_style( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.css', null, GADWP_CURRENT_VERSION );
|
240 |
-
|
241 |
-
wp_enqueue_style( 'gadwp-backend-item-reports', GADWP_URL . 'admin/css/item-reports.css', null, GADWP_CURRENT_VERSION );
|
242 |
-
|
243 |
-
wp_enqueue_style( "wp-jquery-ui-dialog" );
|
244 |
-
|
245 |
-
wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
246 |
-
|
247 |
-
wp_enqueue_script( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
248 |
-
|
249 |
-
wp_enqueue_script( 'gadwp-backend-item-reports', GADWP_URL . 'common/js/reports.js', array( 'gadwp-nprogress', 'googlecharts', 'jquery', 'jquery-ui-dialog' ), GADWP_CURRENT_VERSION, true );
|
250 |
-
|
251 |
-
/* @formatter:off */
|
252 |
-
wp_localize_script( 'gadwp-backend-item-reports', 'gadwpItemData', array(
|
253 |
-
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
254 |
-
'security' => wp_create_nonce( 'gadwp_backend_item_reports' ),
|
255 |
-
'dateList' => array(
|
256 |
-
'today' => __( "Today", 'google-analytics-dashboard-for-wp' ),
|
257 |
-
'yesterday' => __( "Yesterday", 'google-analytics-dashboard-for-wp' ),
|
258 |
-
'7daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 7 ),
|
259 |
-
'14daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 14 ),
|
260 |
-
'30daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 30 ),
|
261 |
-
'90daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 90 ),
|
262 |
-
'365daysAgo' => sprintf( _n( "%s Year", "%s Years", 1, 'google-analytics-dashboard-for-wp' ), __('One', 'google-analytics-dashboard-for-wp') ),
|
263 |
-
'1095daysAgo' => sprintf( _n( "%s Year", "%s Years", 3, 'google-analytics-dashboard-for-wp' ), __('Three', 'google-analytics-dashboard-for-wp') ),
|
264 |
-
),
|
265 |
-
'reportList' => array(
|
266 |
-
'sessions' => __( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
267 |
-
'users' => __( "Users", 'google-analytics-dashboard-for-wp' ),
|
268 |
-
'organicSearches' => __( "Organic", 'google-analytics-dashboard-for-wp' ),
|
269 |
-
'pageviews' => __( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
270 |
-
'visitBounceRate' => __( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
271 |
-
'locations' => __( "Location", 'google-analytics-dashboard-for-wp' ),
|
272 |
-
'referrers' => __( "Referrers", 'google-analytics-dashboard-for-wp' ),
|
273 |
-
'searches' => __( "Searches", 'google-analytics-dashboard-for-wp' ),
|
274 |
-
'trafficdetails' => __( "Traffic", 'google-analytics-dashboard-for-wp' ),
|
275 |
-
'technologydetails' => __( "Technology", 'google-analytics-dashboard-for-wp' ),
|
276 |
-
),
|
277 |
-
'i18n' => array(
|
278 |
-
__( "A JavaScript Error is blocking plugin resources!", 'google-analytics-dashboard-for-wp' ), //0
|
279 |
-
__( "Traffic Mediums", 'google-analytics-dashboard-for-wp' ),
|
280 |
-
__( "Visitor Type", 'google-analytics-dashboard-for-wp' ),
|
281 |
-
__( "Social Networks", 'google-analytics-dashboard-for-wp' ),
|
282 |
-
__( "Search Engines", 'google-analytics-dashboard-for-wp' ),
|
283 |
-
__( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
284 |
-
__( "Users", 'google-analytics-dashboard-for-wp' ),
|
285 |
-
__( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
286 |
-
__( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
287 |
-
__( "Organic Search", 'google-analytics-dashboard-for-wp' ),
|
288 |
-
__( "Pages/Session", 'google-analytics-dashboard-for-wp' ),
|
289 |
-
__( "Invalid response", 'google-analytics-dashboard-for-wp' ),
|
290 |
-
__( "Not enough data collected", 'google-analytics-dashboard-for-wp' ),
|
291 |
-
__( "This report is unavailable", 'google-analytics-dashboard-for-wp' ),
|
292 |
-
__( "report generated by", 'google-analytics-dashboard-for-wp' ), //14
|
293 |
-
__( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . ' <a href="' . menu_page_url( 'gadash_settings', false ) . '">' . __( "authorize the plugin", 'google-analytics-dashboard-for-wp' ) . '</a>.',
|
294 |
-
__( "Browser", 'google-analytics-dashboard-for-wp' ), //16
|
295 |
-
__( "Operating System", 'google-analytics-dashboard-for-wp' ),
|
296 |
-
__( "Screen Resolution", 'google-analytics-dashboard-for-wp' ),
|
297 |
-
__( "Mobile Brand", 'google-analytics-dashboard-for-wp' ),
|
298 |
-
),
|
299 |
-
'colorVariations' => GADWP_Tools::variations( $this->gadwp->config->options['ga_dash_style'] ),
|
300 |
-
'region' => $region,
|
301 |
-
'mapsApiKey' => $this->gadwp->config->options['maps_api_key'],
|
302 |
-
'language' => get_bloginfo( 'language' ),
|
303 |
-
'viewList' => false,
|
304 |
-
'scope' => 'admin-item',
|
305 |
-
)
|
306 |
-
);
|
307 |
-
/* @formatter:on */
|
308 |
-
}
|
309 |
-
}
|
310 |
-
|
311 |
-
/*
|
312 |
-
* Settings Styles & Scripts
|
313 |
-
*/
|
314 |
-
$settings_hooks = array( '_page_gadash_settings', '_page_gadash_backend_settings', '_page_gadash_frontend_settings', '_page_gadash_tracking_settings', '_page_gadash_errors_debugging' );
|
315 |
-
|
316 |
-
if ( in_array( $new_hook, $settings_hooks ) ) {
|
317 |
-
wp_enqueue_style( 'wp-color-picker' );
|
318 |
-
wp_enqueue_script( 'wp-color-picker' );
|
319 |
-
wp_enqueue_script( 'wp-color-picker-script-handle', plugins_url( 'js/wp-color-picker-script.js', __FILE__ ), array( 'wp-color-picker' ), false, true );
|
320 |
-
wp_enqueue_script( 'gadwp-settings', plugins_url( 'js/settings.js', __FILE__ ), array( 'jquery' ), GADWP_CURRENT_VERSION, true );
|
321 |
-
}
|
322 |
-
}
|
323 |
-
|
324 |
-
/**
|
325 |
-
* Add "Settings" link in Plugins List
|
326 |
-
*
|
327 |
-
* @param
|
328 |
-
* $links
|
329 |
-
* @return array
|
330 |
-
*/
|
331 |
-
public function settings_link( $links ) {
|
332 |
-
$settings_link = '<a href="' . esc_url( get_admin_url( null, 'admin.php?page=gadash_settings' ) ) . '">' . __( "Settings", 'google-analytics-dashboard-for-wp' ) . '</a>';
|
333 |
-
array_unshift( $links, $settings_link );
|
334 |
-
return $links;
|
335 |
-
}
|
336 |
-
|
337 |
-
/**
|
338 |
-
* Add an admin notice after a manual or atuomatic update
|
339 |
-
*/
|
340 |
-
function admin_notice() {
|
341 |
-
$currentScreen = get_current_screen();
|
342 |
-
|
343 |
-
if ( ! current_user_can( 'manage_options' ) || $currentScreen->base != 'dashboard' ) {
|
344 |
-
return;
|
345 |
-
}
|
346 |
-
|
347 |
-
if ( get_option( 'gadwp_got_updated' ) ) :
|
348 |
-
?>
|
349 |
-
<div id="gadwp-notice" class="notice is-dismissible">
|
350 |
-
<p><?php echo sprintf( __('Google Analytics Dashboard for WP has been updated to version %s.', 'google-analytics-dashboard-for-wp' ), GADWP_CURRENT_VERSION).' '.sprintf( __('For details, check out %1$s and %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf(' <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_notice&utm_medium=link&utm_content=release_notice&utm_campaign=gadwp">%s</a> ', __('the documentation page', 'google-analytics-dashboard-for-wp') ), sprintf(' <a href="%1$s">%2$s</a>', esc_url( get_admin_url( null, 'admin.php?page=gadash_settings' ) ), __('the plugin's settings page', 'google-analytics-dashboard-for-wp') ) ); ?></p>
|
351 |
-
</div>
|
352 |
-
|
353 |
-
<?php
|
354 |
-
endif;
|
355 |
-
}
|
356 |
-
}
|
357 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Backend_Setup' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Backend_Setup {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
// Styles & Scripts
|
24 |
+
add_action( 'admin_enqueue_scripts', array( $this, 'load_styles_scripts' ) );
|
25 |
+
// Site Menu
|
26 |
+
add_action( 'admin_menu', array( $this, 'site_menu' ) );
|
27 |
+
// Network Menu
|
28 |
+
add_action( 'network_admin_menu', array( $this, 'network_menu' ) );
|
29 |
+
// Settings link
|
30 |
+
add_filter( "plugin_action_links_" . plugin_basename( GADWP_DIR . 'gadwp.php' ), array( $this, 'settings_link' ) );
|
31 |
+
// Updated admin notice
|
32 |
+
add_action( 'admin_notices', array( $this, 'admin_notice' ) );
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Add Site Menu
|
37 |
+
*/
|
38 |
+
public function site_menu() {
|
39 |
+
global $wp_version;
|
40 |
+
if ( current_user_can( 'manage_options' ) ) {
|
41 |
+
include ( GADWP_DIR . 'admin/settings.php' );
|
42 |
+
add_menu_page( __( "Google Analytics", 'google-analytics-dashboard-for-wp' ), __( "Google Analytics", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_settings', array( 'GADWP_Settings', 'general_settings' ), version_compare( $wp_version, '3.8.0', '>=' ) ? 'dashicons-chart-area' : GADWP_URL . 'admin/images/gadash-icon.png' );
|
43 |
+
add_submenu_page( 'gadash_settings', __( "General Settings", 'google-analytics-dashboard-for-wp' ), __( "General Settings", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_settings', array( 'GADWP_Settings', 'general_settings' ) );
|
44 |
+
add_submenu_page( 'gadash_settings', __( "Backend Settings", 'google-analytics-dashboard-for-wp' ), __( "Backend Settings", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_backend_settings', array( 'GADWP_Settings', 'backend_settings' ) );
|
45 |
+
add_submenu_page( 'gadash_settings', __( "Frontend Settings", 'google-analytics-dashboard-for-wp' ), __( "Frontend Settings", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_frontend_settings', array( 'GADWP_Settings', 'frontend_settings' ) );
|
46 |
+
add_submenu_page( 'gadash_settings', __( "Tracking Code", 'google-analytics-dashboard-for-wp' ), __( "Tracking Code", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_tracking_settings', array( 'GADWP_Settings', 'tracking_settings' ) );
|
47 |
+
add_submenu_page( 'gadash_settings', __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), 'manage_options', 'gadash_errors_debugging', array( 'GADWP_Settings', 'errors_debugging' ) );
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Add Network Menu
|
53 |
+
*/
|
54 |
+
public function network_menu() {
|
55 |
+
global $wp_version;
|
56 |
+
if ( current_user_can( 'manage_netwrok' ) ) {
|
57 |
+
include ( GADWP_DIR . 'admin/settings.php' );
|
58 |
+
add_menu_page( __( "Google Analytics", 'google-analytics-dashboard-for-wp' ), "Google Analytics", 'manage_netwrok', 'gadash_settings', array( 'GADWP_Settings', 'general_settings_network' ), version_compare( $wp_version, '3.8.0', '>=' ) ? 'dashicons-chart-area' : GADWP_URL . 'admin/images/gadash-icon.png' );
|
59 |
+
add_submenu_page( 'gadash_settings', __( "General Settings", 'google-analytics-dashboard-for-wp' ), __( "General Settings", 'google-analytics-dashboard-for-wp' ), 'manage_netwrok', 'gadash_settings', array( 'GADWP_Settings', 'general_settings_network' ) );
|
60 |
+
add_submenu_page( 'gadash_settings', __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), __( "Errors & Debug", 'google-analytics-dashboard-for-wp' ), 'manage_network', 'gadash_errors_debugging', array( 'GADWP_Settings', 'errors_debugging' ) );
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Styles & Scripts conditional loading (based on current URI)
|
66 |
+
*
|
67 |
+
* @param
|
68 |
+
* $hook
|
69 |
+
*/
|
70 |
+
public function load_styles_scripts( $hook ) {
|
71 |
+
$new_hook = explode( '_page_', $hook );
|
72 |
+
|
73 |
+
if ( isset( $new_hook[1] ) ) {
|
74 |
+
$new_hook = '_page_' . $new_hook[1];
|
75 |
+
} else {
|
76 |
+
$new_hook = $hook;
|
77 |
+
}
|
78 |
+
|
79 |
+
/*
|
80 |
+
* GADWP main stylesheet
|
81 |
+
*/
|
82 |
+
wp_enqueue_style( 'gadwp', GADWP_URL . 'admin/css/gadwp.css', null, GADWP_CURRENT_VERSION );
|
83 |
+
|
84 |
+
/*
|
85 |
+
* GADWP UI
|
86 |
+
*/
|
87 |
+
|
88 |
+
if ( GADWP_Tools::get_cache( 'gapi_errors' ) ) {
|
89 |
+
$ed_bubble = '!';
|
90 |
+
} else {
|
91 |
+
$ed_bubble = '';
|
92 |
+
}
|
93 |
+
|
94 |
+
wp_enqueue_script( 'gadwp-backend-ui', plugins_url( 'js/ui.js', __FILE__ ), array( 'jquery' ), GADWP_CURRENT_VERSION, true );
|
95 |
+
|
96 |
+
/* @formatter:off */
|
97 |
+
wp_localize_script( 'gadwp-backend-ui', 'gadwp_ui_data', array(
|
98 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
99 |
+
'security' => wp_create_nonce( 'gadwp_dismiss_notices' ),
|
100 |
+
'ed_bubble' => $ed_bubble,
|
101 |
+
)
|
102 |
+
);
|
103 |
+
/* @formatter:on */
|
104 |
+
|
105 |
+
if ( $this->gadwp->config->options['switch_profile'] && count( $this->gadwp->config->options['ga_dash_profile_list'] ) > 1 ) {
|
106 |
+
$views = array();
|
107 |
+
foreach ( $this->gadwp->config->options['ga_dash_profile_list'] as $items ) {
|
108 |
+
if ( $items[3] ) {
|
109 |
+
$views[$items[1]] = esc_js( GADWP_Tools::strip_protocol( $items[3] ) ); // . ' ⇒ ' . $items[0] );
|
110 |
+
}
|
111 |
+
}
|
112 |
+
} else {
|
113 |
+
$views = false;
|
114 |
+
}
|
115 |
+
|
116 |
+
/*
|
117 |
+
* Main Dashboard Widgets Styles & Scripts
|
118 |
+
*/
|
119 |
+
$widgets_hooks = array( 'index.php' );
|
120 |
+
|
121 |
+
if ( in_array( $new_hook, $widgets_hooks ) ) {
|
122 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && $this->gadwp->config->options['dashboard_widget'] ) {
|
123 |
+
|
124 |
+
if ( $this->gadwp->config->options['ga_target_geomap'] ) {
|
125 |
+
$country_codes = GADWP_Tools::get_countrycodes();
|
126 |
+
if ( isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
|
127 |
+
$region = $this->gadwp->config->options['ga_target_geomap'];
|
128 |
+
} else {
|
129 |
+
$region = false;
|
130 |
+
}
|
131 |
+
} else {
|
132 |
+
$region = false;
|
133 |
+
}
|
134 |
+
|
135 |
+
wp_enqueue_style( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.css', null, GADWP_CURRENT_VERSION );
|
136 |
+
|
137 |
+
wp_enqueue_style( 'gadwp-backend-item-reports', GADWP_URL . 'admin/css/admin-widgets.css', null, GADWP_CURRENT_VERSION );
|
138 |
+
|
139 |
+
wp_register_style( 'jquery-ui-tooltip-html', GADWP_URL . 'common/realtime/jquery.ui.tooltip.html.css' );
|
140 |
+
|
141 |
+
wp_enqueue_style( 'jquery-ui-tooltip-html' );
|
142 |
+
|
143 |
+
wp_register_script( 'jquery-ui-tooltip-html', GADWP_URL . 'common/realtime/jquery.ui.tooltip.html.js' );
|
144 |
+
|
145 |
+
wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
146 |
+
|
147 |
+
wp_enqueue_script( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
148 |
+
|
149 |
+
wp_enqueue_script( 'gadwp-backend-dashboard-reports', GADWP_URL . 'common/js/reports.js', array( 'jquery', 'googlecharts', 'gadwp-nprogress', 'jquery-ui-tooltip', 'jquery-ui-core', 'jquery-ui-position', 'jquery-ui-tooltip-html' ), GADWP_CURRENT_VERSION, true );
|
150 |
+
|
151 |
+
/* @formatter:off */
|
152 |
+
wp_localize_script( 'gadwp-backend-dashboard-reports', 'gadwpItemData', array(
|
153 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
154 |
+
'security' => wp_create_nonce( 'gadwp_backend_item_reports' ),
|
155 |
+
'dateList' => array(
|
156 |
+
'realtime' => __( "Real-Time", 'google-analytics-dashboard-for-wp' ),
|
157 |
+
'today' => __( "Today", 'google-analytics-dashboard-for-wp' ),
|
158 |
+
'yesterday' => __( "Yesterday", 'google-analytics-dashboard-for-wp' ),
|
159 |
+
'7daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 7 ),
|
160 |
+
'14daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 14 ),
|
161 |
+
'30daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 30 ),
|
162 |
+
'90daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 90 ),
|
163 |
+
'365daysAgo' => sprintf( _n( "%s Year", "%s Years", 1, 'google-analytics-dashboard-for-wp' ), __('One', 'google-analytics-dashboard-for-wp') ),
|
164 |
+
'1095daysAgo' => sprintf( _n( "%s Year", "%s Years", 3, 'google-analytics-dashboard-for-wp' ), __('Three', 'google-analytics-dashboard-for-wp') ),
|
165 |
+
),
|
166 |
+
'reportList' => array(
|
167 |
+
'sessions' => __( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
168 |
+
'users' => __( "Users", 'google-analytics-dashboard-for-wp' ),
|
169 |
+
'organicSearches' => __( "Organic", 'google-analytics-dashboard-for-wp' ),
|
170 |
+
'pageviews' => __( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
171 |
+
'visitBounceRate' => __( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
172 |
+
'locations' => __( "Location", 'google-analytics-dashboard-for-wp' ),
|
173 |
+
'contentpages' => __( "Pages", 'google-analytics-dashboard-for-wp' ),
|
174 |
+
'referrers' => __( "Referrers", 'google-analytics-dashboard-for-wp' ),
|
175 |
+
'searches' => __( "Searches", 'google-analytics-dashboard-for-wp' ),
|
176 |
+
'trafficdetails' => __( "Traffic", 'google-analytics-dashboard-for-wp' ),
|
177 |
+
'technologydetails' => __( "Technology", 'google-analytics-dashboard-for-wp' ),
|
178 |
+
'404errors' => __( "404 Errors", 'google-analytics-dashboard-for-wp' ),
|
179 |
+
),
|
180 |
+
'i18n' => array(
|
181 |
+
__( "A JavaScript Error is blocking plugin resources!", 'google-analytics-dashboard-for-wp' ), //0
|
182 |
+
__( "Traffic Mediums", 'google-analytics-dashboard-for-wp' ),
|
183 |
+
__( "Visitor Type", 'google-analytics-dashboard-for-wp' ),
|
184 |
+
__( "Search Engines", 'google-analytics-dashboard-for-wp' ),
|
185 |
+
__( "Social Networks", 'google-analytics-dashboard-for-wp' ),
|
186 |
+
__( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
187 |
+
__( "Users", 'google-analytics-dashboard-for-wp' ),
|
188 |
+
__( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
189 |
+
__( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
190 |
+
__( "Organic Search", 'google-analytics-dashboard-for-wp' ),
|
191 |
+
__( "Pages/Session", 'google-analytics-dashboard-for-wp' ),
|
192 |
+
__( "Invalid response", 'google-analytics-dashboard-for-wp' ),
|
193 |
+
__( "Not enough data collected", 'google-analytics-dashboard-for-wp' ),
|
194 |
+
__( "This report is unavailable", 'google-analytics-dashboard-for-wp' ),
|
195 |
+
__( "report generated by", 'google-analytics-dashboard-for-wp' ), //14
|
196 |
+
__( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . ' <a href="' . menu_page_url( 'gadash_settings', false ) . '">' . __( "authorize the plugin", 'google-analytics-dashboard-for-wp' ) . '</a>.',
|
197 |
+
__( "Browser", 'google-analytics-dashboard-for-wp' ), //16
|
198 |
+
__( "Operating System", 'google-analytics-dashboard-for-wp' ),
|
199 |
+
__( "Screen Resolution", 'google-analytics-dashboard-for-wp' ),
|
200 |
+
__( "Mobile Brand", 'google-analytics-dashboard-for-wp' ),
|
201 |
+
__( "REFERRALS", 'google-analytics-dashboard-for-wp' ), //20
|
202 |
+
__( "KEYWORDS", 'google-analytics-dashboard-for-wp' ),
|
203 |
+
__( "SOCIAL", 'google-analytics-dashboard-for-wp' ),
|
204 |
+
__( "CAMPAIGN", 'google-analytics-dashboard-for-wp' ),
|
205 |
+
__( "DIRECT", 'google-analytics-dashboard-for-wp' ),
|
206 |
+
__( "NEW", 'google-analytics-dashboard-for-wp' ), //25
|
207 |
+
),
|
208 |
+
'rtLimitPages' => $this->gadwp->config->options['ga_realtime_pages'],
|
209 |
+
'colorVariations' => GADWP_Tools::variations( $this->gadwp->config->options['ga_dash_style'] ),
|
210 |
+
'region' => $region,
|
211 |
+
'mapsApiKey' => $this->gadwp->config->options['maps_api_key'],
|
212 |
+
'language' => get_bloginfo( 'language' ),
|
213 |
+
'viewList' => $views,
|
214 |
+
'scope' => 'admin-widgets',
|
215 |
+
)
|
216 |
+
);
|
217 |
+
/* @formatter:on */
|
218 |
+
}
|
219 |
+
}
|
220 |
+
|
221 |
+
/*
|
222 |
+
* Posts/Pages List Styles & Scripts
|
223 |
+
*/
|
224 |
+
$contentstats_hooks = array( 'edit.php' );
|
225 |
+
if ( in_array( $hook, $contentstats_hooks ) ) {
|
226 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && $this->gadwp->config->options['backend_item_reports'] ) {
|
227 |
+
|
228 |
+
if ( $this->gadwp->config->options['ga_target_geomap'] ) {
|
229 |
+
$country_codes = GADWP_Tools::get_countrycodes();
|
230 |
+
if ( isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
|
231 |
+
$region = $this->gadwp->config->options['ga_target_geomap'];
|
232 |
+
} else {
|
233 |
+
$region = false;
|
234 |
+
}
|
235 |
+
} else {
|
236 |
+
$region = false;
|
237 |
+
}
|
238 |
+
|
239 |
+
wp_enqueue_style( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.css', null, GADWP_CURRENT_VERSION );
|
240 |
+
|
241 |
+
wp_enqueue_style( 'gadwp-backend-item-reports', GADWP_URL . 'admin/css/item-reports.css', null, GADWP_CURRENT_VERSION );
|
242 |
+
|
243 |
+
wp_enqueue_style( "wp-jquery-ui-dialog" );
|
244 |
+
|
245 |
+
wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
246 |
+
|
247 |
+
wp_enqueue_script( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
248 |
+
|
249 |
+
wp_enqueue_script( 'gadwp-backend-item-reports', GADWP_URL . 'common/js/reports.js', array( 'gadwp-nprogress', 'googlecharts', 'jquery', 'jquery-ui-dialog' ), GADWP_CURRENT_VERSION, true );
|
250 |
+
|
251 |
+
/* @formatter:off */
|
252 |
+
wp_localize_script( 'gadwp-backend-item-reports', 'gadwpItemData', array(
|
253 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
254 |
+
'security' => wp_create_nonce( 'gadwp_backend_item_reports' ),
|
255 |
+
'dateList' => array(
|
256 |
+
'today' => __( "Today", 'google-analytics-dashboard-for-wp' ),
|
257 |
+
'yesterday' => __( "Yesterday", 'google-analytics-dashboard-for-wp' ),
|
258 |
+
'7daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 7 ),
|
259 |
+
'14daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 14 ),
|
260 |
+
'30daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 30 ),
|
261 |
+
'90daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 90 ),
|
262 |
+
'365daysAgo' => sprintf( _n( "%s Year", "%s Years", 1, 'google-analytics-dashboard-for-wp' ), __('One', 'google-analytics-dashboard-for-wp') ),
|
263 |
+
'1095daysAgo' => sprintf( _n( "%s Year", "%s Years", 3, 'google-analytics-dashboard-for-wp' ), __('Three', 'google-analytics-dashboard-for-wp') ),
|
264 |
+
),
|
265 |
+
'reportList' => array(
|
266 |
+
'sessions' => __( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
267 |
+
'users' => __( "Users", 'google-analytics-dashboard-for-wp' ),
|
268 |
+
'organicSearches' => __( "Organic", 'google-analytics-dashboard-for-wp' ),
|
269 |
+
'pageviews' => __( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
270 |
+
'visitBounceRate' => __( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
271 |
+
'locations' => __( "Location", 'google-analytics-dashboard-for-wp' ),
|
272 |
+
'referrers' => __( "Referrers", 'google-analytics-dashboard-for-wp' ),
|
273 |
+
'searches' => __( "Searches", 'google-analytics-dashboard-for-wp' ),
|
274 |
+
'trafficdetails' => __( "Traffic", 'google-analytics-dashboard-for-wp' ),
|
275 |
+
'technologydetails' => __( "Technology", 'google-analytics-dashboard-for-wp' ),
|
276 |
+
),
|
277 |
+
'i18n' => array(
|
278 |
+
__( "A JavaScript Error is blocking plugin resources!", 'google-analytics-dashboard-for-wp' ), //0
|
279 |
+
__( "Traffic Mediums", 'google-analytics-dashboard-for-wp' ),
|
280 |
+
__( "Visitor Type", 'google-analytics-dashboard-for-wp' ),
|
281 |
+
__( "Social Networks", 'google-analytics-dashboard-for-wp' ),
|
282 |
+
__( "Search Engines", 'google-analytics-dashboard-for-wp' ),
|
283 |
+
__( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
284 |
+
__( "Users", 'google-analytics-dashboard-for-wp' ),
|
285 |
+
__( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
286 |
+
__( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
287 |
+
__( "Organic Search", 'google-analytics-dashboard-for-wp' ),
|
288 |
+
__( "Pages/Session", 'google-analytics-dashboard-for-wp' ),
|
289 |
+
__( "Invalid response", 'google-analytics-dashboard-for-wp' ),
|
290 |
+
__( "Not enough data collected", 'google-analytics-dashboard-for-wp' ),
|
291 |
+
__( "This report is unavailable", 'google-analytics-dashboard-for-wp' ),
|
292 |
+
__( "report generated by", 'google-analytics-dashboard-for-wp' ), //14
|
293 |
+
__( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . ' <a href="' . menu_page_url( 'gadash_settings', false ) . '">' . __( "authorize the plugin", 'google-analytics-dashboard-for-wp' ) . '</a>.',
|
294 |
+
__( "Browser", 'google-analytics-dashboard-for-wp' ), //16
|
295 |
+
__( "Operating System", 'google-analytics-dashboard-for-wp' ),
|
296 |
+
__( "Screen Resolution", 'google-analytics-dashboard-for-wp' ),
|
297 |
+
__( "Mobile Brand", 'google-analytics-dashboard-for-wp' ),
|
298 |
+
),
|
299 |
+
'colorVariations' => GADWP_Tools::variations( $this->gadwp->config->options['ga_dash_style'] ),
|
300 |
+
'region' => $region,
|
301 |
+
'mapsApiKey' => $this->gadwp->config->options['maps_api_key'],
|
302 |
+
'language' => get_bloginfo( 'language' ),
|
303 |
+
'viewList' => false,
|
304 |
+
'scope' => 'admin-item',
|
305 |
+
)
|
306 |
+
);
|
307 |
+
/* @formatter:on */
|
308 |
+
}
|
309 |
+
}
|
310 |
+
|
311 |
+
/*
|
312 |
+
* Settings Styles & Scripts
|
313 |
+
*/
|
314 |
+
$settings_hooks = array( '_page_gadash_settings', '_page_gadash_backend_settings', '_page_gadash_frontend_settings', '_page_gadash_tracking_settings', '_page_gadash_errors_debugging' );
|
315 |
+
|
316 |
+
if ( in_array( $new_hook, $settings_hooks ) ) {
|
317 |
+
wp_enqueue_style( 'wp-color-picker' );
|
318 |
+
wp_enqueue_script( 'wp-color-picker' );
|
319 |
+
wp_enqueue_script( 'wp-color-picker-script-handle', plugins_url( 'js/wp-color-picker-script.js', __FILE__ ), array( 'wp-color-picker' ), false, true );
|
320 |
+
wp_enqueue_script( 'gadwp-settings', plugins_url( 'js/settings.js', __FILE__ ), array( 'jquery' ), GADWP_CURRENT_VERSION, true );
|
321 |
+
}
|
322 |
+
}
|
323 |
+
|
324 |
+
/**
|
325 |
+
* Add "Settings" link in Plugins List
|
326 |
+
*
|
327 |
+
* @param
|
328 |
+
* $links
|
329 |
+
* @return array
|
330 |
+
*/
|
331 |
+
public function settings_link( $links ) {
|
332 |
+
$settings_link = '<a href="' . esc_url( get_admin_url( null, 'admin.php?page=gadash_settings' ) ) . '">' . __( "Settings", 'google-analytics-dashboard-for-wp' ) . '</a>';
|
333 |
+
array_unshift( $links, $settings_link );
|
334 |
+
return $links;
|
335 |
+
}
|
336 |
+
|
337 |
+
/**
|
338 |
+
* Add an admin notice after a manual or atuomatic update
|
339 |
+
*/
|
340 |
+
function admin_notice() {
|
341 |
+
$currentScreen = get_current_screen();
|
342 |
+
|
343 |
+
if ( ! current_user_can( 'manage_options' ) || $currentScreen->base != 'dashboard' ) {
|
344 |
+
return;
|
345 |
+
}
|
346 |
+
|
347 |
+
if ( get_option( 'gadwp_got_updated' ) ) :
|
348 |
+
?>
|
349 |
+
<div id="gadwp-notice" class="notice is-dismissible">
|
350 |
+
<p><?php echo sprintf( __('Google Analytics Dashboard for WP has been updated to version %s.', 'google-analytics-dashboard-for-wp' ), GADWP_CURRENT_VERSION).' '.sprintf( __('For details, check out %1$s and %2$s.', 'google-analytics-dashboard-for-wp' ), sprintf(' <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_notice&utm_medium=link&utm_content=release_notice&utm_campaign=gadwp">%s</a> ', __('the documentation page', 'google-analytics-dashboard-for-wp') ), sprintf(' <a href="%1$s">%2$s</a>', esc_url( get_admin_url( null, 'admin.php?page=gadash_settings' ) ), __('the plugin's settings page', 'google-analytics-dashboard-for-wp') ) ); ?></p>
|
351 |
+
</div>
|
352 |
+
|
353 |
+
<?php
|
354 |
+
endif;
|
355 |
+
}
|
356 |
+
}
|
357 |
+
}
|
admin/widgets.php
CHANGED
@@ -1,65 +1,65 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Backend_Widgets' ) ) {
|
15 |
-
|
16 |
-
class GADWP_Backend_Widgets {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && ( 1 == $this->gadwp->config->options['dashboard_widget'] ) ) {
|
23 |
-
add_action( 'wp_dashboard_setup', array( $this, 'add_widget' ) );
|
24 |
-
}
|
25 |
-
}
|
26 |
-
|
27 |
-
public function add_widget() {
|
28 |
-
wp_add_dashboard_widget( 'gadwp-widget', __( "Google Analytics Dashboard", 'google-analytics-dashboard-for-wp' ), array( $this, 'dashboard_widget' ), $control_callback = null );
|
29 |
-
}
|
30 |
-
|
31 |
-
public function dashboard_widget() {
|
32 |
-
$projectId = 0;
|
33 |
-
|
34 |
-
if ( empty( $this->gadwp->config->options['ga_dash_token'] ) ) {
|
35 |
-
echo '<p>' . __( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . '</p><form action="' . menu_page_url( 'gadash_settings', false ) . '" method="POST">' . get_submit_button( __( "Authorize Plugin", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
36 |
-
return;
|
37 |
-
}
|
38 |
-
|
39 |
-
if ( current_user_can( 'manage_options' ) ) {
|
40 |
-
if ( $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
41 |
-
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
42 |
-
} else {
|
43 |
-
echo '<p>' . __( "An admin should asign a default Google Analytics Profile.", 'google-analytics-dashboard-for-wp' ) . '</p><form action="' . menu_page_url( 'gadash_settings', false ) . '" method="POST">' . get_submit_button( __( "Select Domain", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
44 |
-
return;
|
45 |
-
}
|
46 |
-
} else {
|
47 |
-
if ( $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
48 |
-
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
49 |
-
} else {
|
50 |
-
echo '<p>' . __( "An admin should asign a default Google Analytics Profile.", 'google-analytics-dashboard-for-wp' ) . '</p><form action="' . menu_page_url( 'gadash_settings', false ) . '" method="POST">' . get_submit_button( __( "Select Domain", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
51 |
-
return;
|
52 |
-
}
|
53 |
-
}
|
54 |
-
|
55 |
-
if ( ! ( $projectId ) ) {
|
56 |
-
echo '<p>' . __( "Something went wrong while retrieving property data. You need to create and properly configure a Google Analytics account:", 'google-analytics-dashboard-for-wp' ) . '</p> <form action="https://deconf.com/how-to-set-up-google-analytics-on-your-website/" method="POST">' . get_submit_button( __( "Find out more!", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
57 |
-
return;
|
58 |
-
}
|
59 |
-
|
60 |
-
?>
|
61 |
-
<div id="gadwp-window-1"></div>
|
62 |
-
<?php
|
63 |
-
}
|
64 |
-
}
|
65 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Backend_Widgets' ) ) {
|
15 |
+
|
16 |
+
class GADWP_Backend_Widgets {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) && ( 1 == $this->gadwp->config->options['dashboard_widget'] ) ) {
|
23 |
+
add_action( 'wp_dashboard_setup', array( $this, 'add_widget' ) );
|
24 |
+
}
|
25 |
+
}
|
26 |
+
|
27 |
+
public function add_widget() {
|
28 |
+
wp_add_dashboard_widget( 'gadwp-widget', __( "Google Analytics Dashboard", 'google-analytics-dashboard-for-wp' ), array( $this, 'dashboard_widget' ), $control_callback = null );
|
29 |
+
}
|
30 |
+
|
31 |
+
public function dashboard_widget() {
|
32 |
+
$projectId = 0;
|
33 |
+
|
34 |
+
if ( empty( $this->gadwp->config->options['ga_dash_token'] ) ) {
|
35 |
+
echo '<p>' . __( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . '</p><form action="' . menu_page_url( 'gadash_settings', false ) . '" method="POST">' . get_submit_button( __( "Authorize Plugin", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
36 |
+
return;
|
37 |
+
}
|
38 |
+
|
39 |
+
if ( current_user_can( 'manage_options' ) ) {
|
40 |
+
if ( $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
41 |
+
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
42 |
+
} else {
|
43 |
+
echo '<p>' . __( "An admin should asign a default Google Analytics Profile.", 'google-analytics-dashboard-for-wp' ) . '</p><form action="' . menu_page_url( 'gadash_settings', false ) . '" method="POST">' . get_submit_button( __( "Select Domain", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
44 |
+
return;
|
45 |
+
}
|
46 |
+
} else {
|
47 |
+
if ( $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
48 |
+
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
49 |
+
} else {
|
50 |
+
echo '<p>' . __( "An admin should asign a default Google Analytics Profile.", 'google-analytics-dashboard-for-wp' ) . '</p><form action="' . menu_page_url( 'gadash_settings', false ) . '" method="POST">' . get_submit_button( __( "Select Domain", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
51 |
+
return;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
if ( ! ( $projectId ) ) {
|
56 |
+
echo '<p>' . __( "Something went wrong while retrieving property data. You need to create and properly configure a Google Analytics account:", 'google-analytics-dashboard-for-wp' ) . '</p> <form action="https://deconf.com/how-to-set-up-google-analytics-on-your-website/" method="POST">' . get_submit_button( __( "Find out more!", 'google-analytics-dashboard-for-wp' ), 'secondary' ) . '</form>';
|
57 |
+
return;
|
58 |
+
}
|
59 |
+
|
60 |
+
?>
|
61 |
+
<div id="gadwp-window-1"></div>
|
62 |
+
<?php
|
63 |
+
}
|
64 |
+
}
|
65 |
+
}
|
common/ajax-actions.php
CHANGED
@@ -1,43 +1,43 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Common_Ajax' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Common_Ajax {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) || GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) ) {
|
24 |
-
add_action( 'wp_ajax_gadwp_set_error', array( $this, 'ajax_set_error' ) );
|
25 |
-
}
|
26 |
-
}
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Ajax handler for storing JavaScript Errors
|
30 |
-
*
|
31 |
-
* @return json|int
|
32 |
-
*/
|
33 |
-
public function ajax_set_error() {
|
34 |
-
if ( ! isset( $_POST['gadwp_security_set_error'] ) || ! ( wp_verify_nonce( $_POST['gadwp_security_set_error'], 'gadwp_backend_item_reports' ) || wp_verify_nonce( $_POST['gadwp_security_set_error'], 'gadwp_frontend_item_reports' ) ) ) {
|
35 |
-
wp_die( - 40 );
|
36 |
-
}
|
37 |
-
|
38 |
-
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $_POST['response'] ), 24 * 60 * 60 );
|
39 |
-
|
40 |
-
wp_die();
|
41 |
-
}
|
42 |
-
}
|
43 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Common_Ajax' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Common_Ajax {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_back'] ) || GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) ) {
|
24 |
+
add_action( 'wp_ajax_gadwp_set_error', array( $this, 'ajax_set_error' ) );
|
25 |
+
}
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Ajax handler for storing JavaScript Errors
|
30 |
+
*
|
31 |
+
* @return json|int
|
32 |
+
*/
|
33 |
+
public function ajax_set_error() {
|
34 |
+
if ( ! isset( $_POST['gadwp_security_set_error'] ) || ! ( wp_verify_nonce( $_POST['gadwp_security_set_error'], 'gadwp_backend_item_reports' ) || wp_verify_nonce( $_POST['gadwp_security_set_error'], 'gadwp_frontend_item_reports' ) ) ) {
|
35 |
+
wp_die( - 40 );
|
36 |
+
}
|
37 |
+
|
38 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $_POST['response'] ), 24 * 60 * 60 );
|
39 |
+
|
40 |
+
wp_die();
|
41 |
+
}
|
42 |
+
}
|
43 |
+
}
|
common/js/reports.js
CHANGED
@@ -1,1107 +1,1107 @@
|
|
1 |
-
/*-
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
"use strict";
|
10 |
-
|
11 |
-
google.charts.load('current', {mapsApiKey: gadwpItemData.mapsApiKey, 'packages':['corechart', 'table', 'orgchart', 'geochart']});
|
12 |
-
google.charts.setOnLoadCallback( GADWPReportLoad );
|
13 |
-
|
14 |
-
// Get the numeric ID
|
15 |
-
gadwpItemData.getID = function ( item ) {
|
16 |
-
if ( gadwpItemData.scope == 'admin-item' ) {
|
17 |
-
if ( typeof item.id == "undefined" ) {
|
18 |
-
return 0
|
19 |
-
}
|
20 |
-
if ( item.id.split( '-' )[ 1 ] == "undefined" ) {
|
21 |
-
return 0;
|
22 |
-
} else {
|
23 |
-
return item.id.split( '-' )[ 1 ];
|
24 |
-
}
|
25 |
-
} else {
|
26 |
-
if ( typeof item.id == "undefined" ) {
|
27 |
-
return 1;
|
28 |
-
}
|
29 |
-
if ( item.id.split( '-' )[ 4 ] == "undefined" ) {
|
30 |
-
return 1;
|
31 |
-
} else {
|
32 |
-
return item.id.split( '-' )[ 4 ];
|
33 |
-
}
|
34 |
-
}
|
35 |
-
}
|
36 |
-
|
37 |
-
// Get the selector
|
38 |
-
gadwpItemData.getSelector = function ( scope ) {
|
39 |
-
if ( scope == 'admin-item' ) {
|
40 |
-
return 'a[id^="gadwp-"]';
|
41 |
-
} else {
|
42 |
-
return 'li[id^="wp-admin-bar-gadwp"]';
|
43 |
-
}
|
44 |
-
}
|
45 |
-
|
46 |
-
gadwpItemData.responsiveDialog = function () {
|
47 |
-
var dialog, wWidth, visible;
|
48 |
-
|
49 |
-
visible = jQuery( ".ui-dialog:visible" );
|
50 |
-
|
51 |
-
// on each visible dialog
|
52 |
-
visible.each( function () {
|
53 |
-
dialog = jQuery( this ).find( ".ui-dialog-content" ).data( "ui-dialog" );
|
54 |
-
// on each fluid dialog
|
55 |
-
if ( dialog.options.fluid ) {
|
56 |
-
wWidth = jQuery( window ).width();
|
57 |
-
// window width vs dialog width
|
58 |
-
if ( wWidth < ( parseInt( dialog.options.maxWidth ) + 50 ) ) {
|
59 |
-
// don't fill the entire screen
|
60 |
-
jQuery( this ).css( "max-width", "90%" );
|
61 |
-
} else {
|
62 |
-
// maxWidth bug fix
|
63 |
-
jQuery( this ).css( "max-width", dialog.options.maxWidth + "px" );
|
64 |
-
}
|
65 |
-
// change dialog position
|
66 |
-
dialog.option( "position", dialog.options.position );
|
67 |
-
}
|
68 |
-
} );
|
69 |
-
}
|
70 |
-
|
71 |
-
jQuery.fn.extend( {
|
72 |
-
gadwpItemReport : function ( itemId ) {
|
73 |
-
var postData, tools, template, reports, refresh, init, slug = "-" + itemId;
|
74 |
-
|
75 |
-
tools = {
|
76 |
-
setCookie : function ( name, value ) {
|
77 |
-
var expires, dateItem = new Date();
|
78 |
-
|
79 |
-
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
80 |
-
name = "gadwp_wg_" + name;
|
81 |
-
} else {
|
82 |
-
name = "gadwp_ir_" + name;
|
83 |
-
}
|
84 |
-
dateItem.setTime( dateItem.getTime() + ( 24 * 60 * 60 * 1000 * 7 ) );
|
85 |
-
expires = "expires=" + dateItem.toUTCString();
|
86 |
-
document.cookie = name + "=" + value + "; " + expires + "; path=/";
|
87 |
-
},
|
88 |
-
getCookie : function ( name ) {
|
89 |
-
var cookie, cookiesArray, div, i = 0;
|
90 |
-
|
91 |
-
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
92 |
-
name = "gadwp_wg_" + name + "=";
|
93 |
-
} else {
|
94 |
-
name = "gadwp_ir_" + name + "=";
|
95 |
-
}
|
96 |
-
cookiesArray = document.cookie.split( ';' );
|
97 |
-
for ( i = 0; i < cookiesArray.length; i++ ) {
|
98 |
-
cookie = cookiesArray[ i ];
|
99 |
-
while ( cookie.charAt( 0 ) == ' ' )
|
100 |
-
cookie = cookie.substring( 1 );
|
101 |
-
if ( cookie.indexOf( name ) == 0 )
|
102 |
-
return cookie.substring( name.length, cookie.length );
|
103 |
-
}
|
104 |
-
return false;
|
105 |
-
},
|
106 |
-
escape : function ( str ) {
|
107 |
-
div = document.createElement( 'div' );
|
108 |
-
div.appendChild( document.createTextNode( str ) );
|
109 |
-
return div.innerHTML;
|
110 |
-
}
|
111 |
-
}
|
112 |
-
|
113 |
-
template = {
|
114 |
-
|
115 |
-
addOptions : function ( id, list ) {
|
116 |
-
var defaultMetric, defaultDimension, defaultView, output = [];
|
117 |
-
|
118 |
-
if ( list == false ) {
|
119 |
-
return;
|
120 |
-
}
|
121 |
-
|
122 |
-
if ( !tools.getCookie( 'default_metric' ) || !tools.getCookie( 'default_dimension' ) ) {
|
123 |
-
defaultMetric = 'sessions';
|
124 |
-
defaultDimension = '30daysAgo';
|
125 |
-
} else {
|
126 |
-
defaultMetric = tools.getCookie( 'default_metric' );
|
127 |
-
defaultDimension = tools.getCookie( 'default_dimension' );
|
128 |
-
defaultView = tools.getCookie( 'default_view' );
|
129 |
-
}
|
130 |
-
|
131 |
-
jQuery.each( list, function ( key, value ) {
|
132 |
-
if ( key == defaultMetric || key == defaultDimension || key == defaultView ) {
|
133 |
-
output.push( '<option value="' + key + '" selected="selected">' + value + '</option>' );
|
134 |
-
} else {
|
135 |
-
output.push( '<option value="' + key + '">' + value + '</option>' );
|
136 |
-
}
|
137 |
-
} );
|
138 |
-
jQuery( id ).html( output.join( '' ) );
|
139 |
-
},
|
140 |
-
|
141 |
-
init : function () {
|
142 |
-
var tpl;
|
143 |
-
|
144 |
-
if ( !jQuery( '#gadwp-window' + slug ).length ) {
|
145 |
-
return;
|
146 |
-
}
|
147 |
-
|
148 |
-
if ( jQuery( '#gadwp-window' + slug ).html().length ) { // add main template once
|
149 |
-
return;
|
150 |
-
}
|
151 |
-
|
152 |
-
tpl = '<div id="gadwp-container' + slug + '">';
|
153 |
-
if ( gadwpItemData.viewList != false ) {
|
154 |
-
tpl += '<select id="gadwp-sel-view' + slug + '"></select>';
|
155 |
-
}
|
156 |
-
tpl += '<select id="gadwp-sel-period' + slug + '"></select> ';
|
157 |
-
tpl += '<select id="gadwp-sel-report' + slug + '"></select>';
|
158 |
-
tpl += '<div id="gadwp-progressbar' + slug + '"></div>';
|
159 |
-
tpl += '<div id="gadwp-status' + slug + '"></div>';
|
160 |
-
tpl += '<div id="gadwp-reports' + slug + '"></div>';
|
161 |
-
tpl += '<div style="text-align:right;width:100%;font-size:0.8em;clear:both;margin-right:5px;margin-top:10px;">';
|
162 |
-
tpl += gadwpItemData.i18n[ 14 ];
|
163 |
-
tpl += ' <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_report&utm_medium=link&utm_content=back_report&utm_campaign=gadwp" rel="nofollow" style="text-decoration:none;font-size:1em;">GADWP</a> ';
|
164 |
-
tpl += '</div>';
|
165 |
-
tpl += '</div>',
|
166 |
-
|
167 |
-
jQuery( '#gadwp-window' + slug ).append( tpl );
|
168 |
-
|
169 |
-
template.addOptions( '#gadwp-sel-view' + slug, gadwpItemData.viewList );
|
170 |
-
template.addOptions( '#gadwp-sel-period' + slug, gadwpItemData.dateList );
|
171 |
-
template.addOptions( '#gadwp-sel-report' + slug, gadwpItemData.reportList );
|
172 |
-
|
173 |
-
}
|
174 |
-
}
|
175 |
-
|
176 |
-
reports = {
|
177 |
-
oldViewPort: 0,
|
178 |
-
orgChartTableChartData : '',
|
179 |
-
tableChartData : '',
|
180 |
-
orgChartPieChartsData : '',
|
181 |
-
geoChartTableChartData : '',
|
182 |
-
areaChartBottomStatsData : '',
|
183 |
-
realtime : '',
|
184 |
-
rtRuns : null,
|
185 |
-
i18n : null,
|
186 |
-
|
187 |
-
getTitle : function ( scope ) {
|
188 |
-
if ( scope == 'admin-item' ) {
|
189 |
-
return jQuery( '#gadwp' + slug ).attr( "title" );
|
190 |
-
} else {
|
191 |
-
return document.getElementsByTagName( "title" )[ 0 ].innerHTML;
|
192 |
-
}
|
193 |
-
},
|
194 |
-
|
195 |
-
alertMessage : function ( msg ) {
|
196 |
-
jQuery( "#gadwp-status" + slug ).css( {
|
197 |
-
"margin-top" : "3px",
|
198 |
-
"padding-left" : "5px",
|
199 |
-
"height" : "auto",
|
200 |
-
"color" : "#000",
|
201 |
-
"border-left" : "5px solid red"
|
202 |
-
} );
|
203 |
-
jQuery( "#gadwp-status" + slug ).html( msg );
|
204 |
-
},
|
205 |
-
|
206 |
-
areaChartBottomStats : function ( response ) {
|
207 |
-
reports.areaChartBottomStatsData = response;
|
208 |
-
if ( jQuery.isArray( response ) ) {
|
209 |
-
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
210 |
-
if ( jQuery.isArray( response[ 0 ] ) ) {
|
211 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
212 |
-
if ( postData.query == 'visitBounceRate,bottomstats' ) {
|
213 |
-
reports.drawAreaChart( response[ 0 ], true );
|
214 |
-
} else {
|
215 |
-
reports.drawAreaChart( response[ 0 ], false );
|
216 |
-
}
|
217 |
-
} else {
|
218 |
-
reports.throwDebug( response[ 0 ] );
|
219 |
-
}
|
220 |
-
} else {
|
221 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
222 |
-
reports.throwError( '#gadwp-areachart' + slug, response[ 0 ], "125px" );
|
223 |
-
}
|
224 |
-
if ( !jQuery.isNumeric( response[ 1 ] ) ) {
|
225 |
-
if ( jQuery.isArray( response[ 1 ] ) ) {
|
226 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
227 |
-
reports.drawBottomStats( response[ 1 ] );
|
228 |
-
} else {
|
229 |
-
reports.throwDebug( response[ 1 ] );
|
230 |
-
}
|
231 |
-
} else {
|
232 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
233 |
-
reports.throwError( '#gadwp-bottomstats' + slug, response[ 1 ], "40px" );
|
234 |
-
}
|
235 |
-
} else {
|
236 |
-
reports.throwDebug( response );
|
237 |
-
}
|
238 |
-
NProgress.done();
|
239 |
-
|
240 |
-
},
|
241 |
-
|
242 |
-
orgChartPieCharts : function ( response ) {
|
243 |
-
var i = 0;
|
244 |
-
reports.orgChartPieChartsData = response;
|
245 |
-
if ( jQuery.isArray( response ) ) {
|
246 |
-
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
247 |
-
if ( jQuery.isArray( response[ 0 ] ) ) {
|
248 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
249 |
-
reports.drawOrgChart( response[ 0 ] );
|
250 |
-
} else {
|
251 |
-
reports.throwDebug( response[ 0 ] );
|
252 |
-
}
|
253 |
-
} else {
|
254 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
255 |
-
reports.throwError( '#gadwp-orgchart' + slug, response[ 0 ], "125px" );
|
256 |
-
}
|
257 |
-
|
258 |
-
for ( i = 1; i < response.length; i++ ) {
|
259 |
-
if ( !jQuery.isNumeric( response[ i ] ) ) {
|
260 |
-
if ( jQuery.isArray( response[ i ] ) ) {
|
261 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
262 |
-
reports.drawPieChart( 'piechart-' + i, response[ i ], reports.i18n[ i ] );
|
263 |
-
} else {
|
264 |
-
reports.throwDebug( response[ i ] );
|
265 |
-
}
|
266 |
-
} else {
|
267 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
268 |
-
reports.throwError( '#gadwp-piechart-' + i + slug, response[ i ], "80px" );
|
269 |
-
}
|
270 |
-
}
|
271 |
-
} else {
|
272 |
-
reports.throwDebug( response );
|
273 |
-
}
|
274 |
-
NProgress.done();
|
275 |
-
},
|
276 |
-
|
277 |
-
geoChartTableChart : function ( response ) {
|
278 |
-
reports.geoChartTableChartData = response;
|
279 |
-
if ( jQuery.isArray( response ) ) {
|
280 |
-
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
281 |
-
if ( jQuery.isArray( response[ 0 ] ) ) {
|
282 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
283 |
-
reports.drawGeoChart( response[ 0 ] );
|
284 |
-
reports.drawTableChart( response[ 0 ] );
|
285 |
-
} else {
|
286 |
-
reports.throwDebug( response[ 0 ] );
|
287 |
-
}
|
288 |
-
} else {
|
289 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
290 |
-
reports.throwError( '#gadwp-geochart' + slug, response[ 0 ], "125px" );
|
291 |
-
reports.throwError( '#gadwp-tablechart' + slug, response[ 0 ], "125px" );
|
292 |
-
}
|
293 |
-
} else {
|
294 |
-
reports.throwDebug( response );
|
295 |
-
}
|
296 |
-
NProgress.done();
|
297 |
-
},
|
298 |
-
|
299 |
-
orgChartTableChart : function ( response ) {
|
300 |
-
reports.orgChartTableChartData = response
|
301 |
-
if ( jQuery.isArray( response ) ) {
|
302 |
-
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
303 |
-
if ( jQuery.isArray( response[ 0 ] ) ) {
|
304 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
305 |
-
reports.drawOrgChart( response[ 0 ] );
|
306 |
-
} else {
|
307 |
-
reports.throwDebug( response[ 0 ] );
|
308 |
-
}
|
309 |
-
} else {
|
310 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
311 |
-
reports.throwError( '#gadwp-orgchart' + slug, response[ 0 ], "125px" );
|
312 |
-
}
|
313 |
-
|
314 |
-
if ( !jQuery.isNumeric( response[ 1 ] ) ) {
|
315 |
-
if ( jQuery.isArray( response[ 1 ] ) ) {
|
316 |
-
reports.drawTableChart( response[ 1 ] );
|
317 |
-
} else {
|
318 |
-
reports.throwDebug( response[ 1 ] );
|
319 |
-
}
|
320 |
-
} else {
|
321 |
-
reports.throwError( '#gadwp-tablechart' + slug, response[ 1 ], "125px" );
|
322 |
-
}
|
323 |
-
} else {
|
324 |
-
reports.throwDebug( response );
|
325 |
-
}
|
326 |
-
NProgress.done();
|
327 |
-
},
|
328 |
-
|
329 |
-
tableChart : function ( response ) {
|
330 |
-
reports.tableChartData = response
|
331 |
-
if ( jQuery.isArray( response ) ) {
|
332 |
-
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
333 |
-
if ( jQuery.isArray( response[ 0 ] ) ) {
|
334 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
335 |
-
reports.drawTableChart( response[ 0 ] );
|
336 |
-
} else {
|
337 |
-
reports.throwDebug( response[ 0 ] );
|
338 |
-
}
|
339 |
-
} else {
|
340 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
341 |
-
reports.throwError( '#gadwp-tablechart' + slug, response[ 0 ], "125px" );
|
342 |
-
}
|
343 |
-
} else {
|
344 |
-
reports.throwDebug( response );
|
345 |
-
}
|
346 |
-
NProgress.done();
|
347 |
-
},
|
348 |
-
|
349 |
-
drawTableChart : function ( data ) {
|
350 |
-
var chartData, options, chart;
|
351 |
-
|
352 |
-
chartData = google.visualization.arrayToDataTable( data );
|
353 |
-
options = {
|
354 |
-
page : 'enable',
|
355 |
-
pageSize : 10,
|
356 |
-
width : '100%',
|
357 |
-
allowHtml : true
|
358 |
-
};
|
359 |
-
chart = new google.visualization.Table( document.getElementById( 'gadwp-tablechart' + slug ) );
|
360 |
-
|
361 |
-
chart.draw( chartData, options );
|
362 |
-
},
|
363 |
-
|
364 |
-
drawOrgChart : function ( data ) {
|
365 |
-
var chartData, options, chart;
|
366 |
-
|
367 |
-
chartData = google.visualization.arrayToDataTable( data );
|
368 |
-
options = {
|
369 |
-
allowCollapse : true,
|
370 |
-
allowHtml : true,
|
371 |
-
height : '100%'
|
372 |
-
};
|
373 |
-
chart = new google.visualization.OrgChart( document.getElementById( 'gadwp-orgchart' + slug ) );
|
374 |
-
|
375 |
-
chart.draw( chartData, options );
|
376 |
-
},
|
377 |
-
|
378 |
-
drawPieChart : function ( id, data, title ) {
|
379 |
-
var chartData, options, chart;
|
380 |
-
|
381 |
-
chartData = google.visualization.arrayToDataTable( data );
|
382 |
-
options = {
|
383 |
-
is3D : false,
|
384 |
-
tooltipText : 'percentage',
|
385 |
-
legend : 'none',
|
386 |
-
chartArea : {
|
387 |
-
width : '99%',
|
388 |
-
height : '80%'
|
389 |
-
},
|
390 |
-
title : title,
|
391 |
-
pieSliceText : 'value',
|
392 |
-
colors : gadwpItemData.colorVariations
|
393 |
-
};
|
394 |
-
chart = new google.visualization.PieChart( document.getElementById( 'gadwp-' + id + slug ) );
|
395 |
-
|
396 |
-
chart.draw( chartData, options );
|
397 |
-
},
|
398 |
-
|
399 |
-
drawGeoChart : function ( data ) {
|
400 |
-
var chartData, options, chart;
|
401 |
-
|
402 |
-
chartData = google.visualization.arrayToDataTable( data );
|
403 |
-
options = {
|
404 |
-
chartArea : {
|
405 |
-
width : '99%',
|
406 |
-
height : '90%'
|
407 |
-
},
|
408 |
-
colors : [ gadwpItemData.colorVariations[ 5 ], gadwpItemData.colorVariations[ 4 ] ]
|
409 |
-
}
|
410 |
-
if ( gadwpItemData.region ) {
|
411 |
-
options.region = gadwpItemData.region;
|
412 |
-
options.displayMode = 'markers';
|
413 |
-
options.datalessRegionColor = 'EFEFEF';
|
414 |
-
}
|
415 |
-
chart = new google.visualization.GeoChart( document.getElementById( 'gadwp-geochart' + slug ) );
|
416 |
-
|
417 |
-
chart.draw( chartData, options );
|
418 |
-
},
|
419 |
-
|
420 |
-
drawAreaChart : function ( data, format ) {
|
421 |
-
var chartData, options, chart, formatter;
|
422 |
-
|
423 |
-
chartData = google.visualization.arrayToDataTable( data );
|
424 |
-
|
425 |
-
if ( format ) {
|
426 |
-
formatter = new google.visualization.NumberFormat( {
|
427 |
-
suffix : '%',
|
428 |
-
fractionDigits : 2
|
429 |
-
} );
|
430 |
-
|
431 |
-
formatter.format( chartData, 1 );
|
432 |
-
}
|
433 |
-
|
434 |
-
options = {
|
435 |
-
legend : {
|
436 |
-
position : 'none'
|
437 |
-
},
|
438 |
-
pointSize : 3,
|
439 |
-
colors : [ gadwpItemData.colorVariations[ 0 ], gadwpItemData.colorVariations[ 4 ] ],
|
440 |
-
chartArea : {
|
441 |
-
width : '99%',
|
442 |
-
height : '90%'
|
443 |
-
},
|
444 |
-
vAxis : {
|
445 |
-
textPosition : "in",
|
446 |
-
minValue : 0
|
447 |
-
},
|
448 |
-
hAxis : {
|
449 |
-
textPosition : 'none'
|
450 |
-
}
|
451 |
-
};
|
452 |
-
chart = new google.visualization.AreaChart( document.getElementById( 'gadwp-areachart' + slug ) );
|
453 |
-
|
454 |
-
chart.draw( chartData, options );
|
455 |
-
},
|
456 |
-
|
457 |
-
drawBottomStats : function ( data ) {
|
458 |
-
jQuery( "#gdsessions" + slug ).html( data[ 0 ] );
|
459 |
-
jQuery( "#gdusers" + slug ).html( data[ 1 ] );
|
460 |
-
jQuery( "#gdpageviews" + slug ).html( data[ 2 ] );
|
461 |
-
jQuery( "#gdbouncerate" + slug ).html( data[ 3 ] + "%" );
|
462 |
-
jQuery( "#gdorganicsearch" + slug ).html( data[ 4 ] );
|
463 |
-
jQuery( "#gdpagespervisit" + slug ).html( data[ 5 ] );
|
464 |
-
},
|
465 |
-
|
466 |
-
rtOnlyUniqueValues : function ( value, index, self ) {
|
467 |
-
return self.indexOf( value ) === index;
|
468 |
-
},
|
469 |
-
|
470 |
-
rtCountSessions : function ( rtData, searchValue ) {
|
471 |
-
var count = 0, i = 0;
|
472 |
-
|
473 |
-
for ( i = 0; i < rtData[ "rows" ].length; i++ ) {
|
474 |
-
if ( jQuery.inArray( searchValue, rtData[ "rows" ][ i ] ) > -1 ) {
|
475 |
-
count += parseInt( rtData[ "rows" ][ i ][ 6 ] );
|
476 |
-
}
|
477 |
-
}
|
478 |
-
return count;
|
479 |
-
},
|
480 |
-
|
481 |
-
rtGenerateTooltip : function ( rtData ) {
|
482 |
-
var count = 0, table = "", i = 0;
|
483 |
-
|
484 |
-
for ( i = 0; i < rtData.length; i++ ) {
|
485 |
-
count += parseInt( rtData[ i ].count );
|
486 |
-
table += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ].value + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ].count + "</td></tr>";
|
487 |
-
}
|
488 |
-
;
|
489 |
-
if ( count ) {
|
490 |
-
return ( "<table>" + table + "</table>" );
|
491 |
-
} else {
|
492 |
-
return ( "" );
|
493 |
-
}
|
494 |
-
},
|
495 |
-
|
496 |
-
rtPageDetails : function ( rtData, searchValue ) {
|
497 |
-
var sant, pageTitle, pgStatsTable, i = 0, j = 0, sum = 0, newsum = 0, countrfr = 0, countkwd = 0, countdrt = 0, countscl = 0, countcpg = 0, tablerfr = "", tablekwd = "", tablescl = "", tablecpg = "", tabledrt = "";
|
498 |
-
|
499 |
-
rtData = rtData[ "rows" ];
|
500 |
-
|
501 |
-
for ( i = 0; i < rtData.length; i++ ) {
|
502 |
-
|
503 |
-
if ( rtData[ i ][ 0 ] == searchValue ) {
|
504 |
-
pageTitle = rtData[ i ][ 5 ];
|
505 |
-
|
506 |
-
switch ( rtData[ i ][ 3 ] ) {
|
507 |
-
|
508 |
-
case "REFERRAL":
|
509 |
-
countrfr += parseInt( rtData[ i ][ 6 ] );
|
510 |
-
tablerfr += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 1 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
511 |
-
break;
|
512 |
-
case "ORGANIC":
|
513 |
-
countkwd += parseInt( rtData[ i ][ 6 ] );
|
514 |
-
tablekwd += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 2 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
515 |
-
break;
|
516 |
-
case "SOCIAL":
|
517 |
-
countscl += parseInt( rtData[ i ][ 6 ] );
|
518 |
-
tablescl += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 1 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
519 |
-
break;
|
520 |
-
case "CUSTOM":
|
521 |
-
countcpg += parseInt( rtData[ i ][ 6 ] );
|
522 |
-
tablecpg += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 1 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
523 |
-
break;
|
524 |
-
case "DIRECT":
|
525 |
-
countdrt += parseInt( rtData[ i ][ 6 ] );
|
526 |
-
break;
|
527 |
-
}
|
528 |
-
}
|
529 |
-
}
|
530 |
-
|
531 |
-
if ( countrfr ) {
|
532 |
-
tablerfr = "<table><tr><td>" + reports.i18n[ 0 ] + "(" + countrfr + ")</td></tr>" + tablerfr + "</table><br />";
|
533 |
-
}
|
534 |
-
if ( countkwd ) {
|
535 |
-
tablekwd = "<table><tr><td>" + reports.i18n[ 1 ] + "(" + countkwd + ")</td></tr>" + tablekwd + "</table><br />";
|
536 |
-
}
|
537 |
-
if ( countscl ) {
|
538 |
-
tablescl = "<table><tr><td>" + reports.i18n[ 2 ] + "(" + countscl + ")</td></tr>" + tablescl + "</table><br />";
|
539 |
-
}
|
540 |
-
if ( countcpg ) {
|
541 |
-
tablecpg = "<table><tr><td>" + reports.i18n[ 3 ] + "(" + countcpg + ")</td></tr>" + tablecpg + "</table><br />";
|
542 |
-
}
|
543 |
-
if ( countdrt ) {
|
544 |
-
tabledrt = "<table><tr><td>" + reports.i18n[ 4 ] + "(" + countdrt + ")</td></tr></table><br />";
|
545 |
-
}
|
546 |
-
return ( "<p><center><strong>" + pageTitle + "</strong></center></p>" + tablerfr + tablekwd + tablescl + tablecpg + tabledrt );
|
547 |
-
},
|
548 |
-
|
549 |
-
rtRefresh : function () {
|
550 |
-
if ( reports.render.focusFlag ) {
|
551 |
-
postData.from = false;
|
552 |
-
postData.to = false;
|
553 |
-
postData.query = 'realtime';
|
554 |
-
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
555 |
-
if ( jQuery.isArray( response ) ) {
|
556 |
-
jQuery( '#gadwp-reports' + slug ).show();
|
557 |
-
reports.realtime = response[ 0 ];
|
558 |
-
reports.drawRealtime( reports.realtime );
|
559 |
-
} else {
|
560 |
-
reports.throwDebug( response );
|
561 |
-
}
|
562 |
-
|
563 |
-
NProgress.done();
|
564 |
-
|
565 |
-
} );
|
566 |
-
}
|
567 |
-
},
|
568 |
-
|
569 |
-
drawRealtime : function ( rtData ) {
|
570 |
-
var rtInfoRight, uPagePath, uReferrals, uKeywords, uSocial, uCustom, i = 0, pagepath = [], referrals = [], keywords = [], social = [], visittype = [], custom = [], uPagePathStats = [], pgStatsTable = "", uReferrals = [], uKeywords = [], uSocial = [], uCustom = [], uVisitType = [ "REFERRAL", "ORGANIC", "SOCIAL", "CUSTOM" ], uVisitorType = [ "DIRECT", "NEW" ];
|
571 |
-
|
572 |
-
jQuery( function () {
|
573 |
-
jQuery( '#gadwp-widget *' ).tooltip( {
|
574 |
-
tooltipClass : "gadwp"
|
575 |
-
} );
|
576 |
-
} );
|
577 |
-
|
578 |
-
rtData = rtData[ 0 ];
|
579 |
-
|
580 |
-
if ( jQuery.isNumeric( rtData ) || typeof rtData === "undefined" ) {
|
581 |
-
rtData = [];
|
582 |
-
rtData[ "totalsForAllResults" ] = []
|
583 |
-
rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] = "0";
|
584 |
-
rtData[ "rows" ] = [];
|
585 |
-
}
|
586 |
-
|
587 |
-
if ( rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] !== document.getElementById( "gadwp-online" ).innerHTML ) {
|
588 |
-
jQuery( "#gadwp-online" ).fadeOut( "slow" );
|
589 |
-
jQuery( "#gadwp-online" ).fadeOut( 500 );
|
590 |
-
jQuery( "#gadwp-online" ).fadeOut( "slow", function () {
|
591 |
-
if ( ( parseInt( rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] ) ) < ( parseInt( document.getElementById( "gadwp-online" ).innerHTML ) ) ) {
|
592 |
-
jQuery( "#gadwp-online" ).css( {
|
593 |
-
'background-color' : '#FFE8E8'
|
594 |
-
} );
|
595 |
-
} else {
|
596 |
-
jQuery( "#gadwp-online" ).css( {
|
597 |
-
'background-color' : '#E0FFEC'
|
598 |
-
} );
|
599 |
-
}
|
600 |
-
document.getElementById( "gadwp-online" ).innerHTML = rtData[ "totalsForAllResults" ][ "rt:activeUsers" ];
|
601 |
-
} );
|
602 |
-
jQuery( "#gadwp-online" ).fadeIn( "slow" );
|
603 |
-
jQuery( "#gadwp-online" ).fadeIn( 500 );
|
604 |
-
jQuery( "#gadwp-online" ).fadeIn( "slow", function () {
|
605 |
-
jQuery( "#gadwp-online" ).css( {
|
606 |
-
'background-color' : '#FFFFFF'
|
607 |
-
} );
|
608 |
-
} );
|
609 |
-
}
|
610 |
-
|
611 |
-
if ( rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] == 0 ) {
|
612 |
-
rtData[ "rows" ] = [];
|
613 |
-
}
|
614 |
-
|
615 |
-
for ( i = 0; i < rtData[ "rows" ].length; i++ ) {
|
616 |
-
pagepath.push( rtData[ "rows" ][ i ][ 0 ] );
|
617 |
-
if ( rtData[ "rows" ][ i ][ 3 ] == "REFERRAL" ) {
|
618 |
-
referrals.push( rtData[ "rows" ][ i ][ 1 ] );
|
619 |
-
}
|
620 |
-
if ( rtData[ "rows" ][ i ][ 3 ] == "ORGANIC" ) {
|
621 |
-
keywords.push( rtData[ "rows" ][ i ][ 2 ] );
|
622 |
-
}
|
623 |
-
if ( rtData[ "rows" ][ i ][ 3 ] == "SOCIAL" ) {
|
624 |
-
social.push( rtData[ "rows" ][ i ][ 1 ] );
|
625 |
-
}
|
626 |
-
if ( rtData[ "rows" ][ i ][ 3 ] == "CUSTOM" ) {
|
627 |
-
custom.push( rtData[ "rows" ][ i ][ 1 ] );
|
628 |
-
}
|
629 |
-
visittype.push( rtData[ "rows" ][ i ][ 3 ] );
|
630 |
-
}
|
631 |
-
|
632 |
-
uPagePath = pagepath.filter( reports.rtOnlyUniqueValues );
|
633 |
-
for ( i = 0; i < uPagePath.length; i++ ) {
|
634 |
-
uPagePathStats[ i ] = {
|
635 |
-
"pagepath" : uPagePath[ i ],
|
636 |
-
"count" : reports.rtCountSessions( rtData, uPagePath[ i ] )
|
637 |
-
}
|
638 |
-
}
|
639 |
-
uPagePathStats.sort( function ( a, b ) {
|
640 |
-
return b.count - a.count
|
641 |
-
} );
|
642 |
-
|
643 |
-
pgStatsTable = "";
|
644 |
-
for ( i = 0; i < uPagePathStats.length; i++ ) {
|
645 |
-
if ( i < gadwpItemData.rtLimitPages ) {
|
646 |
-
pgStatsTable += '<div class="gadwp-pline"><div class="gadwp-pleft"><a href="#" data-gadwp="' + reports.rtPageDetails( rtData, uPagePathStats[ i ].pagepath ) + '">' + uPagePathStats[ i ].pagepath.substring( 0, 70 ) + '</a></div><div class="gadwp-pright">' + uPagePathStats[ i ].count + '</div></div>';
|
647 |
-
}
|
648 |
-
}
|
649 |
-
document.getElementById( "gadwp-pages" ).innerHTML = '<br /><div class="gadwp-pg">' + pgStatsTable + '</div>';
|
650 |
-
|
651 |
-
uReferrals = referrals.filter( reports.rtOnlyUniqueValues );
|
652 |
-
for ( i = 0; i < uReferrals.length; i++ ) {
|
653 |
-
uReferrals[ i ] = {
|
654 |
-
"value" : uReferrals[ i ],
|
655 |
-
"count" : reports.rtCountSessions( rtData, uReferrals[ i ] )
|
656 |
-
};
|
657 |
-
}
|
658 |
-
uReferrals.sort( function ( a, b ) {
|
659 |
-
return b.count - a.count
|
660 |
-
} );
|
661 |
-
|
662 |
-
uKeywords = keywords.filter( reports.rtOnlyUniqueValues );
|
663 |
-
for ( i = 0; i < uKeywords.length; i++ ) {
|
664 |
-
uKeywords[ i ] = {
|
665 |
-
"value" : uKeywords[ i ],
|
666 |
-
"count" : reports.rtCountSessions( rtData, uKeywords[ i ] )
|
667 |
-
};
|
668 |
-
}
|
669 |
-
uKeywords.sort( function ( a, b ) {
|
670 |
-
return b.count - a.count
|
671 |
-
} );
|
672 |
-
|
673 |
-
uSocial = social.filter( reports.rtOnlyUniqueValues );
|
674 |
-
for ( i = 0; i < uSocial.length; i++ ) {
|
675 |
-
uSocial[ i ] = {
|
676 |
-
"value" : uSocial[ i ],
|
677 |
-
"count" : reports.rtCountSessions( rtData, uSocial[ i ] )
|
678 |
-
};
|
679 |
-
}
|
680 |
-
uSocial.sort( function ( a, b ) {
|
681 |
-
return b.count - a.count
|
682 |
-
} );
|
683 |
-
|
684 |
-
uCustom = custom.filter( reports.rtOnlyUniqueValues );
|
685 |
-
for ( i = 0; i < uCustom.length; i++ ) {
|
686 |
-
uCustom[ i ] = {
|
687 |
-
"value" : uCustom[ i ],
|
688 |
-
"count" : reports.rtCountSessions( rtData, uCustom[ i ] )
|
689 |
-
};
|
690 |
-
}
|
691 |
-
uCustom.sort( function ( a, b ) {
|
692 |
-
return b.count - a.count
|
693 |
-
} );
|
694 |
-
|
695 |
-
rtInfoRight = '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uReferrals ) + '"><div class="gadwp-bleft">' + reports.i18n[ 0 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 0 ] ) + '</div></div>';
|
696 |
-
rtInfoRight += '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uKeywords ) + '"><div class="gadwp-bleft">' + reports.i18n[ 1 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 1 ] ) + '</div></div>';
|
697 |
-
rtInfoRight += '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uSocial ) + '"><div class="gadwp-bleft">' + reports.i18n[ 2 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 2 ] ) + '</div></div>';
|
698 |
-
rtInfoRight += '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uCustom ) + '"><div class="gadwp-bleft">' + reports.i18n[ 3 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 3 ] ) + '</div></div>';
|
699 |
-
|
700 |
-
rtInfoRight += '<div class="gadwp-bigtext"><div class="gadwp-bleft">' + reports.i18n[ 4 ] + '</div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitorType[ 0 ] ) + '</div></div>';
|
701 |
-
rtInfoRight += '<div class="gadwp-bigtext"><div class="gadwp-bleft">' + reports.i18n[ 5 ] + '</div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitorType[ 1 ] ) + '</div></div>';
|
702 |
-
|
703 |
-
document.getElementById( "gadwp-tdo-right" ).innerHTML = rtInfoRight;
|
704 |
-
},
|
705 |
-
|
706 |
-
throwDebug : function ( response ) {
|
707 |
-
jQuery( "#gadwp-status" + slug ).css( {
|
708 |
-
"margin-top" : "3px",
|
709 |
-
"padding-left" : "5px",
|
710 |
-
"height" : "auto",
|
711 |
-
"color" : "#000",
|
712 |
-
"border-left" : "5px solid red"
|
713 |
-
} );
|
714 |
-
if ( response == '-24' ) {
|
715 |
-
jQuery( "#gadwp-status" + slug ).html( gadwpItemData.i18n[ 15 ] );
|
716 |
-
} else {
|
717 |
-
jQuery( "#gadwp-reports" + slug ).css( {
|
718 |
-
"background-color" : "#F7F7F7",
|
719 |
-
"height" : "auto",
|
720 |
-
"margin-top" : "10px",
|
721 |
-
"padding-top" : "50px",
|
722 |
-
"padding-bottom" : "50px",
|
723 |
-
"color" : "#000",
|
724 |
-
"text-align" : "center"
|
725 |
-
} );
|
726 |
-
jQuery( "#gadwp-reports" + slug ).html ( response );
|
727 |
-
jQuery( "#gadwp-reports" + slug ).show();
|
728 |
-
jQuery( "#gadwp-status" + slug ).html( gadwpItemData.i18n[ 11 ] );
|
729 |
-
console.log( "\n********************* GADWP Log ********************* \n\n" + response );
|
730 |
-
postData = {
|
731 |
-
action : 'gadwp_set_error',
|
732 |
-
response : response,
|
733 |
-
gadwp_security_set_error : gadwpItemData.security,
|
734 |
-
}
|
735 |
-
jQuery.post( gadwpItemData.ajaxurl, postData );
|
736 |
-
}
|
737 |
-
},
|
738 |
-
|
739 |
-
throwError : function ( target, response, p ) {
|
740 |
-
jQuery( target ).css( {
|
741 |
-
"background-color" : "#F7F7F7",
|
742 |
-
"height" : "auto",
|
743 |
-
"padding-top" : p,
|
744 |
-
"padding-bottom" : p,
|
745 |
-
"color" : "#000",
|
746 |
-
"text-align" : "center"
|
747 |
-
} );
|
748 |
-
if ( response == -21 ) {
|
749 |
-
jQuery( target ).html( gadwpItemData.i18n[ 12 ] + ' (' + response + ')' );
|
750 |
-
} else {
|
751 |
-
jQuery( target ).html( gadwpItemData.i18n[ 13 ] + ' (' + response + ')' );
|
752 |
-
}
|
753 |
-
},
|
754 |
-
|
755 |
-
render : function ( view, period, query ) {
|
756 |
-
var projectId, from, to, tpl, focusFlag;
|
757 |
-
|
758 |
-
if ( period == 'realtime' ) {
|
759 |
-
jQuery( '#gadwp-sel-report' + slug ).hide();
|
760 |
-
} else {
|
761 |
-
jQuery( '#gadwp-sel-report' + slug ).show();
|
762 |
-
clearInterval( reports.rtRuns );
|
763 |
-
}
|
764 |
-
|
765 |
-
jQuery( '#gadwp-status' + slug ).html( '' );
|
766 |
-
switch ( period ) {
|
767 |
-
case 'today':
|
768 |
-
from = 'today';
|
769 |
-
to = 'today';
|
770 |
-
break;
|
771 |
-
case 'yesterday':
|
772 |
-
from = 'yesterday';
|
773 |
-
to = 'yesterday';
|
774 |
-
break;
|
775 |
-
case '7daysAgo':
|
776 |
-
from = '7daysAgo';
|
777 |
-
to = 'yesterday';
|
778 |
-
break;
|
779 |
-
case '14daysAgo':
|
780 |
-
from = '14daysAgo';
|
781 |
-
to = 'yesterday';
|
782 |
-
break;
|
783 |
-
case '90daysAgo':
|
784 |
-
from = '90daysAgo';
|
785 |
-
to = 'yesterday';
|
786 |
-
break;
|
787 |
-
case '365daysAgo':
|
788 |
-
from = '365daysAgo';
|
789 |
-
to = 'yesterday';
|
790 |
-
break;
|
791 |
-
case '1095daysAgo':
|
792 |
-
from = '1095daysAgo';
|
793 |
-
to = 'yesterday';
|
794 |
-
break;
|
795 |
-
default:
|
796 |
-
from = '30daysAgo';
|
797 |
-
to = 'yesterday';
|
798 |
-
break;
|
799 |
-
}
|
800 |
-
|
801 |
-
tools.setCookie( 'default_metric', query );
|
802 |
-
tools.setCookie( 'default_dimension', period );
|
803 |
-
|
804 |
-
if ( typeof view !== 'undefined' ) {
|
805 |
-
tools.setCookie( 'default_view', view );
|
806 |
-
projectId = view;
|
807 |
-
} else {
|
808 |
-
projectId = false;
|
809 |
-
}
|
810 |
-
|
811 |
-
if ( gadwpItemData.scope == 'admin-item' ) {
|
812 |
-
postData = {
|
813 |
-
action : 'gadwp_backend_item_reports',
|
814 |
-
gadwp_security_backend_item_reports : gadwpItemData.security,
|
815 |
-
from : from,
|
816 |
-
to : to,
|
817 |
-
filter : itemId
|
818 |
-
}
|
819 |
-
} else if ( gadwpItemData.scope == 'front-item' ) {
|
820 |
-
postData = {
|
821 |
-
action : 'gadwp_frontend_item_reports',
|
822 |
-
gadwp_security_frontend_item_reports : gadwpItemData.security,
|
823 |
-
from : from,
|
824 |
-
to : to,
|
825 |
-
filter : gadwpItemData.filter
|
826 |
-
}
|
827 |
-
} else {
|
828 |
-
postData = {
|
829 |
-
action : 'gadwp_backend_item_reports',
|
830 |
-
gadwp_security_backend_item_reports : gadwpItemData.security,
|
831 |
-
projectId : projectId,
|
832 |
-
from : from,
|
833 |
-
to : to
|
834 |
-
}
|
835 |
-
}
|
836 |
-
if ( period == 'realtime' ) {
|
837 |
-
|
838 |
-
reports.i18n = gadwpItemData.i18n.slice( 20, 26 );
|
839 |
-
|
840 |
-
reports.render.focusFlag = 1;
|
841 |
-
|
842 |
-
jQuery( window ).bind( "focus", function ( event ) {
|
843 |
-
reports.render.focusFlag = 1;
|
844 |
-
} ).bind( "blur", function ( event ) {
|
845 |
-
reports.render.focusFlag = 0;
|
846 |
-
} );
|
847 |
-
|
848 |
-
tpl = '<div id="gadwp-realtime' + slug + '">';
|
849 |
-
tpl += '<div class="gadwp-rt-box">';
|
850 |
-
tpl += '<div class="gadwp-tdo-left">';
|
851 |
-
tpl += '<div class="gadwp-online" id="gadwp-online">0</div>';
|
852 |
-
tpl += '</div>';
|
853 |
-
tpl += '<div class="gadwp-tdo-right" id="gadwp-tdo-right">';
|
854 |
-
tpl += '<div class="gadwp-bigtext">';
|
855 |
-
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 0 ] + '</div>';
|
856 |
-
tpl += '<div class="gadwp-bright">0</div>';
|
857 |
-
tpl += '</div>';
|
858 |
-
tpl += '<div class="gadwp-bigtext">';
|
859 |
-
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 1 ] + '</div>';
|
860 |
-
tpl += '<div class="gadwp-bright">0</div>';
|
861 |
-
tpl += '</div>';
|
862 |
-
tpl += '<div class="gadwp-bigtext">';
|
863 |
-
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 2 ] + '</div>';
|
864 |
-
tpl += '<div class="gadwp-bright">0</div>';
|
865 |
-
tpl += '</div>';
|
866 |
-
tpl += '<div class="gadwp-bigtext">';
|
867 |
-
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 3 ] + '</div>';
|
868 |
-
tpl += '<div class="gadwp-bright">0</div>';
|
869 |
-
tpl += '</div>';
|
870 |
-
tpl += '<div class="gadwp-bigtext">';
|
871 |
-
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 4 ] + '</div>';
|
872 |
-
tpl += '<div class="gadwp-bright">0</div>';
|
873 |
-
tpl += '</div>';
|
874 |
-
tpl += '<div class="gadwp-bigtext">';
|
875 |
-
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 5 ] + '</div>';
|
876 |
-
tpl += '<div class="gadwp-bright">0</div>';
|
877 |
-
tpl += '</div>';
|
878 |
-
tpl += '</div>';
|
879 |
-
tpl += '</div>';
|
880 |
-
tpl += '<div>';
|
881 |
-
tpl += '<div id="gadwp-pages" class="gadwp-pages"> </div>';
|
882 |
-
tpl += '</div>';
|
883 |
-
tpl += '</div>';
|
884 |
-
|
885 |
-
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
886 |
-
|
887 |
-
reports.rtRefresh( reports.render.focusFlag );
|
888 |
-
|
889 |
-
reports.rtRuns = setInterval( reports.rtRefresh, 55000 );
|
890 |
-
|
891 |
-
} else {
|
892 |
-
if ( jQuery.inArray( query, [ 'referrers', 'contentpages', 'searches' ] ) > -1 ) {
|
893 |
-
|
894 |
-
tpl = '<div id="gadwp-orgcharttablechart' + slug + '">';
|
895 |
-
tpl += '<div id="gadwp-orgchart' + slug + '"></div>';
|
896 |
-
tpl += '<div id="gadwp-tablechart' + slug + '"></div>';
|
897 |
-
tpl += '</div>';
|
898 |
-
|
899 |
-
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
900 |
-
jQuery( '#gadwp-reports' + slug ).hide();
|
901 |
-
|
902 |
-
postData.query = 'channelGrouping,' + query;
|
903 |
-
|
904 |
-
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
905 |
-
reports.orgChartTableChart( response );
|
906 |
-
} );
|
907 |
-
} else if ( query == '404errors' ) {
|
908 |
-
tpl = '<div id="gadwp-404tablechart' + slug + '">';
|
909 |
-
tpl += '<div id="gadwp-tablechart' + slug + '"></div>';
|
910 |
-
tpl += '</div>';
|
911 |
-
|
912 |
-
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
913 |
-
jQuery( '#gadwp-reports' + slug ).hide();
|
914 |
-
|
915 |
-
postData.query = query;
|
916 |
-
|
917 |
-
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
918 |
-
reports.tableChart( response );
|
919 |
-
} );
|
920 |
-
} else if ( query == 'trafficdetails' || query == 'technologydetails' ) {
|
921 |
-
|
922 |
-
tpl = '<div id="gadwp-orgchartpiecharts' + slug + '">';
|
923 |
-
tpl += '<div id="gadwp-orgchart' + slug + '"></div>';
|
924 |
-
tpl += '<div class="gadwp-floatwraper">';
|
925 |
-
tpl += '<div id="gadwp-piechart-1' + slug + '" class="halfsize floatleft"></div>';
|
926 |
-
tpl += '<div id="gadwp-piechart-2' + slug + '" class="halfsize floatright"></div>';
|
927 |
-
tpl += '</div>';
|
928 |
-
tpl += '<div class="gadwp-floatwraper">';
|
929 |
-
tpl += '<div id="gadwp-piechart-3' + slug + '" class="halfsize floatleft"></div>';
|
930 |
-
tpl += '<div id="gadwp-piechart-4' + slug + '" class="halfsize floatright"></div>';
|
931 |
-
tpl += '</div>';
|
932 |
-
tpl += '</div>';
|
933 |
-
|
934 |
-
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
935 |
-
jQuery( '#gadwp-reports' + slug ).hide();
|
936 |
-
if ( query == 'trafficdetails' ) {
|
937 |
-
postData.query = 'channelGrouping,medium,visitorType,source,socialNetwork';
|
938 |
-
reports.i18n = gadwpItemData.i18n.slice( 0, 5 );
|
939 |
-
} else {
|
940 |
-
reports.i18n = gadwpItemData.i18n.slice( 15, 20 );
|
941 |
-
postData.query = 'deviceCategory,browser,operatingSystem,screenResolution,mobileDeviceBranding';
|
942 |
-
}
|
943 |
-
|
944 |
-
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
945 |
-
reports.orgChartPieCharts( response )
|
946 |
-
} );
|
947 |
-
|
948 |
-
} else if ( query == 'locations' ) {
|
949 |
-
|
950 |
-
tpl = '<div id="gadwp-geocharttablechart' + slug + '">';
|
951 |
-
tpl += '<div id="gadwp-geochart' + slug + '"></div>';
|
952 |
-
tpl += '<div id="gadwp-tablechart' + slug + '"></div>';
|
953 |
-
tpl += '</div>';
|
954 |
-
|
955 |
-
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
956 |
-
jQuery( '#gadwp-reports' + slug ).hide();
|
957 |
-
|
958 |
-
postData.query = query;
|
959 |
-
|
960 |
-
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
961 |
-
reports.geoChartTableChart( response );
|
962 |
-
} );
|
963 |
-
|
964 |
-
} else {
|
965 |
-
|
966 |
-
tpl = '<div id="gadwp-areachartbottomstats' + slug + '">';
|
967 |
-
tpl += '<div id="gadwp-areachart' + slug + '"></div>';
|
968 |
-
tpl += '<div id="gadwp-bottomstats' + slug + '">';
|
969 |
-
tpl += '<div class="inside">';
|
970 |
-
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 5 ] + '</h3><p id="gdsessions' + slug + '"> </p></div>';
|
971 |
-
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 6 ] + '</h3><p id="gdusers' + slug + '"> </p></div>';
|
972 |
-
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 7 ] + '</h3><p id="gdpageviews' + slug + '"> </p></div>';
|
973 |
-
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 8 ] + '</h3><p id="gdbouncerate' + slug + '"> </p></div>';
|
974 |
-
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 9 ] + '</h3><p id="gdorganicsearch' + slug + '"> </p></div>';
|
975 |
-
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 10 ] + '</h3><p id="gdpagespervisit' + slug + '"> </p></div>';
|
976 |
-
tpl += '</div>';
|
977 |
-
tpl += '</div>';
|
978 |
-
tpl += '</div>';
|
979 |
-
|
980 |
-
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
981 |
-
jQuery( '#gadwp-reports' + slug ).hide();
|
982 |
-
|
983 |
-
postData.query = query + ',bottomstats';
|
984 |
-
|
985 |
-
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
986 |
-
reports.areaChartBottomStats( response );
|
987 |
-
} );
|
988 |
-
|
989 |
-
}
|
990 |
-
|
991 |
-
}
|
992 |
-
|
993 |
-
},
|
994 |
-
|
995 |
-
refresh : function () {
|
996 |
-
if ( jQuery( '#gadwp-areachartbottomstats' + slug ).length > 0 && jQuery.isArray( reports.areaChartBottomStatsData ) ) {
|
997 |
-
reports.areaChartBottomStats( reports.areaChartBottomStatsData );
|
998 |
-
}
|
999 |
-
if ( jQuery( '#gadwp-orgchartpiecharts' + slug ).length > 0 && jQuery.isArray( reports.orgChartPieChartsData ) ) {
|
1000 |
-
reports.orgChartPieCharts( reports.orgChartPieChartsData );
|
1001 |
-
}
|
1002 |
-
if ( jQuery( '#gadwp-geocharttablechart' + slug ).length > 0 && jQuery.isArray( reports.geoChartTableChartData ) ) {
|
1003 |
-
reports.geoChartTableChart( reports.geoChartTableChartData );
|
1004 |
-
}
|
1005 |
-
if ( jQuery( '#gadwp-orgcharttablechart' + slug ).length > 0 && jQuery.isArray( reports.orgChartTableChartData ) ) {
|
1006 |
-
reports.orgChartTableChart( reports.orgChartTableChartData );
|
1007 |
-
}
|
1008 |
-
if ( jQuery( '#gadwp-404tablechart' + slug ).length > 0 && jQuery.isArray( reports.tableChartData ) ) {
|
1009 |
-
reports.tableChart( reports.tableChartData );
|
1010 |
-
}
|
1011 |
-
},
|
1012 |
-
|
1013 |
-
init : function () {
|
1014 |
-
|
1015 |
-
if ( !jQuery( "#gadwp-reports" + slug ).length ) {
|
1016 |
-
return;
|
1017 |
-
}
|
1018 |
-
|
1019 |
-
if ( jQuery( "#gadwp-reports" + slug ).html().length ) { // only when report is empty
|
1020 |
-
return;
|
1021 |
-
}
|
1022 |
-
|
1023 |
-
try {
|
1024 |
-
NProgress.configure( {
|
1025 |
-
parent : "#gadwp-progressbar" + slug,
|
1026 |
-
showSpinner : false
|
1027 |
-
} );
|
1028 |
-
NProgress.start();
|
1029 |
-
} catch ( e ) {
|
1030 |
-
reports.alertMessage( gadwpItemData.i18n[ 0 ] );
|
1031 |
-
}
|
1032 |
-
|
1033 |
-
reports.render( jQuery( '#gadwp-sel-view' + slug ).val(), jQuery( '#gadwp-sel-period' + slug ).val(), jQuery( '#gadwp-sel-report' + slug ).val() );
|
1034 |
-
|
1035 |
-
jQuery( window ).resize( function () {
|
1036 |
-
var diff = jQuery(window).width() - reports.oldViewPort;
|
1037 |
-
if ( ( diff < -5 ) || ( diff > 5 ) ) {
|
1038 |
-
reports.oldViewPort = jQuery(window).width();
|
1039 |
-
reports.refresh(); //refresh only on over 5px viewport width changes
|
1040 |
-
}
|
1041 |
-
} );
|
1042 |
-
}
|
1043 |
-
}
|
1044 |
-
|
1045 |
-
template.init();
|
1046 |
-
|
1047 |
-
reports.init();
|
1048 |
-
|
1049 |
-
jQuery( '#gadwp-sel-view' + slug ).change( function () {
|
1050 |
-
jQuery( '#gadwp-reports' + slug ).html( '' );
|
1051 |
-
reports.init();
|
1052 |
-
} );
|
1053 |
-
|
1054 |
-
jQuery( '#gadwp-sel-period' + slug ).change( function () {
|
1055 |
-
jQuery( '#gadwp-reports' + slug ).html( '' );
|
1056 |
-
reports.init();
|
1057 |
-
} );
|
1058 |
-
|
1059 |
-
jQuery( '#gadwp-sel-report' + slug ).change( function () {
|
1060 |
-
jQuery( '#gadwp-reports' + slug ).html( '' );
|
1061 |
-
reports.init();
|
1062 |
-
} );
|
1063 |
-
|
1064 |
-
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
1065 |
-
return;
|
1066 |
-
} else {
|
1067 |
-
return this.dialog( {
|
1068 |
-
width : 'auto',
|
1069 |
-
maxWidth : 510,
|
1070 |
-
height : 'auto',
|
1071 |
-
modal : true,
|
1072 |
-
fluid : true,
|
1073 |
-
dialogClass : 'gadwp wp-dialog',
|
1074 |
-
resizable : false,
|
1075 |
-
title : reports.getTitle( gadwpItemData.scope ),
|
1076 |
-
position : {
|
1077 |
-
my : "top",
|
1078 |
-
at : "top+100",
|
1079 |
-
of : window
|
1080 |
-
}
|
1081 |
-
} );
|
1082 |
-
}
|
1083 |
-
}
|
1084 |
-
} );
|
1085 |
-
|
1086 |
-
function GADWPReportLoad () {
|
1087 |
-
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
1088 |
-
jQuery( '#gadwp-window-1' ).gadwpItemReport( 1 );
|
1089 |
-
} else {
|
1090 |
-
jQuery( gadwpItemData.getSelector( gadwpItemData.scope ) ).click( function () {
|
1091 |
-
if ( !jQuery( "#gadwp-window-" + gadwpItemData.getID( this ) ).length > 0 ) {
|
1092 |
-
jQuery( "body" ).append( '<div id="gadwp-window-' + gadwpItemData.getID( this ) + '"></div>' );
|
1093 |
-
}
|
1094 |
-
jQuery( '#gadwp-window-' + gadwpItemData.getID( this ) ).gadwpItemReport( gadwpItemData.getID( this ) );
|
1095 |
-
} );
|
1096 |
-
}
|
1097 |
-
|
1098 |
-
// on window resize
|
1099 |
-
jQuery( window ).resize( function () {
|
1100 |
-
gadwpItemData.responsiveDialog();
|
1101 |
-
} );
|
1102 |
-
|
1103 |
-
// dialog width larger than viewport
|
1104 |
-
jQuery( document ).on( "dialogopen", ".ui-dialog", function ( event, ui ) {
|
1105 |
-
gadwpItemData.responsiveDialog();
|
1106 |
-
} );
|
1107 |
-
}
|
1 |
+
/*-
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
"use strict";
|
10 |
+
|
11 |
+
google.charts.load('current', {mapsApiKey: gadwpItemData.mapsApiKey, 'packages':['corechart', 'table', 'orgchart', 'geochart']});
|
12 |
+
google.charts.setOnLoadCallback( GADWPReportLoad );
|
13 |
+
|
14 |
+
// Get the numeric ID
|
15 |
+
gadwpItemData.getID = function ( item ) {
|
16 |
+
if ( gadwpItemData.scope == 'admin-item' ) {
|
17 |
+
if ( typeof item.id == "undefined" ) {
|
18 |
+
return 0
|
19 |
+
}
|
20 |
+
if ( item.id.split( '-' )[ 1 ] == "undefined" ) {
|
21 |
+
return 0;
|
22 |
+
} else {
|
23 |
+
return item.id.split( '-' )[ 1 ];
|
24 |
+
}
|
25 |
+
} else {
|
26 |
+
if ( typeof item.id == "undefined" ) {
|
27 |
+
return 1;
|
28 |
+
}
|
29 |
+
if ( item.id.split( '-' )[ 4 ] == "undefined" ) {
|
30 |
+
return 1;
|
31 |
+
} else {
|
32 |
+
return item.id.split( '-' )[ 4 ];
|
33 |
+
}
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
// Get the selector
|
38 |
+
gadwpItemData.getSelector = function ( scope ) {
|
39 |
+
if ( scope == 'admin-item' ) {
|
40 |
+
return 'a[id^="gadwp-"]';
|
41 |
+
} else {
|
42 |
+
return 'li[id^="wp-admin-bar-gadwp"]';
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
gadwpItemData.responsiveDialog = function () {
|
47 |
+
var dialog, wWidth, visible;
|
48 |
+
|
49 |
+
visible = jQuery( ".ui-dialog:visible" );
|
50 |
+
|
51 |
+
// on each visible dialog
|
52 |
+
visible.each( function () {
|
53 |
+
dialog = jQuery( this ).find( ".ui-dialog-content" ).data( "ui-dialog" );
|
54 |
+
// on each fluid dialog
|
55 |
+
if ( dialog.options.fluid ) {
|
56 |
+
wWidth = jQuery( window ).width();
|
57 |
+
// window width vs dialog width
|
58 |
+
if ( wWidth < ( parseInt( dialog.options.maxWidth ) + 50 ) ) {
|
59 |
+
// don't fill the entire screen
|
60 |
+
jQuery( this ).css( "max-width", "90%" );
|
61 |
+
} else {
|
62 |
+
// maxWidth bug fix
|
63 |
+
jQuery( this ).css( "max-width", dialog.options.maxWidth + "px" );
|
64 |
+
}
|
65 |
+
// change dialog position
|
66 |
+
dialog.option( "position", dialog.options.position );
|
67 |
+
}
|
68 |
+
} );
|
69 |
+
}
|
70 |
+
|
71 |
+
jQuery.fn.extend( {
|
72 |
+
gadwpItemReport : function ( itemId ) {
|
73 |
+
var postData, tools, template, reports, refresh, init, slug = "-" + itemId;
|
74 |
+
|
75 |
+
tools = {
|
76 |
+
setCookie : function ( name, value ) {
|
77 |
+
var expires, dateItem = new Date();
|
78 |
+
|
79 |
+
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
80 |
+
name = "gadwp_wg_" + name;
|
81 |
+
} else {
|
82 |
+
name = "gadwp_ir_" + name;
|
83 |
+
}
|
84 |
+
dateItem.setTime( dateItem.getTime() + ( 24 * 60 * 60 * 1000 * 7 ) );
|
85 |
+
expires = "expires=" + dateItem.toUTCString();
|
86 |
+
document.cookie = name + "=" + value + "; " + expires + "; path=/";
|
87 |
+
},
|
88 |
+
getCookie : function ( name ) {
|
89 |
+
var cookie, cookiesArray, div, i = 0;
|
90 |
+
|
91 |
+
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
92 |
+
name = "gadwp_wg_" + name + "=";
|
93 |
+
} else {
|
94 |
+
name = "gadwp_ir_" + name + "=";
|
95 |
+
}
|
96 |
+
cookiesArray = document.cookie.split( ';' );
|
97 |
+
for ( i = 0; i < cookiesArray.length; i++ ) {
|
98 |
+
cookie = cookiesArray[ i ];
|
99 |
+
while ( cookie.charAt( 0 ) == ' ' )
|
100 |
+
cookie = cookie.substring( 1 );
|
101 |
+
if ( cookie.indexOf( name ) == 0 )
|
102 |
+
return cookie.substring( name.length, cookie.length );
|
103 |
+
}
|
104 |
+
return false;
|
105 |
+
},
|
106 |
+
escape : function ( str ) {
|
107 |
+
div = document.createElement( 'div' );
|
108 |
+
div.appendChild( document.createTextNode( str ) );
|
109 |
+
return div.innerHTML;
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
template = {
|
114 |
+
|
115 |
+
addOptions : function ( id, list ) {
|
116 |
+
var defaultMetric, defaultDimension, defaultView, output = [];
|
117 |
+
|
118 |
+
if ( list == false ) {
|
119 |
+
return;
|
120 |
+
}
|
121 |
+
|
122 |
+
if ( !tools.getCookie( 'default_metric' ) || !tools.getCookie( 'default_dimension' ) ) {
|
123 |
+
defaultMetric = 'sessions';
|
124 |
+
defaultDimension = '30daysAgo';
|
125 |
+
} else {
|
126 |
+
defaultMetric = tools.getCookie( 'default_metric' );
|
127 |
+
defaultDimension = tools.getCookie( 'default_dimension' );
|
128 |
+
defaultView = tools.getCookie( 'default_view' );
|
129 |
+
}
|
130 |
+
|
131 |
+
jQuery.each( list, function ( key, value ) {
|
132 |
+
if ( key == defaultMetric || key == defaultDimension || key == defaultView ) {
|
133 |
+
output.push( '<option value="' + key + '" selected="selected">' + value + '</option>' );
|
134 |
+
} else {
|
135 |
+
output.push( '<option value="' + key + '">' + value + '</option>' );
|
136 |
+
}
|
137 |
+
} );
|
138 |
+
jQuery( id ).html( output.join( '' ) );
|
139 |
+
},
|
140 |
+
|
141 |
+
init : function () {
|
142 |
+
var tpl;
|
143 |
+
|
144 |
+
if ( !jQuery( '#gadwp-window' + slug ).length ) {
|
145 |
+
return;
|
146 |
+
}
|
147 |
+
|
148 |
+
if ( jQuery( '#gadwp-window' + slug ).html().length ) { // add main template once
|
149 |
+
return;
|
150 |
+
}
|
151 |
+
|
152 |
+
tpl = '<div id="gadwp-container' + slug + '">';
|
153 |
+
if ( gadwpItemData.viewList != false ) {
|
154 |
+
tpl += '<select id="gadwp-sel-view' + slug + '"></select>';
|
155 |
+
}
|
156 |
+
tpl += '<select id="gadwp-sel-period' + slug + '"></select> ';
|
157 |
+
tpl += '<select id="gadwp-sel-report' + slug + '"></select>';
|
158 |
+
tpl += '<div id="gadwp-progressbar' + slug + '"></div>';
|
159 |
+
tpl += '<div id="gadwp-status' + slug + '"></div>';
|
160 |
+
tpl += '<div id="gadwp-reports' + slug + '"></div>';
|
161 |
+
tpl += '<div style="text-align:right;width:100%;font-size:0.8em;clear:both;margin-right:5px;margin-top:10px;">';
|
162 |
+
tpl += gadwpItemData.i18n[ 14 ];
|
163 |
+
tpl += ' <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_report&utm_medium=link&utm_content=back_report&utm_campaign=gadwp" rel="nofollow" style="text-decoration:none;font-size:1em;">GADWP</a> ';
|
164 |
+
tpl += '</div>';
|
165 |
+
tpl += '</div>',
|
166 |
+
|
167 |
+
jQuery( '#gadwp-window' + slug ).append( tpl );
|
168 |
+
|
169 |
+
template.addOptions( '#gadwp-sel-view' + slug, gadwpItemData.viewList );
|
170 |
+
template.addOptions( '#gadwp-sel-period' + slug, gadwpItemData.dateList );
|
171 |
+
template.addOptions( '#gadwp-sel-report' + slug, gadwpItemData.reportList );
|
172 |
+
|
173 |
+
}
|
174 |
+
}
|
175 |
+
|
176 |
+
reports = {
|
177 |
+
oldViewPort: 0,
|
178 |
+
orgChartTableChartData : '',
|
179 |
+
tableChartData : '',
|
180 |
+
orgChartPieChartsData : '',
|
181 |
+
geoChartTableChartData : '',
|
182 |
+
areaChartBottomStatsData : '',
|
183 |
+
realtime : '',
|
184 |
+
rtRuns : null,
|
185 |
+
i18n : null,
|
186 |
+
|
187 |
+
getTitle : function ( scope ) {
|
188 |
+
if ( scope == 'admin-item' ) {
|
189 |
+
return jQuery( '#gadwp' + slug ).attr( "title" );
|
190 |
+
} else {
|
191 |
+
return document.getElementsByTagName( "title" )[ 0 ].innerHTML;
|
192 |
+
}
|
193 |
+
},
|
194 |
+
|
195 |
+
alertMessage : function ( msg ) {
|
196 |
+
jQuery( "#gadwp-status" + slug ).css( {
|
197 |
+
"margin-top" : "3px",
|
198 |
+
"padding-left" : "5px",
|
199 |
+
"height" : "auto",
|
200 |
+
"color" : "#000",
|
201 |
+
"border-left" : "5px solid red"
|
202 |
+
} );
|
203 |
+
jQuery( "#gadwp-status" + slug ).html( msg );
|
204 |
+
},
|
205 |
+
|
206 |
+
areaChartBottomStats : function ( response ) {
|
207 |
+
reports.areaChartBottomStatsData = response;
|
208 |
+
if ( jQuery.isArray( response ) ) {
|
209 |
+
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
210 |
+
if ( jQuery.isArray( response[ 0 ] ) ) {
|
211 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
212 |
+
if ( postData.query == 'visitBounceRate,bottomstats' ) {
|
213 |
+
reports.drawAreaChart( response[ 0 ], true );
|
214 |
+
} else {
|
215 |
+
reports.drawAreaChart( response[ 0 ], false );
|
216 |
+
}
|
217 |
+
} else {
|
218 |
+
reports.throwDebug( response[ 0 ] );
|
219 |
+
}
|
220 |
+
} else {
|
221 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
222 |
+
reports.throwError( '#gadwp-areachart' + slug, response[ 0 ], "125px" );
|
223 |
+
}
|
224 |
+
if ( !jQuery.isNumeric( response[ 1 ] ) ) {
|
225 |
+
if ( jQuery.isArray( response[ 1 ] ) ) {
|
226 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
227 |
+
reports.drawBottomStats( response[ 1 ] );
|
228 |
+
} else {
|
229 |
+
reports.throwDebug( response[ 1 ] );
|
230 |
+
}
|
231 |
+
} else {
|
232 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
233 |
+
reports.throwError( '#gadwp-bottomstats' + slug, response[ 1 ], "40px" );
|
234 |
+
}
|
235 |
+
} else {
|
236 |
+
reports.throwDebug( response );
|
237 |
+
}
|
238 |
+
NProgress.done();
|
239 |
+
|
240 |
+
},
|
241 |
+
|
242 |
+
orgChartPieCharts : function ( response ) {
|
243 |
+
var i = 0;
|
244 |
+
reports.orgChartPieChartsData = response;
|
245 |
+
if ( jQuery.isArray( response ) ) {
|
246 |
+
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
247 |
+
if ( jQuery.isArray( response[ 0 ] ) ) {
|
248 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
249 |
+
reports.drawOrgChart( response[ 0 ] );
|
250 |
+
} else {
|
251 |
+
reports.throwDebug( response[ 0 ] );
|
252 |
+
}
|
253 |
+
} else {
|
254 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
255 |
+
reports.throwError( '#gadwp-orgchart' + slug, response[ 0 ], "125px" );
|
256 |
+
}
|
257 |
+
|
258 |
+
for ( i = 1; i < response.length; i++ ) {
|
259 |
+
if ( !jQuery.isNumeric( response[ i ] ) ) {
|
260 |
+
if ( jQuery.isArray( response[ i ] ) ) {
|
261 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
262 |
+
reports.drawPieChart( 'piechart-' + i, response[ i ], reports.i18n[ i ] );
|
263 |
+
} else {
|
264 |
+
reports.throwDebug( response[ i ] );
|
265 |
+
}
|
266 |
+
} else {
|
267 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
268 |
+
reports.throwError( '#gadwp-piechart-' + i + slug, response[ i ], "80px" );
|
269 |
+
}
|
270 |
+
}
|
271 |
+
} else {
|
272 |
+
reports.throwDebug( response );
|
273 |
+
}
|
274 |
+
NProgress.done();
|
275 |
+
},
|
276 |
+
|
277 |
+
geoChartTableChart : function ( response ) {
|
278 |
+
reports.geoChartTableChartData = response;
|
279 |
+
if ( jQuery.isArray( response ) ) {
|
280 |
+
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
281 |
+
if ( jQuery.isArray( response[ 0 ] ) ) {
|
282 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
283 |
+
reports.drawGeoChart( response[ 0 ] );
|
284 |
+
reports.drawTableChart( response[ 0 ] );
|
285 |
+
} else {
|
286 |
+
reports.throwDebug( response[ 0 ] );
|
287 |
+
}
|
288 |
+
} else {
|
289 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
290 |
+
reports.throwError( '#gadwp-geochart' + slug, response[ 0 ], "125px" );
|
291 |
+
reports.throwError( '#gadwp-tablechart' + slug, response[ 0 ], "125px" );
|
292 |
+
}
|
293 |
+
} else {
|
294 |
+
reports.throwDebug( response );
|
295 |
+
}
|
296 |
+
NProgress.done();
|
297 |
+
},
|
298 |
+
|
299 |
+
orgChartTableChart : function ( response ) {
|
300 |
+
reports.orgChartTableChartData = response
|
301 |
+
if ( jQuery.isArray( response ) ) {
|
302 |
+
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
303 |
+
if ( jQuery.isArray( response[ 0 ] ) ) {
|
304 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
305 |
+
reports.drawOrgChart( response[ 0 ] );
|
306 |
+
} else {
|
307 |
+
reports.throwDebug( response[ 0 ] );
|
308 |
+
}
|
309 |
+
} else {
|
310 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
311 |
+
reports.throwError( '#gadwp-orgchart' + slug, response[ 0 ], "125px" );
|
312 |
+
}
|
313 |
+
|
314 |
+
if ( !jQuery.isNumeric( response[ 1 ] ) ) {
|
315 |
+
if ( jQuery.isArray( response[ 1 ] ) ) {
|
316 |
+
reports.drawTableChart( response[ 1 ] );
|
317 |
+
} else {
|
318 |
+
reports.throwDebug( response[ 1 ] );
|
319 |
+
}
|
320 |
+
} else {
|
321 |
+
reports.throwError( '#gadwp-tablechart' + slug, response[ 1 ], "125px" );
|
322 |
+
}
|
323 |
+
} else {
|
324 |
+
reports.throwDebug( response );
|
325 |
+
}
|
326 |
+
NProgress.done();
|
327 |
+
},
|
328 |
+
|
329 |
+
tableChart : function ( response ) {
|
330 |
+
reports.tableChartData = response
|
331 |
+
if ( jQuery.isArray( response ) ) {
|
332 |
+
if ( !jQuery.isNumeric( response[ 0 ] ) ) {
|
333 |
+
if ( jQuery.isArray( response[ 0 ] ) ) {
|
334 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
335 |
+
reports.drawTableChart( response[ 0 ] );
|
336 |
+
} else {
|
337 |
+
reports.throwDebug( response[ 0 ] );
|
338 |
+
}
|
339 |
+
} else {
|
340 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
341 |
+
reports.throwError( '#gadwp-tablechart' + slug, response[ 0 ], "125px" );
|
342 |
+
}
|
343 |
+
} else {
|
344 |
+
reports.throwDebug( response );
|
345 |
+
}
|
346 |
+
NProgress.done();
|
347 |
+
},
|
348 |
+
|
349 |
+
drawTableChart : function ( data ) {
|
350 |
+
var chartData, options, chart;
|
351 |
+
|
352 |
+
chartData = google.visualization.arrayToDataTable( data );
|
353 |
+
options = {
|
354 |
+
page : 'enable',
|
355 |
+
pageSize : 10,
|
356 |
+
width : '100%',
|
357 |
+
allowHtml : true
|
358 |
+
};
|
359 |
+
chart = new google.visualization.Table( document.getElementById( 'gadwp-tablechart' + slug ) );
|
360 |
+
|
361 |
+
chart.draw( chartData, options );
|
362 |
+
},
|
363 |
+
|
364 |
+
drawOrgChart : function ( data ) {
|
365 |
+
var chartData, options, chart;
|
366 |
+
|
367 |
+
chartData = google.visualization.arrayToDataTable( data );
|
368 |
+
options = {
|
369 |
+
allowCollapse : true,
|
370 |
+
allowHtml : true,
|
371 |
+
height : '100%'
|
372 |
+
};
|
373 |
+
chart = new google.visualization.OrgChart( document.getElementById( 'gadwp-orgchart' + slug ) );
|
374 |
+
|
375 |
+
chart.draw( chartData, options );
|
376 |
+
},
|
377 |
+
|
378 |
+
drawPieChart : function ( id, data, title ) {
|
379 |
+
var chartData, options, chart;
|
380 |
+
|
381 |
+
chartData = google.visualization.arrayToDataTable( data );
|
382 |
+
options = {
|
383 |
+
is3D : false,
|
384 |
+
tooltipText : 'percentage',
|
385 |
+
legend : 'none',
|
386 |
+
chartArea : {
|
387 |
+
width : '99%',
|
388 |
+
height : '80%'
|
389 |
+
},
|
390 |
+
title : title,
|
391 |
+
pieSliceText : 'value',
|
392 |
+
colors : gadwpItemData.colorVariations
|
393 |
+
};
|
394 |
+
chart = new google.visualization.PieChart( document.getElementById( 'gadwp-' + id + slug ) );
|
395 |
+
|
396 |
+
chart.draw( chartData, options );
|
397 |
+
},
|
398 |
+
|
399 |
+
drawGeoChart : function ( data ) {
|
400 |
+
var chartData, options, chart;
|
401 |
+
|
402 |
+
chartData = google.visualization.arrayToDataTable( data );
|
403 |
+
options = {
|
404 |
+
chartArea : {
|
405 |
+
width : '99%',
|
406 |
+
height : '90%'
|
407 |
+
},
|
408 |
+
colors : [ gadwpItemData.colorVariations[ 5 ], gadwpItemData.colorVariations[ 4 ] ]
|
409 |
+
}
|
410 |
+
if ( gadwpItemData.region ) {
|
411 |
+
options.region = gadwpItemData.region;
|
412 |
+
options.displayMode = 'markers';
|
413 |
+
options.datalessRegionColor = 'EFEFEF';
|
414 |
+
}
|
415 |
+
chart = new google.visualization.GeoChart( document.getElementById( 'gadwp-geochart' + slug ) );
|
416 |
+
|
417 |
+
chart.draw( chartData, options );
|
418 |
+
},
|
419 |
+
|
420 |
+
drawAreaChart : function ( data, format ) {
|
421 |
+
var chartData, options, chart, formatter;
|
422 |
+
|
423 |
+
chartData = google.visualization.arrayToDataTable( data );
|
424 |
+
|
425 |
+
if ( format ) {
|
426 |
+
formatter = new google.visualization.NumberFormat( {
|
427 |
+
suffix : '%',
|
428 |
+
fractionDigits : 2
|
429 |
+
} );
|
430 |
+
|
431 |
+
formatter.format( chartData, 1 );
|
432 |
+
}
|
433 |
+
|
434 |
+
options = {
|
435 |
+
legend : {
|
436 |
+
position : 'none'
|
437 |
+
},
|
438 |
+
pointSize : 3,
|
439 |
+
colors : [ gadwpItemData.colorVariations[ 0 ], gadwpItemData.colorVariations[ 4 ] ],
|
440 |
+
chartArea : {
|
441 |
+
width : '99%',
|
442 |
+
height : '90%'
|
443 |
+
},
|
444 |
+
vAxis : {
|
445 |
+
textPosition : "in",
|
446 |
+
minValue : 0
|
447 |
+
},
|
448 |
+
hAxis : {
|
449 |
+
textPosition : 'none'
|
450 |
+
}
|
451 |
+
};
|
452 |
+
chart = new google.visualization.AreaChart( document.getElementById( 'gadwp-areachart' + slug ) );
|
453 |
+
|
454 |
+
chart.draw( chartData, options );
|
455 |
+
},
|
456 |
+
|
457 |
+
drawBottomStats : function ( data ) {
|
458 |
+
jQuery( "#gdsessions" + slug ).html( data[ 0 ] );
|
459 |
+
jQuery( "#gdusers" + slug ).html( data[ 1 ] );
|
460 |
+
jQuery( "#gdpageviews" + slug ).html( data[ 2 ] );
|
461 |
+
jQuery( "#gdbouncerate" + slug ).html( data[ 3 ] + "%" );
|
462 |
+
jQuery( "#gdorganicsearch" + slug ).html( data[ 4 ] );
|
463 |
+
jQuery( "#gdpagespervisit" + slug ).html( data[ 5 ] );
|
464 |
+
},
|
465 |
+
|
466 |
+
rtOnlyUniqueValues : function ( value, index, self ) {
|
467 |
+
return self.indexOf( value ) === index;
|
468 |
+
},
|
469 |
+
|
470 |
+
rtCountSessions : function ( rtData, searchValue ) {
|
471 |
+
var count = 0, i = 0;
|
472 |
+
|
473 |
+
for ( i = 0; i < rtData[ "rows" ].length; i++ ) {
|
474 |
+
if ( jQuery.inArray( searchValue, rtData[ "rows" ][ i ] ) > -1 ) {
|
475 |
+
count += parseInt( rtData[ "rows" ][ i ][ 6 ] );
|
476 |
+
}
|
477 |
+
}
|
478 |
+
return count;
|
479 |
+
},
|
480 |
+
|
481 |
+
rtGenerateTooltip : function ( rtData ) {
|
482 |
+
var count = 0, table = "", i = 0;
|
483 |
+
|
484 |
+
for ( i = 0; i < rtData.length; i++ ) {
|
485 |
+
count += parseInt( rtData[ i ].count );
|
486 |
+
table += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ].value + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ].count + "</td></tr>";
|
487 |
+
}
|
488 |
+
;
|
489 |
+
if ( count ) {
|
490 |
+
return ( "<table>" + table + "</table>" );
|
491 |
+
} else {
|
492 |
+
return ( "" );
|
493 |
+
}
|
494 |
+
},
|
495 |
+
|
496 |
+
rtPageDetails : function ( rtData, searchValue ) {
|
497 |
+
var sant, pageTitle, pgStatsTable, i = 0, j = 0, sum = 0, newsum = 0, countrfr = 0, countkwd = 0, countdrt = 0, countscl = 0, countcpg = 0, tablerfr = "", tablekwd = "", tablescl = "", tablecpg = "", tabledrt = "";
|
498 |
+
|
499 |
+
rtData = rtData[ "rows" ];
|
500 |
+
|
501 |
+
for ( i = 0; i < rtData.length; i++ ) {
|
502 |
+
|
503 |
+
if ( rtData[ i ][ 0 ] == searchValue ) {
|
504 |
+
pageTitle = rtData[ i ][ 5 ];
|
505 |
+
|
506 |
+
switch ( rtData[ i ][ 3 ] ) {
|
507 |
+
|
508 |
+
case "REFERRAL":
|
509 |
+
countrfr += parseInt( rtData[ i ][ 6 ] );
|
510 |
+
tablerfr += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 1 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
511 |
+
break;
|
512 |
+
case "ORGANIC":
|
513 |
+
countkwd += parseInt( rtData[ i ][ 6 ] );
|
514 |
+
tablekwd += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 2 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
515 |
+
break;
|
516 |
+
case "SOCIAL":
|
517 |
+
countscl += parseInt( rtData[ i ][ 6 ] );
|
518 |
+
tablescl += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 1 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
519 |
+
break;
|
520 |
+
case "CUSTOM":
|
521 |
+
countcpg += parseInt( rtData[ i ][ 6 ] );
|
522 |
+
tablecpg += "<tr><td class='gadwp-pgdetailsl'>" + rtData[ i ][ 1 ] + "</td><td class='gadwp-pgdetailsr'>" + rtData[ i ][ 6 ] + "</td></tr>";
|
523 |
+
break;
|
524 |
+
case "DIRECT":
|
525 |
+
countdrt += parseInt( rtData[ i ][ 6 ] );
|
526 |
+
break;
|
527 |
+
}
|
528 |
+
}
|
529 |
+
}
|
530 |
+
|
531 |
+
if ( countrfr ) {
|
532 |
+
tablerfr = "<table><tr><td>" + reports.i18n[ 0 ] + "(" + countrfr + ")</td></tr>" + tablerfr + "</table><br />";
|
533 |
+
}
|
534 |
+
if ( countkwd ) {
|
535 |
+
tablekwd = "<table><tr><td>" + reports.i18n[ 1 ] + "(" + countkwd + ")</td></tr>" + tablekwd + "</table><br />";
|
536 |
+
}
|
537 |
+
if ( countscl ) {
|
538 |
+
tablescl = "<table><tr><td>" + reports.i18n[ 2 ] + "(" + countscl + ")</td></tr>" + tablescl + "</table><br />";
|
539 |
+
}
|
540 |
+
if ( countcpg ) {
|
541 |
+
tablecpg = "<table><tr><td>" + reports.i18n[ 3 ] + "(" + countcpg + ")</td></tr>" + tablecpg + "</table><br />";
|
542 |
+
}
|
543 |
+
if ( countdrt ) {
|
544 |
+
tabledrt = "<table><tr><td>" + reports.i18n[ 4 ] + "(" + countdrt + ")</td></tr></table><br />";
|
545 |
+
}
|
546 |
+
return ( "<p><center><strong>" + pageTitle + "</strong></center></p>" + tablerfr + tablekwd + tablescl + tablecpg + tabledrt );
|
547 |
+
},
|
548 |
+
|
549 |
+
rtRefresh : function () {
|
550 |
+
if ( reports.render.focusFlag ) {
|
551 |
+
postData.from = false;
|
552 |
+
postData.to = false;
|
553 |
+
postData.query = 'realtime';
|
554 |
+
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
555 |
+
if ( jQuery.isArray( response ) ) {
|
556 |
+
jQuery( '#gadwp-reports' + slug ).show();
|
557 |
+
reports.realtime = response[ 0 ];
|
558 |
+
reports.drawRealtime( reports.realtime );
|
559 |
+
} else {
|
560 |
+
reports.throwDebug( response );
|
561 |
+
}
|
562 |
+
|
563 |
+
NProgress.done();
|
564 |
+
|
565 |
+
} );
|
566 |
+
}
|
567 |
+
},
|
568 |
+
|
569 |
+
drawRealtime : function ( rtData ) {
|
570 |
+
var rtInfoRight, uPagePath, uReferrals, uKeywords, uSocial, uCustom, i = 0, pagepath = [], referrals = [], keywords = [], social = [], visittype = [], custom = [], uPagePathStats = [], pgStatsTable = "", uReferrals = [], uKeywords = [], uSocial = [], uCustom = [], uVisitType = [ "REFERRAL", "ORGANIC", "SOCIAL", "CUSTOM" ], uVisitorType = [ "DIRECT", "NEW" ];
|
571 |
+
|
572 |
+
jQuery( function () {
|
573 |
+
jQuery( '#gadwp-widget *' ).tooltip( {
|
574 |
+
tooltipClass : "gadwp"
|
575 |
+
} );
|
576 |
+
} );
|
577 |
+
|
578 |
+
rtData = rtData[ 0 ];
|
579 |
+
|
580 |
+
if ( jQuery.isNumeric( rtData ) || typeof rtData === "undefined" ) {
|
581 |
+
rtData = [];
|
582 |
+
rtData[ "totalsForAllResults" ] = []
|
583 |
+
rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] = "0";
|
584 |
+
rtData[ "rows" ] = [];
|
585 |
+
}
|
586 |
+
|
587 |
+
if ( rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] !== document.getElementById( "gadwp-online" ).innerHTML ) {
|
588 |
+
jQuery( "#gadwp-online" ).fadeOut( "slow" );
|
589 |
+
jQuery( "#gadwp-online" ).fadeOut( 500 );
|
590 |
+
jQuery( "#gadwp-online" ).fadeOut( "slow", function () {
|
591 |
+
if ( ( parseInt( rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] ) ) < ( parseInt( document.getElementById( "gadwp-online" ).innerHTML ) ) ) {
|
592 |
+
jQuery( "#gadwp-online" ).css( {
|
593 |
+
'background-color' : '#FFE8E8'
|
594 |
+
} );
|
595 |
+
} else {
|
596 |
+
jQuery( "#gadwp-online" ).css( {
|
597 |
+
'background-color' : '#E0FFEC'
|
598 |
+
} );
|
599 |
+
}
|
600 |
+
document.getElementById( "gadwp-online" ).innerHTML = rtData[ "totalsForAllResults" ][ "rt:activeUsers" ];
|
601 |
+
} );
|
602 |
+
jQuery( "#gadwp-online" ).fadeIn( "slow" );
|
603 |
+
jQuery( "#gadwp-online" ).fadeIn( 500 );
|
604 |
+
jQuery( "#gadwp-online" ).fadeIn( "slow", function () {
|
605 |
+
jQuery( "#gadwp-online" ).css( {
|
606 |
+
'background-color' : '#FFFFFF'
|
607 |
+
} );
|
608 |
+
} );
|
609 |
+
}
|
610 |
+
|
611 |
+
if ( rtData[ "totalsForAllResults" ][ "rt:activeUsers" ] == 0 ) {
|
612 |
+
rtData[ "rows" ] = [];
|
613 |
+
}
|
614 |
+
|
615 |
+
for ( i = 0; i < rtData[ "rows" ].length; i++ ) {
|
616 |
+
pagepath.push( rtData[ "rows" ][ i ][ 0 ] );
|
617 |
+
if ( rtData[ "rows" ][ i ][ 3 ] == "REFERRAL" ) {
|
618 |
+
referrals.push( rtData[ "rows" ][ i ][ 1 ] );
|
619 |
+
}
|
620 |
+
if ( rtData[ "rows" ][ i ][ 3 ] == "ORGANIC" ) {
|
621 |
+
keywords.push( rtData[ "rows" ][ i ][ 2 ] );
|
622 |
+
}
|
623 |
+
if ( rtData[ "rows" ][ i ][ 3 ] == "SOCIAL" ) {
|
624 |
+
social.push( rtData[ "rows" ][ i ][ 1 ] );
|
625 |
+
}
|
626 |
+
if ( rtData[ "rows" ][ i ][ 3 ] == "CUSTOM" ) {
|
627 |
+
custom.push( rtData[ "rows" ][ i ][ 1 ] );
|
628 |
+
}
|
629 |
+
visittype.push( rtData[ "rows" ][ i ][ 3 ] );
|
630 |
+
}
|
631 |
+
|
632 |
+
uPagePath = pagepath.filter( reports.rtOnlyUniqueValues );
|
633 |
+
for ( i = 0; i < uPagePath.length; i++ ) {
|
634 |
+
uPagePathStats[ i ] = {
|
635 |
+
"pagepath" : uPagePath[ i ],
|
636 |
+
"count" : reports.rtCountSessions( rtData, uPagePath[ i ] )
|
637 |
+
}
|
638 |
+
}
|
639 |
+
uPagePathStats.sort( function ( a, b ) {
|
640 |
+
return b.count - a.count
|
641 |
+
} );
|
642 |
+
|
643 |
+
pgStatsTable = "";
|
644 |
+
for ( i = 0; i < uPagePathStats.length; i++ ) {
|
645 |
+
if ( i < gadwpItemData.rtLimitPages ) {
|
646 |
+
pgStatsTable += '<div class="gadwp-pline"><div class="gadwp-pleft"><a href="#" data-gadwp="' + reports.rtPageDetails( rtData, uPagePathStats[ i ].pagepath ) + '">' + uPagePathStats[ i ].pagepath.substring( 0, 70 ) + '</a></div><div class="gadwp-pright">' + uPagePathStats[ i ].count + '</div></div>';
|
647 |
+
}
|
648 |
+
}
|
649 |
+
document.getElementById( "gadwp-pages" ).innerHTML = '<br /><div class="gadwp-pg">' + pgStatsTable + '</div>';
|
650 |
+
|
651 |
+
uReferrals = referrals.filter( reports.rtOnlyUniqueValues );
|
652 |
+
for ( i = 0; i < uReferrals.length; i++ ) {
|
653 |
+
uReferrals[ i ] = {
|
654 |
+
"value" : uReferrals[ i ],
|
655 |
+
"count" : reports.rtCountSessions( rtData, uReferrals[ i ] )
|
656 |
+
};
|
657 |
+
}
|
658 |
+
uReferrals.sort( function ( a, b ) {
|
659 |
+
return b.count - a.count
|
660 |
+
} );
|
661 |
+
|
662 |
+
uKeywords = keywords.filter( reports.rtOnlyUniqueValues );
|
663 |
+
for ( i = 0; i < uKeywords.length; i++ ) {
|
664 |
+
uKeywords[ i ] = {
|
665 |
+
"value" : uKeywords[ i ],
|
666 |
+
"count" : reports.rtCountSessions( rtData, uKeywords[ i ] )
|
667 |
+
};
|
668 |
+
}
|
669 |
+
uKeywords.sort( function ( a, b ) {
|
670 |
+
return b.count - a.count
|
671 |
+
} );
|
672 |
+
|
673 |
+
uSocial = social.filter( reports.rtOnlyUniqueValues );
|
674 |
+
for ( i = 0; i < uSocial.length; i++ ) {
|
675 |
+
uSocial[ i ] = {
|
676 |
+
"value" : uSocial[ i ],
|
677 |
+
"count" : reports.rtCountSessions( rtData, uSocial[ i ] )
|
678 |
+
};
|
679 |
+
}
|
680 |
+
uSocial.sort( function ( a, b ) {
|
681 |
+
return b.count - a.count
|
682 |
+
} );
|
683 |
+
|
684 |
+
uCustom = custom.filter( reports.rtOnlyUniqueValues );
|
685 |
+
for ( i = 0; i < uCustom.length; i++ ) {
|
686 |
+
uCustom[ i ] = {
|
687 |
+
"value" : uCustom[ i ],
|
688 |
+
"count" : reports.rtCountSessions( rtData, uCustom[ i ] )
|
689 |
+
};
|
690 |
+
}
|
691 |
+
uCustom.sort( function ( a, b ) {
|
692 |
+
return b.count - a.count
|
693 |
+
} );
|
694 |
+
|
695 |
+
rtInfoRight = '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uReferrals ) + '"><div class="gadwp-bleft">' + reports.i18n[ 0 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 0 ] ) + '</div></div>';
|
696 |
+
rtInfoRight += '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uKeywords ) + '"><div class="gadwp-bleft">' + reports.i18n[ 1 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 1 ] ) + '</div></div>';
|
697 |
+
rtInfoRight += '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uSocial ) + '"><div class="gadwp-bleft">' + reports.i18n[ 2 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 2 ] ) + '</div></div>';
|
698 |
+
rtInfoRight += '<div class="gadwp-bigtext"><a href="#" data-gadwp="' + reports.rtGenerateTooltip( uCustom ) + '"><div class="gadwp-bleft">' + reports.i18n[ 3 ] + '</a></div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitType[ 3 ] ) + '</div></div>';
|
699 |
+
|
700 |
+
rtInfoRight += '<div class="gadwp-bigtext"><div class="gadwp-bleft">' + reports.i18n[ 4 ] + '</div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitorType[ 0 ] ) + '</div></div>';
|
701 |
+
rtInfoRight += '<div class="gadwp-bigtext"><div class="gadwp-bleft">' + reports.i18n[ 5 ] + '</div><div class="gadwp-bright">' + reports.rtCountSessions( rtData, uVisitorType[ 1 ] ) + '</div></div>';
|
702 |
+
|
703 |
+
document.getElementById( "gadwp-tdo-right" ).innerHTML = rtInfoRight;
|
704 |
+
},
|
705 |
+
|
706 |
+
throwDebug : function ( response ) {
|
707 |
+
jQuery( "#gadwp-status" + slug ).css( {
|
708 |
+
"margin-top" : "3px",
|
709 |
+
"padding-left" : "5px",
|
710 |
+
"height" : "auto",
|
711 |
+
"color" : "#000",
|
712 |
+
"border-left" : "5px solid red"
|
713 |
+
} );
|
714 |
+
if ( response == '-24' ) {
|
715 |
+
jQuery( "#gadwp-status" + slug ).html( gadwpItemData.i18n[ 15 ] );
|
716 |
+
} else {
|
717 |
+
jQuery( "#gadwp-reports" + slug ).css( {
|
718 |
+
"background-color" : "#F7F7F7",
|
719 |
+
"height" : "auto",
|
720 |
+
"margin-top" : "10px",
|
721 |
+
"padding-top" : "50px",
|
722 |
+
"padding-bottom" : "50px",
|
723 |
+
"color" : "#000",
|
724 |
+
"text-align" : "center"
|
725 |
+
} );
|
726 |
+
jQuery( "#gadwp-reports" + slug ).html ( response );
|
727 |
+
jQuery( "#gadwp-reports" + slug ).show();
|
728 |
+
jQuery( "#gadwp-status" + slug ).html( gadwpItemData.i18n[ 11 ] );
|
729 |
+
console.log( "\n********************* GADWP Log ********************* \n\n" + response );
|
730 |
+
postData = {
|
731 |
+
action : 'gadwp_set_error',
|
732 |
+
response : response,
|
733 |
+
gadwp_security_set_error : gadwpItemData.security,
|
734 |
+
}
|
735 |
+
jQuery.post( gadwpItemData.ajaxurl, postData );
|
736 |
+
}
|
737 |
+
},
|
738 |
+
|
739 |
+
throwError : function ( target, response, p ) {
|
740 |
+
jQuery( target ).css( {
|
741 |
+
"background-color" : "#F7F7F7",
|
742 |
+
"height" : "auto",
|
743 |
+
"padding-top" : p,
|
744 |
+
"padding-bottom" : p,
|
745 |
+
"color" : "#000",
|
746 |
+
"text-align" : "center"
|
747 |
+
} );
|
748 |
+
if ( response == -21 ) {
|
749 |
+
jQuery( target ).html( gadwpItemData.i18n[ 12 ] + ' (' + response + ')' );
|
750 |
+
} else {
|
751 |
+
jQuery( target ).html( gadwpItemData.i18n[ 13 ] + ' (' + response + ')' );
|
752 |
+
}
|
753 |
+
},
|
754 |
+
|
755 |
+
render : function ( view, period, query ) {
|
756 |
+
var projectId, from, to, tpl, focusFlag;
|
757 |
+
|
758 |
+
if ( period == 'realtime' ) {
|
759 |
+
jQuery( '#gadwp-sel-report' + slug ).hide();
|
760 |
+
} else {
|
761 |
+
jQuery( '#gadwp-sel-report' + slug ).show();
|
762 |
+
clearInterval( reports.rtRuns );
|
763 |
+
}
|
764 |
+
|
765 |
+
jQuery( '#gadwp-status' + slug ).html( '' );
|
766 |
+
switch ( period ) {
|
767 |
+
case 'today':
|
768 |
+
from = 'today';
|
769 |
+
to = 'today';
|
770 |
+
break;
|
771 |
+
case 'yesterday':
|
772 |
+
from = 'yesterday';
|
773 |
+
to = 'yesterday';
|
774 |
+
break;
|
775 |
+
case '7daysAgo':
|
776 |
+
from = '7daysAgo';
|
777 |
+
to = 'yesterday';
|
778 |
+
break;
|
779 |
+
case '14daysAgo':
|
780 |
+
from = '14daysAgo';
|
781 |
+
to = 'yesterday';
|
782 |
+
break;
|
783 |
+
case '90daysAgo':
|
784 |
+
from = '90daysAgo';
|
785 |
+
to = 'yesterday';
|
786 |
+
break;
|
787 |
+
case '365daysAgo':
|
788 |
+
from = '365daysAgo';
|
789 |
+
to = 'yesterday';
|
790 |
+
break;
|
791 |
+
case '1095daysAgo':
|
792 |
+
from = '1095daysAgo';
|
793 |
+
to = 'yesterday';
|
794 |
+
break;
|
795 |
+
default:
|
796 |
+
from = '30daysAgo';
|
797 |
+
to = 'yesterday';
|
798 |
+
break;
|
799 |
+
}
|
800 |
+
|
801 |
+
tools.setCookie( 'default_metric', query );
|
802 |
+
tools.setCookie( 'default_dimension', period );
|
803 |
+
|
804 |
+
if ( typeof view !== 'undefined' ) {
|
805 |
+
tools.setCookie( 'default_view', view );
|
806 |
+
projectId = view;
|
807 |
+
} else {
|
808 |
+
projectId = false;
|
809 |
+
}
|
810 |
+
|
811 |
+
if ( gadwpItemData.scope == 'admin-item' ) {
|
812 |
+
postData = {
|
813 |
+
action : 'gadwp_backend_item_reports',
|
814 |
+
gadwp_security_backend_item_reports : gadwpItemData.security,
|
815 |
+
from : from,
|
816 |
+
to : to,
|
817 |
+
filter : itemId
|
818 |
+
}
|
819 |
+
} else if ( gadwpItemData.scope == 'front-item' ) {
|
820 |
+
postData = {
|
821 |
+
action : 'gadwp_frontend_item_reports',
|
822 |
+
gadwp_security_frontend_item_reports : gadwpItemData.security,
|
823 |
+
from : from,
|
824 |
+
to : to,
|
825 |
+
filter : gadwpItemData.filter
|
826 |
+
}
|
827 |
+
} else {
|
828 |
+
postData = {
|
829 |
+
action : 'gadwp_backend_item_reports',
|
830 |
+
gadwp_security_backend_item_reports : gadwpItemData.security,
|
831 |
+
projectId : projectId,
|
832 |
+
from : from,
|
833 |
+
to : to
|
834 |
+
}
|
835 |
+
}
|
836 |
+
if ( period == 'realtime' ) {
|
837 |
+
|
838 |
+
reports.i18n = gadwpItemData.i18n.slice( 20, 26 );
|
839 |
+
|
840 |
+
reports.render.focusFlag = 1;
|
841 |
+
|
842 |
+
jQuery( window ).bind( "focus", function ( event ) {
|
843 |
+
reports.render.focusFlag = 1;
|
844 |
+
} ).bind( "blur", function ( event ) {
|
845 |
+
reports.render.focusFlag = 0;
|
846 |
+
} );
|
847 |
+
|
848 |
+
tpl = '<div id="gadwp-realtime' + slug + '">';
|
849 |
+
tpl += '<div class="gadwp-rt-box">';
|
850 |
+
tpl += '<div class="gadwp-tdo-left">';
|
851 |
+
tpl += '<div class="gadwp-online" id="gadwp-online">0</div>';
|
852 |
+
tpl += '</div>';
|
853 |
+
tpl += '<div class="gadwp-tdo-right" id="gadwp-tdo-right">';
|
854 |
+
tpl += '<div class="gadwp-bigtext">';
|
855 |
+
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 0 ] + '</div>';
|
856 |
+
tpl += '<div class="gadwp-bright">0</div>';
|
857 |
+
tpl += '</div>';
|
858 |
+
tpl += '<div class="gadwp-bigtext">';
|
859 |
+
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 1 ] + '</div>';
|
860 |
+
tpl += '<div class="gadwp-bright">0</div>';
|
861 |
+
tpl += '</div>';
|
862 |
+
tpl += '<div class="gadwp-bigtext">';
|
863 |
+
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 2 ] + '</div>';
|
864 |
+
tpl += '<div class="gadwp-bright">0</div>';
|
865 |
+
tpl += '</div>';
|
866 |
+
tpl += '<div class="gadwp-bigtext">';
|
867 |
+
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 3 ] + '</div>';
|
868 |
+
tpl += '<div class="gadwp-bright">0</div>';
|
869 |
+
tpl += '</div>';
|
870 |
+
tpl += '<div class="gadwp-bigtext">';
|
871 |
+
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 4 ] + '</div>';
|
872 |
+
tpl += '<div class="gadwp-bright">0</div>';
|
873 |
+
tpl += '</div>';
|
874 |
+
tpl += '<div class="gadwp-bigtext">';
|
875 |
+
tpl += '<div class="gadwp-bleft">' + reports.i18n[ 5 ] + '</div>';
|
876 |
+
tpl += '<div class="gadwp-bright">0</div>';
|
877 |
+
tpl += '</div>';
|
878 |
+
tpl += '</div>';
|
879 |
+
tpl += '</div>';
|
880 |
+
tpl += '<div>';
|
881 |
+
tpl += '<div id="gadwp-pages" class="gadwp-pages"> </div>';
|
882 |
+
tpl += '</div>';
|
883 |
+
tpl += '</div>';
|
884 |
+
|
885 |
+
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
886 |
+
|
887 |
+
reports.rtRefresh( reports.render.focusFlag );
|
888 |
+
|
889 |
+
reports.rtRuns = setInterval( reports.rtRefresh, 55000 );
|
890 |
+
|
891 |
+
} else {
|
892 |
+
if ( jQuery.inArray( query, [ 'referrers', 'contentpages', 'searches' ] ) > -1 ) {
|
893 |
+
|
894 |
+
tpl = '<div id="gadwp-orgcharttablechart' + slug + '">';
|
895 |
+
tpl += '<div id="gadwp-orgchart' + slug + '"></div>';
|
896 |
+
tpl += '<div id="gadwp-tablechart' + slug + '"></div>';
|
897 |
+
tpl += '</div>';
|
898 |
+
|
899 |
+
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
900 |
+
jQuery( '#gadwp-reports' + slug ).hide();
|
901 |
+
|
902 |
+
postData.query = 'channelGrouping,' + query;
|
903 |
+
|
904 |
+
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
905 |
+
reports.orgChartTableChart( response );
|
906 |
+
} );
|
907 |
+
} else if ( query == '404errors' ) {
|
908 |
+
tpl = '<div id="gadwp-404tablechart' + slug + '">';
|
909 |
+
tpl += '<div id="gadwp-tablechart' + slug + '"></div>';
|
910 |
+
tpl += '</div>';
|
911 |
+
|
912 |
+
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
913 |
+
jQuery( '#gadwp-reports' + slug ).hide();
|
914 |
+
|
915 |
+
postData.query = query;
|
916 |
+
|
917 |
+
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
918 |
+
reports.tableChart( response );
|
919 |
+
} );
|
920 |
+
} else if ( query == 'trafficdetails' || query == 'technologydetails' ) {
|
921 |
+
|
922 |
+
tpl = '<div id="gadwp-orgchartpiecharts' + slug + '">';
|
923 |
+
tpl += '<div id="gadwp-orgchart' + slug + '"></div>';
|
924 |
+
tpl += '<div class="gadwp-floatwraper">';
|
925 |
+
tpl += '<div id="gadwp-piechart-1' + slug + '" class="halfsize floatleft"></div>';
|
926 |
+
tpl += '<div id="gadwp-piechart-2' + slug + '" class="halfsize floatright"></div>';
|
927 |
+
tpl += '</div>';
|
928 |
+
tpl += '<div class="gadwp-floatwraper">';
|
929 |
+
tpl += '<div id="gadwp-piechart-3' + slug + '" class="halfsize floatleft"></div>';
|
930 |
+
tpl += '<div id="gadwp-piechart-4' + slug + '" class="halfsize floatright"></div>';
|
931 |
+
tpl += '</div>';
|
932 |
+
tpl += '</div>';
|
933 |
+
|
934 |
+
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
935 |
+
jQuery( '#gadwp-reports' + slug ).hide();
|
936 |
+
if ( query == 'trafficdetails' ) {
|
937 |
+
postData.query = 'channelGrouping,medium,visitorType,source,socialNetwork';
|
938 |
+
reports.i18n = gadwpItemData.i18n.slice( 0, 5 );
|
939 |
+
} else {
|
940 |
+
reports.i18n = gadwpItemData.i18n.slice( 15, 20 );
|
941 |
+
postData.query = 'deviceCategory,browser,operatingSystem,screenResolution,mobileDeviceBranding';
|
942 |
+
}
|
943 |
+
|
944 |
+
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
945 |
+
reports.orgChartPieCharts( response )
|
946 |
+
} );
|
947 |
+
|
948 |
+
} else if ( query == 'locations' ) {
|
949 |
+
|
950 |
+
tpl = '<div id="gadwp-geocharttablechart' + slug + '">';
|
951 |
+
tpl += '<div id="gadwp-geochart' + slug + '"></div>';
|
952 |
+
tpl += '<div id="gadwp-tablechart' + slug + '"></div>';
|
953 |
+
tpl += '</div>';
|
954 |
+
|
955 |
+
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
956 |
+
jQuery( '#gadwp-reports' + slug ).hide();
|
957 |
+
|
958 |
+
postData.query = query;
|
959 |
+
|
960 |
+
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
961 |
+
reports.geoChartTableChart( response );
|
962 |
+
} );
|
963 |
+
|
964 |
+
} else {
|
965 |
+
|
966 |
+
tpl = '<div id="gadwp-areachartbottomstats' + slug + '">';
|
967 |
+
tpl += '<div id="gadwp-areachart' + slug + '"></div>';
|
968 |
+
tpl += '<div id="gadwp-bottomstats' + slug + '">';
|
969 |
+
tpl += '<div class="inside">';
|
970 |
+
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 5 ] + '</h3><p id="gdsessions' + slug + '"> </p></div>';
|
971 |
+
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 6 ] + '</h3><p id="gdusers' + slug + '"> </p></div>';
|
972 |
+
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 7 ] + '</h3><p id="gdpageviews' + slug + '"> </p></div>';
|
973 |
+
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 8 ] + '</h3><p id="gdbouncerate' + slug + '"> </p></div>';
|
974 |
+
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 9 ] + '</h3><p id="gdorganicsearch' + slug + '"> </p></div>';
|
975 |
+
tpl += '<div class="small-box"><h3>' + gadwpItemData.i18n[ 10 ] + '</h3><p id="gdpagespervisit' + slug + '"> </p></div>';
|
976 |
+
tpl += '</div>';
|
977 |
+
tpl += '</div>';
|
978 |
+
tpl += '</div>';
|
979 |
+
|
980 |
+
jQuery( '#gadwp-reports' + slug ).html( tpl );
|
981 |
+
jQuery( '#gadwp-reports' + slug ).hide();
|
982 |
+
|
983 |
+
postData.query = query + ',bottomstats';
|
984 |
+
|
985 |
+
jQuery.post( gadwpItemData.ajaxurl, postData, function ( response ) {
|
986 |
+
reports.areaChartBottomStats( response );
|
987 |
+
} );
|
988 |
+
|
989 |
+
}
|
990 |
+
|
991 |
+
}
|
992 |
+
|
993 |
+
},
|
994 |
+
|
995 |
+
refresh : function () {
|
996 |
+
if ( jQuery( '#gadwp-areachartbottomstats' + slug ).length > 0 && jQuery.isArray( reports.areaChartBottomStatsData ) ) {
|
997 |
+
reports.areaChartBottomStats( reports.areaChartBottomStatsData );
|
998 |
+
}
|
999 |
+
if ( jQuery( '#gadwp-orgchartpiecharts' + slug ).length > 0 && jQuery.isArray( reports.orgChartPieChartsData ) ) {
|
1000 |
+
reports.orgChartPieCharts( reports.orgChartPieChartsData );
|
1001 |
+
}
|
1002 |
+
if ( jQuery( '#gadwp-geocharttablechart' + slug ).length > 0 && jQuery.isArray( reports.geoChartTableChartData ) ) {
|
1003 |
+
reports.geoChartTableChart( reports.geoChartTableChartData );
|
1004 |
+
}
|
1005 |
+
if ( jQuery( '#gadwp-orgcharttablechart' + slug ).length > 0 && jQuery.isArray( reports.orgChartTableChartData ) ) {
|
1006 |
+
reports.orgChartTableChart( reports.orgChartTableChartData );
|
1007 |
+
}
|
1008 |
+
if ( jQuery( '#gadwp-404tablechart' + slug ).length > 0 && jQuery.isArray( reports.tableChartData ) ) {
|
1009 |
+
reports.tableChart( reports.tableChartData );
|
1010 |
+
}
|
1011 |
+
},
|
1012 |
+
|
1013 |
+
init : function () {
|
1014 |
+
|
1015 |
+
if ( !jQuery( "#gadwp-reports" + slug ).length ) {
|
1016 |
+
return;
|
1017 |
+
}
|
1018 |
+
|
1019 |
+
if ( jQuery( "#gadwp-reports" + slug ).html().length ) { // only when report is empty
|
1020 |
+
return;
|
1021 |
+
}
|
1022 |
+
|
1023 |
+
try {
|
1024 |
+
NProgress.configure( {
|
1025 |
+
parent : "#gadwp-progressbar" + slug,
|
1026 |
+
showSpinner : false
|
1027 |
+
} );
|
1028 |
+
NProgress.start();
|
1029 |
+
} catch ( e ) {
|
1030 |
+
reports.alertMessage( gadwpItemData.i18n[ 0 ] );
|
1031 |
+
}
|
1032 |
+
|
1033 |
+
reports.render( jQuery( '#gadwp-sel-view' + slug ).val(), jQuery( '#gadwp-sel-period' + slug ).val(), jQuery( '#gadwp-sel-report' + slug ).val() );
|
1034 |
+
|
1035 |
+
jQuery( window ).resize( function () {
|
1036 |
+
var diff = jQuery(window).width() - reports.oldViewPort;
|
1037 |
+
if ( ( diff < -5 ) || ( diff > 5 ) ) {
|
1038 |
+
reports.oldViewPort = jQuery(window).width();
|
1039 |
+
reports.refresh(); //refresh only on over 5px viewport width changes
|
1040 |
+
}
|
1041 |
+
} );
|
1042 |
+
}
|
1043 |
+
}
|
1044 |
+
|
1045 |
+
template.init();
|
1046 |
+
|
1047 |
+
reports.init();
|
1048 |
+
|
1049 |
+
jQuery( '#gadwp-sel-view' + slug ).change( function () {
|
1050 |
+
jQuery( '#gadwp-reports' + slug ).html( '' );
|
1051 |
+
reports.init();
|
1052 |
+
} );
|
1053 |
+
|
1054 |
+
jQuery( '#gadwp-sel-period' + slug ).change( function () {
|
1055 |
+
jQuery( '#gadwp-reports' + slug ).html( '' );
|
1056 |
+
reports.init();
|
1057 |
+
} );
|
1058 |
+
|
1059 |
+
jQuery( '#gadwp-sel-report' + slug ).change( function () {
|
1060 |
+
jQuery( '#gadwp-reports' + slug ).html( '' );
|
1061 |
+
reports.init();
|
1062 |
+
} );
|
1063 |
+
|
1064 |
+
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
1065 |
+
return;
|
1066 |
+
} else {
|
1067 |
+
return this.dialog( {
|
1068 |
+
width : 'auto',
|
1069 |
+
maxWidth : 510,
|
1070 |
+
height : 'auto',
|
1071 |
+
modal : true,
|
1072 |
+
fluid : true,
|
1073 |
+
dialogClass : 'gadwp wp-dialog',
|
1074 |
+
resizable : false,
|
1075 |
+
title : reports.getTitle( gadwpItemData.scope ),
|
1076 |
+
position : {
|
1077 |
+
my : "top",
|
1078 |
+
at : "top+100",
|
1079 |
+
of : window
|
1080 |
+
}
|
1081 |
+
} );
|
1082 |
+
}
|
1083 |
+
}
|
1084 |
+
} );
|
1085 |
+
|
1086 |
+
function GADWPReportLoad () {
|
1087 |
+
if ( gadwpItemData.scope == 'admin-widgets' ) {
|
1088 |
+
jQuery( '#gadwp-window-1' ).gadwpItemReport( 1 );
|
1089 |
+
} else {
|
1090 |
+
jQuery( gadwpItemData.getSelector( gadwpItemData.scope ) ).click( function () {
|
1091 |
+
if ( !jQuery( "#gadwp-window-" + gadwpItemData.getID( this ) ).length > 0 ) {
|
1092 |
+
jQuery( "body" ).append( '<div id="gadwp-window-' + gadwpItemData.getID( this ) + '"></div>' );
|
1093 |
+
}
|
1094 |
+
jQuery( '#gadwp-window-' + gadwpItemData.getID( this ) ).gadwpItemReport( gadwpItemData.getID( this ) );
|
1095 |
+
} );
|
1096 |
+
}
|
1097 |
+
|
1098 |
+
// on window resize
|
1099 |
+
jQuery( window ).resize( function () {
|
1100 |
+
gadwpItemData.responsiveDialog();
|
1101 |
+
} );
|
1102 |
+
|
1103 |
+
// dialog width larger than viewport
|
1104 |
+
jQuery( document ).on( "dialogopen", ".ui-dialog", function ( event, ui ) {
|
1105 |
+
gadwpItemData.responsiveDialog();
|
1106 |
+
} );
|
1107 |
+
}
|
config.php
CHANGED
@@ -1,422 +1,422 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Config' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Config {
|
17 |
-
|
18 |
-
public $options;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
// Get plugin options
|
22 |
-
$this->get_plugin_options();
|
23 |
-
// Automatic updates
|
24 |
-
add_filter( 'auto_update_plugin', array( $this, 'automatic_update' ), 10, 2 );
|
25 |
-
// Provide language packs for all available Network languages
|
26 |
-
if ( is_multisite() ) {
|
27 |
-
add_filter( 'plugins_update_check_locales', array( $this, 'translation_updates' ), 10, 1 );
|
28 |
-
}
|
29 |
-
}
|
30 |
-
|
31 |
-
public function get_major_version( $version ) {
|
32 |
-
$exploded_version = explode( '.', $version );
|
33 |
-
if ( isset( $exploded_version[2] ) ) {
|
34 |
-
return $exploded_version[0] . '.' . $exploded_version[1] . '.' . $exploded_version[2];
|
35 |
-
} else {
|
36 |
-
return $exploded_version[0] . '.' . $exploded_version[1] . '.0';
|
37 |
-
}
|
38 |
-
}
|
39 |
-
|
40 |
-
public function automatic_update( $update, $item ) {
|
41 |
-
$item = (array) $item;
|
42 |
-
if ( is_multisite() && ! is_main_site() ) {
|
43 |
-
return;
|
44 |
-
}
|
45 |
-
if ( ! isset( $item['new_version'] ) || ! isset( $item['plugin'] ) || ! $this->options['automatic_updates_minorversion'] ) {
|
46 |
-
return $update;
|
47 |
-
}
|
48 |
-
if ( isset( $item['slug'] ) && $item['slug'] == 'google-analytics-dashboard-for-wp' ) {
|
49 |
-
// Only when a minor update is available
|
50 |
-
return ( $this->get_major_version( GADWP_CURRENT_VERSION ) == $this->get_major_version( $item['new_version'] ) );
|
51 |
-
}
|
52 |
-
return $update;
|
53 |
-
}
|
54 |
-
|
55 |
-
public function translation_updates( $locales ) {
|
56 |
-
$languages = get_available_languages();
|
57 |
-
return array_values( $languages );
|
58 |
-
}
|
59 |
-
|
60 |
-
// Validates data before storing
|
61 |
-
private static function validate_data( $options ) {
|
62 |
-
if ( isset( $options['ga_realtime_pages'] ) ) {
|
63 |
-
$options['ga_realtime_pages'] = (int) $options['ga_realtime_pages'];
|
64 |
-
}
|
65 |
-
if ( isset( $options['ga_crossdomain_tracking'] ) ) {
|
66 |
-
$options['ga_crossdomain_tracking'] = (int) $options['ga_crossdomain_tracking'];
|
67 |
-
}
|
68 |
-
if ( isset( $options['ga_crossdomain_list'] ) ) {
|
69 |
-
$options['ga_crossdomain_list'] = sanitize_text_field( $options['ga_crossdomain_list'] );
|
70 |
-
}
|
71 |
-
if ( isset( $options['ga_dash_clientid'] ) ) {
|
72 |
-
$options['ga_dash_clientid'] = sanitize_text_field( $options['ga_dash_clientid'] );
|
73 |
-
}
|
74 |
-
if ( isset( $options['ga_dash_clientsecret'] ) ) {
|
75 |
-
$options['ga_dash_clientsecret'] = sanitize_text_field( $options['ga_dash_clientsecret'] );
|
76 |
-
}
|
77 |
-
if ( isset( $options['ga_dash_style'] ) ) {
|
78 |
-
$options['ga_dash_style'] = sanitize_text_field( $options['ga_dash_style'] );
|
79 |
-
}
|
80 |
-
if ( isset( $options['ga_event_downloads'] ) ) {
|
81 |
-
if ( empty( $options['ga_event_downloads'] ) ) {
|
82 |
-
$options['ga_event_downloads'] = 'zip|mp3*|mpe*g|pdf|docx*|pptx*|xlsx*|rar*';
|
83 |
-
}
|
84 |
-
$options['ga_event_downloads'] = sanitize_text_field( $options['ga_event_downloads'] );
|
85 |
-
}
|
86 |
-
if ( isset( $options['ga_speed_samplerate'] ) && ( $options['ga_speed_samplerate'] < 1 || $options['ga_speed_samplerate'] > 100 ) ) {
|
87 |
-
$options['ga_speed_samplerate'] = 1;
|
88 |
-
}
|
89 |
-
if ( isset( $options['ga_target_geomap'] ) ) {
|
90 |
-
$options['ga_target_geomap'] = sanitize_text_field( $options['ga_target_geomap'] );
|
91 |
-
}
|
92 |
-
if ( isset( $options['ga_author_dimindex'] ) ) {
|
93 |
-
$options['ga_author_dimindex'] = (int) $options['ga_author_dimindex'];
|
94 |
-
}
|
95 |
-
if ( isset( $options['ga_category_dimindex'] ) ) {
|
96 |
-
$options['ga_category_dimindex'] = (int) $options['ga_category_dimindex'];
|
97 |
-
}
|
98 |
-
if ( isset( $options['ga_tag_dimindex'] ) ) {
|
99 |
-
$options['ga_tag_dimindex'] = (int) $options['ga_tag_dimindex'];
|
100 |
-
}
|
101 |
-
if ( isset( $options['ga_user_dimindex'] ) ) {
|
102 |
-
$options['ga_user_dimindex'] = (int) $options['ga_user_dimindex'];
|
103 |
-
}
|
104 |
-
if ( isset( $options['ga_pubyear_dimindex'] ) ) {
|
105 |
-
$options['ga_pubyear_dimindex'] = (int) $options['ga_pubyear_dimindex'];
|
106 |
-
}
|
107 |
-
if ( isset( $options['ga_pubyearmonth_dimindex'] ) ) {
|
108 |
-
$options['ga_pubyearmonth_dimindex'] = (int) $options['ga_pubyearmonth_dimindex'];
|
109 |
-
}
|
110 |
-
if ( isset( $options['ga_aff_tracking'] ) ) {
|
111 |
-
$options['ga_aff_tracking'] = (int) $options['ga_aff_tracking'];
|
112 |
-
}
|
113 |
-
if ( isset( $options['ga_cookiedomain'] ) ) { // v4.9
|
114 |
-
$options['ga_cookiedomain'] = sanitize_text_field( $options['ga_cookiedomain'] );
|
115 |
-
}
|
116 |
-
if ( isset( $options['ga_cookiename'] ) ) { // v4.9
|
117 |
-
$options['ga_cookiename'] = sanitize_text_field( $options['ga_cookiename'] );
|
118 |
-
}
|
119 |
-
if ( isset( $options['pagetitle_404'] ) ) { // v4.9.4
|
120 |
-
$options['pagetitle_404'] = sanitize_text_field( $options['pagetitle_404'] );
|
121 |
-
}
|
122 |
-
if ( isset( $options['maps_api_key'] ) ) { // v4.9.4
|
123 |
-
$options['maps_api_key'] = sanitize_text_field( $options['maps_api_key'] );
|
124 |
-
}
|
125 |
-
if ( isset( $options['ga_cookieexpires'] ) && $options['ga_cookieexpires'] ) { // v4.9
|
126 |
-
$options['ga_cookieexpires'] = (int) $options['ga_cookieexpires'];
|
127 |
-
}
|
128 |
-
if ( isset( $options['ga_event_affiliates'] ) ) {
|
129 |
-
if ( empty( $options['ga_event_affiliates'] ) ) {
|
130 |
-
$options['ga_event_affiliates'] = '/out/';
|
131 |
-
}
|
132 |
-
$options['ga_event_affiliates'] = sanitize_text_field( $options['ga_event_affiliates'] );
|
133 |
-
}
|
134 |
-
|
135 |
-
$token = json_decode( $options['ga_dash_token'] ); // v4.8.2
|
136 |
-
if ( isset( $token->token_type ) ) {
|
137 |
-
unset( $options['ga_dash_refresh_token'] );
|
138 |
-
}
|
139 |
-
|
140 |
-
return $options;
|
141 |
-
}
|
142 |
-
|
143 |
-
public function set_plugin_options( $network_settings = false ) {
|
144 |
-
// Handle Network Mode
|
145 |
-
$options = $this->options;
|
146 |
-
$get_network_options = get_site_option( 'gadash_network_options' );
|
147 |
-
$old_network_options = (array) json_decode( $get_network_options );
|
148 |
-
if ( is_multisite() ) {
|
149 |
-
if ( $network_settings ) { // Retrieve network options, clear blog options, store both to db
|
150 |
-
$network_options['ga_dash_token'] = $this->options['ga_dash_token'];
|
151 |
-
$options['ga_dash_token'] = '';
|
152 |
-
if ( is_network_admin() ) {
|
153 |
-
$network_options['ga_dash_profile_list'] = $this->options['ga_dash_profile_list'];
|
154 |
-
$options['ga_dash_profile_list'] = array();
|
155 |
-
$network_options['ga_dash_clientid'] = $this->options['ga_dash_clientid'];
|
156 |
-
$options['ga_dash_clientid'] = '';
|
157 |
-
$network_options['ga_dash_clientsecret'] = $this->options['ga_dash_clientsecret'];
|
158 |
-
$options['ga_dash_clientsecret'] = '';
|
159 |
-
$network_options['ga_dash_userapi'] = $this->options['ga_dash_userapi'];
|
160 |
-
$options['ga_dash_userapi'] = 0;
|
161 |
-
$network_options['ga_dash_network'] = $this->options['ga_dash_network'];
|
162 |
-
$network_options['ga_dash_excludesa'] = $this->options['ga_dash_excludesa'];
|
163 |
-
$network_options['automatic_updates_minorversion'] = $this->options['automatic_updates_minorversion'];
|
164 |
-
unset( $options['ga_dash_network'] );
|
165 |
-
if ( isset( $this->options['ga_dash_tableid_network'] ) ) {
|
166 |
-
$network_options['ga_dash_tableid_network'] = $this->options['ga_dash_tableid_network'];
|
167 |
-
unset( $options['ga_dash_tableid_network'] );
|
168 |
-
}
|
169 |
-
}
|
170 |
-
update_site_option( 'gadash_network_options', json_encode( $this->validate_data( array_merge( $old_network_options, $network_options ) ) ) );
|
171 |
-
}
|
172 |
-
}
|
173 |
-
update_option( 'gadash_options', json_encode( $this->validate_data( $options ) ) );
|
174 |
-
}
|
175 |
-
|
176 |
-
private function get_plugin_options() {
|
177 |
-
/*
|
178 |
-
* Get plugin options
|
179 |
-
*/
|
180 |
-
global $blog_id;
|
181 |
-
|
182 |
-
if ( ! get_option( 'gadash_options' ) ) {
|
183 |
-
GADWP_Install::install();
|
184 |
-
}
|
185 |
-
$this->options = (array) json_decode( get_option( 'gadash_options' ) );
|
186 |
-
// Maintain Compatibility
|
187 |
-
$this->maintain_compatibility();
|
188 |
-
// Handle Network Mode
|
189 |
-
if ( is_multisite() ) {
|
190 |
-
$get_network_options = get_site_option( 'gadash_network_options' );
|
191 |
-
$network_options = (array) json_decode( $get_network_options );
|
192 |
-
if ( isset( $network_options['ga_dash_network'] ) && ( $network_options['ga_dash_network'] ) ) {
|
193 |
-
if ( ! is_network_admin() && ! empty( $network_options['ga_dash_profile_list'] ) && isset( $network_options['ga_dash_tableid_network']->$blog_id ) ) {
|
194 |
-
$network_options['ga_dash_profile_list'] = array( 0 => GADWP_Tools::get_selected_profile( $network_options['ga_dash_profile_list'], $network_options['ga_dash_tableid_network']->$blog_id ) );
|
195 |
-
$network_options['ga_dash_tableid_jail'] = $network_options['ga_dash_profile_list'][0][1];
|
196 |
-
}
|
197 |
-
$this->options = array_merge( $this->options, $network_options );
|
198 |
-
} else {
|
199 |
-
$this->options['ga_dash_network'] = 0;
|
200 |
-
}
|
201 |
-
}
|
202 |
-
}
|
203 |
-
|
204 |
-
private function maintain_compatibility() {
|
205 |
-
$flag = false;
|
206 |
-
|
207 |
-
if ( GADWP_CURRENT_VERSION != get_option( 'gadwp_version' ) ) {
|
208 |
-
$flag = true;
|
209 |
-
update_option( 'gadwp_version', GADWP_CURRENT_VERSION );
|
210 |
-
update_option( 'gadwp_got_updated', true );
|
211 |
-
$rebuild_token = json_decode( $this->options['ga_dash_token'] ); // v4.8.2
|
212 |
-
if ( is_object( $rebuild_token ) && ! isset( $rebuild_token->token_type ) ) {
|
213 |
-
if ( isset( $this->options['ga_dash_refresh_token'] ) ) {
|
214 |
-
$rebuild_token->refresh_token = $this->options['ga_dash_refresh_token'];
|
215 |
-
}
|
216 |
-
$rebuild_token->token_type = "Bearer";
|
217 |
-
$this->options['ga_dash_token'] = json_encode( $rebuild_token );
|
218 |
-
unset( $this->options['ga_dash_refresh_token'] );
|
219 |
-
$this->set_plugin_options( true );
|
220 |
-
} else {
|
221 |
-
unset( $this->options['ga_dash_refresh_token'] );
|
222 |
-
}
|
223 |
-
GADWP_Tools::clear_cache();
|
224 |
-
GADWP_Tools::delete_cache( 'last_error' );
|
225 |
-
if ( is_multisite() ) { // Cleanup errors and cookies on the entire network
|
226 |
-
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
227 |
-
switch_to_blog( $blog['blog_id'] );
|
228 |
-
GADWP_Tools::delete_cache( 'gapi_errors' );
|
229 |
-
restore_current_blog();
|
230 |
-
}
|
231 |
-
} else {
|
232 |
-
GADWP_Tools::delete_cache( 'gapi_errors' );
|
233 |
-
}
|
234 |
-
GADWP_Tools::unset_cookie( 'default_metric' );
|
235 |
-
GADWP_Tools::unset_cookie( 'default_dimension' );
|
236 |
-
GADWP_Tools::unset_cookie( 'default_view' );
|
237 |
-
}
|
238 |
-
if ( ! isset( $this->options['ga_enhanced_links'] ) ) {
|
239 |
-
$this->options['ga_enhanced_links'] = 0;
|
240 |
-
$flag = true;
|
241 |
-
}
|
242 |
-
if ( ! isset( $this->options['ga_dash_network'] ) ) {
|
243 |
-
$this->options['ga_dash_network'] = 0;
|
244 |
-
$flag = true;
|
245 |
-
}
|
246 |
-
if ( ! isset( $this->options['ga_enhanced_excludesa'] ) ) {
|
247 |
-
$this->options['ga_dash_excludesa'] = 0;
|
248 |
-
$flag = true;
|
249 |
-
}
|
250 |
-
if ( ! isset( $this->options['ga_dash_remarketing'] ) ) {
|
251 |
-
$this->options['ga_dash_remarketing'] = 0;
|
252 |
-
$flag = true;
|
253 |
-
}
|
254 |
-
if ( ! isset( $this->options['ga_dash_adsense'] ) ) {
|
255 |
-
$this->options['ga_dash_adsense'] = 0;
|
256 |
-
$flag = true;
|
257 |
-
}
|
258 |
-
if ( ! isset( $this->options['ga_speed_samplerate'] ) ) {
|
259 |
-
$this->options['ga_speed_samplerate'] = 1;
|
260 |
-
$flag = true;
|
261 |
-
}
|
262 |
-
if ( ! isset( $this->options['automatic_updates_minorversion'] ) ) {
|
263 |
-
$this->options['automatic_updates_minorversion'] = 1;
|
264 |
-
$flag = true;
|
265 |
-
}
|
266 |
-
if ( ! isset( $this->options['ga_event_bouncerate'] ) ) {
|
267 |
-
$this->options['ga_event_bouncerate'] = 0;
|
268 |
-
$flag = true;
|
269 |
-
}
|
270 |
-
if ( ! is_array( $this->options['ga_dash_access_front'] ) || empty( $this->options['ga_dash_access_front'] ) ) {
|
271 |
-
$this->options['ga_dash_access_front'] = array();
|
272 |
-
$this->options['ga_dash_access_front'][] = 'administrator';
|
273 |
-
$flag = true;
|
274 |
-
}
|
275 |
-
|
276 |
-
if ( ! is_array( $this->options['ga_dash_profile_list'] ) ) {
|
277 |
-
$this->options['ga_dash_profile_list'] = array();
|
278 |
-
$flag = true;
|
279 |
-
}
|
280 |
-
|
281 |
-
if ( ! is_array( $this->options['ga_dash_access_back'] ) || empty( $this->options['ga_dash_access_back'] ) ) {
|
282 |
-
$this->options['ga_dash_access_back'] = array();
|
283 |
-
$this->options['ga_dash_access_back'][] = 'administrator';
|
284 |
-
$flag = true;
|
285 |
-
}
|
286 |
-
if ( ! is_array( $this->options['ga_track_exclude'] ) ) {
|
287 |
-
$this->options['ga_track_exclude'] = array();
|
288 |
-
$flag = true;
|
289 |
-
}
|
290 |
-
if ( ! isset( $this->options['ga_crossdomain_tracking'] ) ) {
|
291 |
-
$this->options['ga_crossdomain_tracking'] = 0;
|
292 |
-
$flag = true;
|
293 |
-
}
|
294 |
-
if ( ! isset( $this->options['ga_crossdomain_list'] ) ) {
|
295 |
-
$this->options['ga_crossdomain_list'] = '';
|
296 |
-
$flag = true;
|
297 |
-
}
|
298 |
-
if ( ! isset( $this->options['ga_author_dimindex'] ) ) {
|
299 |
-
$this->options['ga_author_dimindex'] = 0;
|
300 |
-
$flag = true;
|
301 |
-
}
|
302 |
-
if ( ! isset( $this->options['ga_tag_dimindex'] ) ) {
|
303 |
-
$this->options['ga_tag_dimindex'] = 0;
|
304 |
-
$flag = true;
|
305 |
-
}
|
306 |
-
if ( ! isset( $this->options['ga_category_dimindex'] ) ) {
|
307 |
-
$this->options['ga_category_dimindex'] = 0;
|
308 |
-
$flag = true;
|
309 |
-
}
|
310 |
-
$options['ga_tag_dimindex'] = 0;
|
311 |
-
if ( ! isset( $this->options['ga_user_dimindex'] ) ) {
|
312 |
-
$this->options['ga_user_dimindex'] = 0;
|
313 |
-
$flag = true;
|
314 |
-
}
|
315 |
-
if ( ! isset( $this->options['ga_pubyear_dimindex'] ) ) {
|
316 |
-
$this->options['ga_pubyear_dimindex'] = 0;
|
317 |
-
$flag = true;
|
318 |
-
}
|
319 |
-
if ( ! isset( $this->options['ga_pubyearmonth_dimindex'] ) ) {
|
320 |
-
$this->options['ga_pubyearmonth_dimindex'] = 0;
|
321 |
-
$flag = true;
|
322 |
-
}
|
323 |
-
if ( ! isset( $this->options['ga_event_affiliates'] ) ) {
|
324 |
-
$this->options['ga_event_affiliates'] = '/out/';
|
325 |
-
$flag = true;
|
326 |
-
}
|
327 |
-
if ( ! isset( $this->options['ga_aff_tracking'] ) ) {
|
328 |
-
$this->options['ga_aff_tracking'] = 0;
|
329 |
-
$flag = true;
|
330 |
-
}
|
331 |
-
if ( ! isset( $this->options['ga_hash_tracking'] ) ) {
|
332 |
-
$this->options['ga_hash_tracking'] = 0;
|
333 |
-
$flag = true;
|
334 |
-
}
|
335 |
-
if ( ! isset( $this->options['backend_item_reports'] ) ) { // v4.8
|
336 |
-
$this->options['backend_item_reports'] = 1;
|
337 |
-
$flag = true;
|
338 |
-
}
|
339 |
-
if ( isset( $this->options['ga_dash_default_metric'] ) ) { // v4.8.1
|
340 |
-
unset( $this->options['ga_dash_default_metric'] );
|
341 |
-
$flag = true;
|
342 |
-
}
|
343 |
-
if ( isset( $this->options['ga_dash_default_dimension'] ) ) { // v4.8.1
|
344 |
-
unset( $this->options['ga_dash_default_dimension'] );
|
345 |
-
$flag = true;
|
346 |
-
}
|
347 |
-
if ( isset( $this->options['item_reports'] ) ) { // v4.8
|
348 |
-
$this->options['backend_item_reports'] = $this->options['item_reports'];
|
349 |
-
unset( $this->options['item_reports'] );
|
350 |
-
$flag = true;
|
351 |
-
}
|
352 |
-
if ( isset( $this->options['ga_dash_frontend_stats'] ) ) { // v4.8
|
353 |
-
$this->options['frontend_item_reports'] = $this->options['ga_dash_frontend_stats'];
|
354 |
-
unset( $this->options['ga_dash_frontend_stats'] );
|
355 |
-
$flag = true;
|
356 |
-
}
|
357 |
-
if ( ! isset( $this->options['dashboard_widget'] ) ) { // v4.7
|
358 |
-
$this->options['dashboard_widget'] = 1;
|
359 |
-
$flag = true;
|
360 |
-
}
|
361 |
-
if ( ! isset( $this->options['api_backoff'] ) ) { // v4.8.1.3
|
362 |
-
$this->options['api_backoff'] = 0;
|
363 |
-
$flag = true;
|
364 |
-
}
|
365 |
-
if ( ! isset( $this->options['pagetitle_404'] ) ) { // v4.9.4
|
366 |
-
$this->options['pagetitle_404'] = 'Page Not Found';
|
367 |
-
$flag = true;
|
368 |
-
}
|
369 |
-
if ( ! isset( $this->options['maps_api_key'] ) ) { // v4.9.4
|
370 |
-
$this->options['maps_api_key'] = '';
|
371 |
-
$flag = true;
|
372 |
-
}
|
373 |
-
if ( isset( $this->options['ga_tracking_code'] ) ) {
|
374 |
-
unset( $this->options['ga_tracking_code'] );
|
375 |
-
$flag = true;
|
376 |
-
}
|
377 |
-
if ( isset( $this->options['ga_dash_tableid'] ) ) { // v4.9
|
378 |
-
unset( $this->options['ga_dash_tableid'] );
|
379 |
-
$flag = true;
|
380 |
-
}
|
381 |
-
if ( isset( $this->options['ga_dash_frontend_keywords'] ) ) { // v4.8
|
382 |
-
unset( $this->options['ga_dash_frontend_keywords'] );
|
383 |
-
$flag = true;
|
384 |
-
}
|
385 |
-
if ( isset( $this->options['ga_dash_apikey'] ) ) { // v4.9.1.3
|
386 |
-
unset( $this->options['ga_dash_apikey'] );
|
387 |
-
$flag = true;
|
388 |
-
}
|
389 |
-
if ( isset( $this->options['ga_dash_jailadmins'] ) ) { // v4.7
|
390 |
-
if ( isset( $this->options['ga_dash_jailadmins'] ) ) {
|
391 |
-
$this->options['switch_profile'] = 0;
|
392 |
-
unset( $this->options['ga_dash_jailadmins'] );
|
393 |
-
$flag = true;
|
394 |
-
} else {
|
395 |
-
$this->options['switch_profile'] = 1;
|
396 |
-
unset( $this->options['ga_dash_jailadmins'] );
|
397 |
-
$flag = true;
|
398 |
-
}
|
399 |
-
}
|
400 |
-
if ( ! isset( $this->options['ga_cookiedomain'] ) ) {
|
401 |
-
$this->options['ga_cookiedomain'] = '';
|
402 |
-
$flag = true;
|
403 |
-
}
|
404 |
-
if ( ! isset( $this->options['ga_cookiedomain'] ) ) { // v4.9
|
405 |
-
$this->options['ga_cookiedomain'] = '';
|
406 |
-
$flag = true;
|
407 |
-
}
|
408 |
-
if ( ! isset( $this->options['ga_cookiename'] ) ) { // v4.9
|
409 |
-
$this->options['ga_cookiename'] = '';
|
410 |
-
$flag = true;
|
411 |
-
}
|
412 |
-
if ( ! isset( $this->options['ga_cookieexpires'] ) ) { // v4.9
|
413 |
-
$this->options['ga_cookieexpires'] = '';
|
414 |
-
$flag = true;
|
415 |
-
}
|
416 |
-
|
417 |
-
if ( $flag ) {
|
418 |
-
$this->set_plugin_options( false );
|
419 |
-
}
|
420 |
-
}
|
421 |
-
}
|
422 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Config' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Config {
|
17 |
+
|
18 |
+
public $options;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
// Get plugin options
|
22 |
+
$this->get_plugin_options();
|
23 |
+
// Automatic updates
|
24 |
+
add_filter( 'auto_update_plugin', array( $this, 'automatic_update' ), 10, 2 );
|
25 |
+
// Provide language packs for all available Network languages
|
26 |
+
if ( is_multisite() ) {
|
27 |
+
add_filter( 'plugins_update_check_locales', array( $this, 'translation_updates' ), 10, 1 );
|
28 |
+
}
|
29 |
+
}
|
30 |
+
|
31 |
+
public function get_major_version( $version ) {
|
32 |
+
$exploded_version = explode( '.', $version );
|
33 |
+
if ( isset( $exploded_version[2] ) ) {
|
34 |
+
return $exploded_version[0] . '.' . $exploded_version[1] . '.' . $exploded_version[2];
|
35 |
+
} else {
|
36 |
+
return $exploded_version[0] . '.' . $exploded_version[1] . '.0';
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
public function automatic_update( $update, $item ) {
|
41 |
+
$item = (array) $item;
|
42 |
+
if ( is_multisite() && ! is_main_site() ) {
|
43 |
+
return;
|
44 |
+
}
|
45 |
+
if ( ! isset( $item['new_version'] ) || ! isset( $item['plugin'] ) || ! $this->options['automatic_updates_minorversion'] ) {
|
46 |
+
return $update;
|
47 |
+
}
|
48 |
+
if ( isset( $item['slug'] ) && $item['slug'] == 'google-analytics-dashboard-for-wp' ) {
|
49 |
+
// Only when a minor update is available
|
50 |
+
return ( $this->get_major_version( GADWP_CURRENT_VERSION ) == $this->get_major_version( $item['new_version'] ) );
|
51 |
+
}
|
52 |
+
return $update;
|
53 |
+
}
|
54 |
+
|
55 |
+
public function translation_updates( $locales ) {
|
56 |
+
$languages = get_available_languages();
|
57 |
+
return array_values( $languages );
|
58 |
+
}
|
59 |
+
|
60 |
+
// Validates data before storing
|
61 |
+
private static function validate_data( $options ) {
|
62 |
+
if ( isset( $options['ga_realtime_pages'] ) ) {
|
63 |
+
$options['ga_realtime_pages'] = (int) $options['ga_realtime_pages'];
|
64 |
+
}
|
65 |
+
if ( isset( $options['ga_crossdomain_tracking'] ) ) {
|
66 |
+
$options['ga_crossdomain_tracking'] = (int) $options['ga_crossdomain_tracking'];
|
67 |
+
}
|
68 |
+
if ( isset( $options['ga_crossdomain_list'] ) ) {
|
69 |
+
$options['ga_crossdomain_list'] = sanitize_text_field( $options['ga_crossdomain_list'] );
|
70 |
+
}
|
71 |
+
if ( isset( $options['ga_dash_clientid'] ) ) {
|
72 |
+
$options['ga_dash_clientid'] = sanitize_text_field( $options['ga_dash_clientid'] );
|
73 |
+
}
|
74 |
+
if ( isset( $options['ga_dash_clientsecret'] ) ) {
|
75 |
+
$options['ga_dash_clientsecret'] = sanitize_text_field( $options['ga_dash_clientsecret'] );
|
76 |
+
}
|
77 |
+
if ( isset( $options['ga_dash_style'] ) ) {
|
78 |
+
$options['ga_dash_style'] = sanitize_text_field( $options['ga_dash_style'] );
|
79 |
+
}
|
80 |
+
if ( isset( $options['ga_event_downloads'] ) ) {
|
81 |
+
if ( empty( $options['ga_event_downloads'] ) ) {
|
82 |
+
$options['ga_event_downloads'] = 'zip|mp3*|mpe*g|pdf|docx*|pptx*|xlsx*|rar*';
|
83 |
+
}
|
84 |
+
$options['ga_event_downloads'] = sanitize_text_field( $options['ga_event_downloads'] );
|
85 |
+
}
|
86 |
+
if ( isset( $options['ga_speed_samplerate'] ) && ( $options['ga_speed_samplerate'] < 1 || $options['ga_speed_samplerate'] > 100 ) ) {
|
87 |
+
$options['ga_speed_samplerate'] = 1;
|
88 |
+
}
|
89 |
+
if ( isset( $options['ga_target_geomap'] ) ) {
|
90 |
+
$options['ga_target_geomap'] = sanitize_text_field( $options['ga_target_geomap'] );
|
91 |
+
}
|
92 |
+
if ( isset( $options['ga_author_dimindex'] ) ) {
|
93 |
+
$options['ga_author_dimindex'] = (int) $options['ga_author_dimindex'];
|
94 |
+
}
|
95 |
+
if ( isset( $options['ga_category_dimindex'] ) ) {
|
96 |
+
$options['ga_category_dimindex'] = (int) $options['ga_category_dimindex'];
|
97 |
+
}
|
98 |
+
if ( isset( $options['ga_tag_dimindex'] ) ) {
|
99 |
+
$options['ga_tag_dimindex'] = (int) $options['ga_tag_dimindex'];
|
100 |
+
}
|
101 |
+
if ( isset( $options['ga_user_dimindex'] ) ) {
|
102 |
+
$options['ga_user_dimindex'] = (int) $options['ga_user_dimindex'];
|
103 |
+
}
|
104 |
+
if ( isset( $options['ga_pubyear_dimindex'] ) ) {
|
105 |
+
$options['ga_pubyear_dimindex'] = (int) $options['ga_pubyear_dimindex'];
|
106 |
+
}
|
107 |
+
if ( isset( $options['ga_pubyearmonth_dimindex'] ) ) {
|
108 |
+
$options['ga_pubyearmonth_dimindex'] = (int) $options['ga_pubyearmonth_dimindex'];
|
109 |
+
}
|
110 |
+
if ( isset( $options['ga_aff_tracking'] ) ) {
|
111 |
+
$options['ga_aff_tracking'] = (int) $options['ga_aff_tracking'];
|
112 |
+
}
|
113 |
+
if ( isset( $options['ga_cookiedomain'] ) ) { // v4.9
|
114 |
+
$options['ga_cookiedomain'] = sanitize_text_field( $options['ga_cookiedomain'] );
|
115 |
+
}
|
116 |
+
if ( isset( $options['ga_cookiename'] ) ) { // v4.9
|
117 |
+
$options['ga_cookiename'] = sanitize_text_field( $options['ga_cookiename'] );
|
118 |
+
}
|
119 |
+
if ( isset( $options['pagetitle_404'] ) ) { // v4.9.4
|
120 |
+
$options['pagetitle_404'] = sanitize_text_field( $options['pagetitle_404'] );
|
121 |
+
}
|
122 |
+
if ( isset( $options['maps_api_key'] ) ) { // v4.9.4
|
123 |
+
$options['maps_api_key'] = sanitize_text_field( $options['maps_api_key'] );
|
124 |
+
}
|
125 |
+
if ( isset( $options['ga_cookieexpires'] ) && $options['ga_cookieexpires'] ) { // v4.9
|
126 |
+
$options['ga_cookieexpires'] = (int) $options['ga_cookieexpires'];
|
127 |
+
}
|
128 |
+
if ( isset( $options['ga_event_affiliates'] ) ) {
|
129 |
+
if ( empty( $options['ga_event_affiliates'] ) ) {
|
130 |
+
$options['ga_event_affiliates'] = '/out/';
|
131 |
+
}
|
132 |
+
$options['ga_event_affiliates'] = sanitize_text_field( $options['ga_event_affiliates'] );
|
133 |
+
}
|
134 |
+
|
135 |
+
$token = json_decode( $options['ga_dash_token'] ); // v4.8.2
|
136 |
+
if ( isset( $token->token_type ) ) {
|
137 |
+
unset( $options['ga_dash_refresh_token'] );
|
138 |
+
}
|
139 |
+
|
140 |
+
return $options;
|
141 |
+
}
|
142 |
+
|
143 |
+
public function set_plugin_options( $network_settings = false ) {
|
144 |
+
// Handle Network Mode
|
145 |
+
$options = $this->options;
|
146 |
+
$get_network_options = get_site_option( 'gadash_network_options' );
|
147 |
+
$old_network_options = (array) json_decode( $get_network_options );
|
148 |
+
if ( is_multisite() ) {
|
149 |
+
if ( $network_settings ) { // Retrieve network options, clear blog options, store both to db
|
150 |
+
$network_options['ga_dash_token'] = $this->options['ga_dash_token'];
|
151 |
+
$options['ga_dash_token'] = '';
|
152 |
+
if ( is_network_admin() ) {
|
153 |
+
$network_options['ga_dash_profile_list'] = $this->options['ga_dash_profile_list'];
|
154 |
+
$options['ga_dash_profile_list'] = array();
|
155 |
+
$network_options['ga_dash_clientid'] = $this->options['ga_dash_clientid'];
|
156 |
+
$options['ga_dash_clientid'] = '';
|
157 |
+
$network_options['ga_dash_clientsecret'] = $this->options['ga_dash_clientsecret'];
|
158 |
+
$options['ga_dash_clientsecret'] = '';
|
159 |
+
$network_options['ga_dash_userapi'] = $this->options['ga_dash_userapi'];
|
160 |
+
$options['ga_dash_userapi'] = 0;
|
161 |
+
$network_options['ga_dash_network'] = $this->options['ga_dash_network'];
|
162 |
+
$network_options['ga_dash_excludesa'] = $this->options['ga_dash_excludesa'];
|
163 |
+
$network_options['automatic_updates_minorversion'] = $this->options['automatic_updates_minorversion'];
|
164 |
+
unset( $options['ga_dash_network'] );
|
165 |
+
if ( isset( $this->options['ga_dash_tableid_network'] ) ) {
|
166 |
+
$network_options['ga_dash_tableid_network'] = $this->options['ga_dash_tableid_network'];
|
167 |
+
unset( $options['ga_dash_tableid_network'] );
|
168 |
+
}
|
169 |
+
}
|
170 |
+
update_site_option( 'gadash_network_options', json_encode( $this->validate_data( array_merge( $old_network_options, $network_options ) ) ) );
|
171 |
+
}
|
172 |
+
}
|
173 |
+
update_option( 'gadash_options', json_encode( $this->validate_data( $options ) ) );
|
174 |
+
}
|
175 |
+
|
176 |
+
private function get_plugin_options() {
|
177 |
+
/*
|
178 |
+
* Get plugin options
|
179 |
+
*/
|
180 |
+
global $blog_id;
|
181 |
+
|
182 |
+
if ( ! get_option( 'gadash_options' ) ) {
|
183 |
+
GADWP_Install::install();
|
184 |
+
}
|
185 |
+
$this->options = (array) json_decode( get_option( 'gadash_options' ) );
|
186 |
+
// Maintain Compatibility
|
187 |
+
$this->maintain_compatibility();
|
188 |
+
// Handle Network Mode
|
189 |
+
if ( is_multisite() ) {
|
190 |
+
$get_network_options = get_site_option( 'gadash_network_options' );
|
191 |
+
$network_options = (array) json_decode( $get_network_options );
|
192 |
+
if ( isset( $network_options['ga_dash_network'] ) && ( $network_options['ga_dash_network'] ) ) {
|
193 |
+
if ( ! is_network_admin() && ! empty( $network_options['ga_dash_profile_list'] ) && isset( $network_options['ga_dash_tableid_network']->$blog_id ) ) {
|
194 |
+
$network_options['ga_dash_profile_list'] = array( 0 => GADWP_Tools::get_selected_profile( $network_options['ga_dash_profile_list'], $network_options['ga_dash_tableid_network']->$blog_id ) );
|
195 |
+
$network_options['ga_dash_tableid_jail'] = $network_options['ga_dash_profile_list'][0][1];
|
196 |
+
}
|
197 |
+
$this->options = array_merge( $this->options, $network_options );
|
198 |
+
} else {
|
199 |
+
$this->options['ga_dash_network'] = 0;
|
200 |
+
}
|
201 |
+
}
|
202 |
+
}
|
203 |
+
|
204 |
+
private function maintain_compatibility() {
|
205 |
+
$flag = false;
|
206 |
+
|
207 |
+
if ( GADWP_CURRENT_VERSION != get_option( 'gadwp_version' ) ) {
|
208 |
+
$flag = true;
|
209 |
+
update_option( 'gadwp_version', GADWP_CURRENT_VERSION );
|
210 |
+
update_option( 'gadwp_got_updated', true );
|
211 |
+
$rebuild_token = json_decode( $this->options['ga_dash_token'] ); // v4.8.2
|
212 |
+
if ( is_object( $rebuild_token ) && ! isset( $rebuild_token->token_type ) ) {
|
213 |
+
if ( isset( $this->options['ga_dash_refresh_token'] ) ) {
|
214 |
+
$rebuild_token->refresh_token = $this->options['ga_dash_refresh_token'];
|
215 |
+
}
|
216 |
+
$rebuild_token->token_type = "Bearer";
|
217 |
+
$this->options['ga_dash_token'] = json_encode( $rebuild_token );
|
218 |
+
unset( $this->options['ga_dash_refresh_token'] );
|
219 |
+
$this->set_plugin_options( true );
|
220 |
+
} else {
|
221 |
+
unset( $this->options['ga_dash_refresh_token'] );
|
222 |
+
}
|
223 |
+
GADWP_Tools::clear_cache();
|
224 |
+
GADWP_Tools::delete_cache( 'last_error' );
|
225 |
+
if ( is_multisite() ) { // Cleanup errors and cookies on the entire network
|
226 |
+
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
227 |
+
switch_to_blog( $blog['blog_id'] );
|
228 |
+
GADWP_Tools::delete_cache( 'gapi_errors' );
|
229 |
+
restore_current_blog();
|
230 |
+
}
|
231 |
+
} else {
|
232 |
+
GADWP_Tools::delete_cache( 'gapi_errors' );
|
233 |
+
}
|
234 |
+
GADWP_Tools::unset_cookie( 'default_metric' );
|
235 |
+
GADWP_Tools::unset_cookie( 'default_dimension' );
|
236 |
+
GADWP_Tools::unset_cookie( 'default_view' );
|
237 |
+
}
|
238 |
+
if ( ! isset( $this->options['ga_enhanced_links'] ) ) {
|
239 |
+
$this->options['ga_enhanced_links'] = 0;
|
240 |
+
$flag = true;
|
241 |
+
}
|
242 |
+
if ( ! isset( $this->options['ga_dash_network'] ) ) {
|
243 |
+
$this->options['ga_dash_network'] = 0;
|
244 |
+
$flag = true;
|
245 |
+
}
|
246 |
+
if ( ! isset( $this->options['ga_enhanced_excludesa'] ) ) {
|
247 |
+
$this->options['ga_dash_excludesa'] = 0;
|
248 |
+
$flag = true;
|
249 |
+
}
|
250 |
+
if ( ! isset( $this->options['ga_dash_remarketing'] ) ) {
|
251 |
+
$this->options['ga_dash_remarketing'] = 0;
|
252 |
+
$flag = true;
|
253 |
+
}
|
254 |
+
if ( ! isset( $this->options['ga_dash_adsense'] ) ) {
|
255 |
+
$this->options['ga_dash_adsense'] = 0;
|
256 |
+
$flag = true;
|
257 |
+
}
|
258 |
+
if ( ! isset( $this->options['ga_speed_samplerate'] ) ) {
|
259 |
+
$this->options['ga_speed_samplerate'] = 1;
|
260 |
+
$flag = true;
|
261 |
+
}
|
262 |
+
if ( ! isset( $this->options['automatic_updates_minorversion'] ) ) {
|
263 |
+
$this->options['automatic_updates_minorversion'] = 1;
|
264 |
+
$flag = true;
|
265 |
+
}
|
266 |
+
if ( ! isset( $this->options['ga_event_bouncerate'] ) ) {
|
267 |
+
$this->options['ga_event_bouncerate'] = 0;
|
268 |
+
$flag = true;
|
269 |
+
}
|
270 |
+
if ( ! is_array( $this->options['ga_dash_access_front'] ) || empty( $this->options['ga_dash_access_front'] ) ) {
|
271 |
+
$this->options['ga_dash_access_front'] = array();
|
272 |
+
$this->options['ga_dash_access_front'][] = 'administrator';
|
273 |
+
$flag = true;
|
274 |
+
}
|
275 |
+
|
276 |
+
if ( ! is_array( $this->options['ga_dash_profile_list'] ) ) {
|
277 |
+
$this->options['ga_dash_profile_list'] = array();
|
278 |
+
$flag = true;
|
279 |
+
}
|
280 |
+
|
281 |
+
if ( ! is_array( $this->options['ga_dash_access_back'] ) || empty( $this->options['ga_dash_access_back'] ) ) {
|
282 |
+
$this->options['ga_dash_access_back'] = array();
|
283 |
+
$this->options['ga_dash_access_back'][] = 'administrator';
|
284 |
+
$flag = true;
|
285 |
+
}
|
286 |
+
if ( ! is_array( $this->options['ga_track_exclude'] ) ) {
|
287 |
+
$this->options['ga_track_exclude'] = array();
|
288 |
+
$flag = true;
|
289 |
+
}
|
290 |
+
if ( ! isset( $this->options['ga_crossdomain_tracking'] ) ) {
|
291 |
+
$this->options['ga_crossdomain_tracking'] = 0;
|
292 |
+
$flag = true;
|
293 |
+
}
|
294 |
+
if ( ! isset( $this->options['ga_crossdomain_list'] ) ) {
|
295 |
+
$this->options['ga_crossdomain_list'] = '';
|
296 |
+
$flag = true;
|
297 |
+
}
|
298 |
+
if ( ! isset( $this->options['ga_author_dimindex'] ) ) {
|
299 |
+
$this->options['ga_author_dimindex'] = 0;
|
300 |
+
$flag = true;
|
301 |
+
}
|
302 |
+
if ( ! isset( $this->options['ga_tag_dimindex'] ) ) {
|
303 |
+
$this->options['ga_tag_dimindex'] = 0;
|
304 |
+
$flag = true;
|
305 |
+
}
|
306 |
+
if ( ! isset( $this->options['ga_category_dimindex'] ) ) {
|
307 |
+
$this->options['ga_category_dimindex'] = 0;
|
308 |
+
$flag = true;
|
309 |
+
}
|
310 |
+
$options['ga_tag_dimindex'] = 0;
|
311 |
+
if ( ! isset( $this->options['ga_user_dimindex'] ) ) {
|
312 |
+
$this->options['ga_user_dimindex'] = 0;
|
313 |
+
$flag = true;
|
314 |
+
}
|
315 |
+
if ( ! isset( $this->options['ga_pubyear_dimindex'] ) ) {
|
316 |
+
$this->options['ga_pubyear_dimindex'] = 0;
|
317 |
+
$flag = true;
|
318 |
+
}
|
319 |
+
if ( ! isset( $this->options['ga_pubyearmonth_dimindex'] ) ) {
|
320 |
+
$this->options['ga_pubyearmonth_dimindex'] = 0;
|
321 |
+
$flag = true;
|
322 |
+
}
|
323 |
+
if ( ! isset( $this->options['ga_event_affiliates'] ) ) {
|
324 |
+
$this->options['ga_event_affiliates'] = '/out/';
|
325 |
+
$flag = true;
|
326 |
+
}
|
327 |
+
if ( ! isset( $this->options['ga_aff_tracking'] ) ) {
|
328 |
+
$this->options['ga_aff_tracking'] = 0;
|
329 |
+
$flag = true;
|
330 |
+
}
|
331 |
+
if ( ! isset( $this->options['ga_hash_tracking'] ) ) {
|
332 |
+
$this->options['ga_hash_tracking'] = 0;
|
333 |
+
$flag = true;
|
334 |
+
}
|
335 |
+
if ( ! isset( $this->options['backend_item_reports'] ) ) { // v4.8
|
336 |
+
$this->options['backend_item_reports'] = 1;
|
337 |
+
$flag = true;
|
338 |
+
}
|
339 |
+
if ( isset( $this->options['ga_dash_default_metric'] ) ) { // v4.8.1
|
340 |
+
unset( $this->options['ga_dash_default_metric'] );
|
341 |
+
$flag = true;
|
342 |
+
}
|
343 |
+
if ( isset( $this->options['ga_dash_default_dimension'] ) ) { // v4.8.1
|
344 |
+
unset( $this->options['ga_dash_default_dimension'] );
|
345 |
+
$flag = true;
|
346 |
+
}
|
347 |
+
if ( isset( $this->options['item_reports'] ) ) { // v4.8
|
348 |
+
$this->options['backend_item_reports'] = $this->options['item_reports'];
|
349 |
+
unset( $this->options['item_reports'] );
|
350 |
+
$flag = true;
|
351 |
+
}
|
352 |
+
if ( isset( $this->options['ga_dash_frontend_stats'] ) ) { // v4.8
|
353 |
+
$this->options['frontend_item_reports'] = $this->options['ga_dash_frontend_stats'];
|
354 |
+
unset( $this->options['ga_dash_frontend_stats'] );
|
355 |
+
$flag = true;
|
356 |
+
}
|
357 |
+
if ( ! isset( $this->options['dashboard_widget'] ) ) { // v4.7
|
358 |
+
$this->options['dashboard_widget'] = 1;
|
359 |
+
$flag = true;
|
360 |
+
}
|
361 |
+
if ( ! isset( $this->options['api_backoff'] ) ) { // v4.8.1.3
|
362 |
+
$this->options['api_backoff'] = 0;
|
363 |
+
$flag = true;
|
364 |
+
}
|
365 |
+
if ( ! isset( $this->options['pagetitle_404'] ) ) { // v4.9.4
|
366 |
+
$this->options['pagetitle_404'] = 'Page Not Found';
|
367 |
+
$flag = true;
|
368 |
+
}
|
369 |
+
if ( ! isset( $this->options['maps_api_key'] ) ) { // v4.9.4
|
370 |
+
$this->options['maps_api_key'] = '';
|
371 |
+
$flag = true;
|
372 |
+
}
|
373 |
+
if ( isset( $this->options['ga_tracking_code'] ) ) {
|
374 |
+
unset( $this->options['ga_tracking_code'] );
|
375 |
+
$flag = true;
|
376 |
+
}
|
377 |
+
if ( isset( $this->options['ga_dash_tableid'] ) ) { // v4.9
|
378 |
+
unset( $this->options['ga_dash_tableid'] );
|
379 |
+
$flag = true;
|
380 |
+
}
|
381 |
+
if ( isset( $this->options['ga_dash_frontend_keywords'] ) ) { // v4.8
|
382 |
+
unset( $this->options['ga_dash_frontend_keywords'] );
|
383 |
+
$flag = true;
|
384 |
+
}
|
385 |
+
if ( isset( $this->options['ga_dash_apikey'] ) ) { // v4.9.1.3
|
386 |
+
unset( $this->options['ga_dash_apikey'] );
|
387 |
+
$flag = true;
|
388 |
+
}
|
389 |
+
if ( isset( $this->options['ga_dash_jailadmins'] ) ) { // v4.7
|
390 |
+
if ( isset( $this->options['ga_dash_jailadmins'] ) ) {
|
391 |
+
$this->options['switch_profile'] = 0;
|
392 |
+
unset( $this->options['ga_dash_jailadmins'] );
|
393 |
+
$flag = true;
|
394 |
+
} else {
|
395 |
+
$this->options['switch_profile'] = 1;
|
396 |
+
unset( $this->options['ga_dash_jailadmins'] );
|
397 |
+
$flag = true;
|
398 |
+
}
|
399 |
+
}
|
400 |
+
if ( ! isset( $this->options['ga_cookiedomain'] ) ) {
|
401 |
+
$this->options['ga_cookiedomain'] = '';
|
402 |
+
$flag = true;
|
403 |
+
}
|
404 |
+
if ( ! isset( $this->options['ga_cookiedomain'] ) ) { // v4.9
|
405 |
+
$this->options['ga_cookiedomain'] = '';
|
406 |
+
$flag = true;
|
407 |
+
}
|
408 |
+
if ( ! isset( $this->options['ga_cookiename'] ) ) { // v4.9
|
409 |
+
$this->options['ga_cookiename'] = '';
|
410 |
+
$flag = true;
|
411 |
+
}
|
412 |
+
if ( ! isset( $this->options['ga_cookieexpires'] ) ) { // v4.9
|
413 |
+
$this->options['ga_cookieexpires'] = '';
|
414 |
+
$flag = true;
|
415 |
+
}
|
416 |
+
|
417 |
+
if ( $flag ) {
|
418 |
+
$this->set_plugin_options( false );
|
419 |
+
}
|
420 |
+
}
|
421 |
+
}
|
422 |
+
}
|
front/ajax-actions.php
CHANGED
@@ -1,152 +1,152 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Frontend_Ajax' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Frontend_Ajax {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) && $this->gadwp->config->options['frontend_item_reports'] ) {
|
24 |
-
// Item Reports action
|
25 |
-
add_action( 'wp_ajax_gadwp_frontend_item_reports', array( $this, 'ajax_item_reports' ) );
|
26 |
-
}
|
27 |
-
|
28 |
-
// Frontend Widget actions
|
29 |
-
add_action( 'wp_ajax_ajax_frontwidget_report', array( $this, 'ajax_frontend_widget' ) );
|
30 |
-
add_action( 'wp_ajax_nopriv_ajax_frontwidget_report', array( $this, 'ajax_frontend_widget' ) );
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Ajax handler for Item Reports
|
35 |
-
*
|
36 |
-
* @return string|int
|
37 |
-
*/
|
38 |
-
public function ajax_item_reports() {
|
39 |
-
if ( ! isset( $_POST['gadwp_security_frontend_item_reports'] ) || ! wp_verify_nonce( $_POST['gadwp_security_frontend_item_reports'], 'gadwp_frontend_item_reports' ) ) {
|
40 |
-
wp_die( - 30 );
|
41 |
-
}
|
42 |
-
|
43 |
-
$from = $_POST['from'];
|
44 |
-
$to = $_POST['to'];
|
45 |
-
$query = $_POST['query'];
|
46 |
-
$uri = $_POST['filter'];
|
47 |
-
|
48 |
-
$query = $_POST['query'];
|
49 |
-
if ( ob_get_length() ) {
|
50 |
-
ob_clean();
|
51 |
-
}
|
52 |
-
|
53 |
-
if ( ! GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) || 0 == $this->gadwp->config->options['frontend_item_reports'] ) {
|
54 |
-
wp_die( - 31 );
|
55 |
-
}
|
56 |
-
|
57 |
-
if ( $this->gadwp->config->options['ga_dash_token'] && $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
58 |
-
if ( null === $this->gadwp->gapi_controller ) {
|
59 |
-
$this->gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
60 |
-
}
|
61 |
-
} else {
|
62 |
-
wp_die( - 24 );
|
63 |
-
}
|
64 |
-
|
65 |
-
if ( $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
66 |
-
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
67 |
-
} else {
|
68 |
-
wp_die( - 26 );
|
69 |
-
}
|
70 |
-
|
71 |
-
$profile_info = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $projectId );
|
72 |
-
|
73 |
-
if ( isset( $profile_info[4] ) ) {
|
74 |
-
$this->gadwp->gapi_controller->timeshift = $profile_info[4];
|
75 |
-
} else {
|
76 |
-
$this->gadwp->gapi_controller->timeshift = (int) current_time( 'timestamp' ) - time();
|
77 |
-
}
|
78 |
-
|
79 |
-
$uri = '/' . ltrim( $uri, '/' );
|
80 |
-
|
81 |
-
// allow URL correction before sending an API request
|
82 |
-
$filter = apply_filters( 'gadwp_frontenditem_uri', $uri );
|
83 |
-
|
84 |
-
$lastchar = substr( $filter, - 1 );
|
85 |
-
|
86 |
-
if ( isset( $profile_info[6] ) && $profile_info[6] && $lastchar == '/' ) {
|
87 |
-
$filter = $filter . $profile_info[6];
|
88 |
-
}
|
89 |
-
|
90 |
-
// Encode URL
|
91 |
-
$filter = rawurlencode( rawurldecode( $filter ) );
|
92 |
-
|
93 |
-
$queries = explode( ',', $query );
|
94 |
-
|
95 |
-
$results = array();
|
96 |
-
|
97 |
-
foreach ( $queries as $value ) {
|
98 |
-
$results[] = $this->gadwp->gapi_controller->get( $projectId, $value, $from, $to, $filter );
|
99 |
-
}
|
100 |
-
|
101 |
-
wp_send_json( $results );
|
102 |
-
}
|
103 |
-
|
104 |
-
/**
|
105 |
-
* Ajax handler for getting analytics data for frontend Widget
|
106 |
-
*
|
107 |
-
* @return string|int
|
108 |
-
*/
|
109 |
-
public function ajax_frontend_widget() {
|
110 |
-
if ( ! isset( $_POST['gadwp_number'] ) || ! isset( $_POST['gadwp_optionname'] ) || ! is_active_widget( false, false, 'gadwp-frontwidget-report' ) ) {
|
111 |
-
wp_die( - 30 );
|
112 |
-
}
|
113 |
-
$widget_index = $_POST['gadwp_number'];
|
114 |
-
$option_name = $_POST['gadwp_optionname'];
|
115 |
-
$options = get_option( $option_name );
|
116 |
-
if ( isset( $options[$widget_index] ) ) {
|
117 |
-
$instance = $options[$widget_index];
|
118 |
-
} else {
|
119 |
-
wp_die( - 32 );
|
120 |
-
}
|
121 |
-
switch ( $instance['period'] ) { // make sure we have a valid request
|
122 |
-
case '7daysAgo' :
|
123 |
-
$period = '7daysAgo';
|
124 |
-
break;
|
125 |
-
case '14daysAgo' :
|
126 |
-
$period = '14daysAgo';
|
127 |
-
break;
|
128 |
-
default :
|
129 |
-
$period = '30daysAgo';
|
130 |
-
break;
|
131 |
-
}
|
132 |
-
if ( ob_get_length() ) {
|
133 |
-
ob_clean();
|
134 |
-
}
|
135 |
-
if ( $this->gadwp->config->options['ga_dash_token'] && $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
136 |
-
if ( null === $this->gadwp->gapi_controller ) {
|
137 |
-
$this->gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
138 |
-
}
|
139 |
-
} else {
|
140 |
-
wp_die( - 24 );
|
141 |
-
}
|
142 |
-
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
143 |
-
$profile_info = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $projectId );
|
144 |
-
if ( isset( $profile_info[4] ) ) {
|
145 |
-
$this->gadwp->gapi_controller->timeshift = $profile_info[4];
|
146 |
-
} else {
|
147 |
-
$this->gadwp->gapi_controller->timeshift = (int) current_time( 'timestamp' ) - time();
|
148 |
-
}
|
149 |
-
wp_send_json( $this->gadwp->gapi_controller->frontend_widget_stats( $projectId, $period, (int) $instance['anonim'] ) );
|
150 |
-
}
|
151 |
-
}
|
152 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Frontend_Ajax' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Frontend_Ajax {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) && $this->gadwp->config->options['frontend_item_reports'] ) {
|
24 |
+
// Item Reports action
|
25 |
+
add_action( 'wp_ajax_gadwp_frontend_item_reports', array( $this, 'ajax_item_reports' ) );
|
26 |
+
}
|
27 |
+
|
28 |
+
// Frontend Widget actions
|
29 |
+
add_action( 'wp_ajax_ajax_frontwidget_report', array( $this, 'ajax_frontend_widget' ) );
|
30 |
+
add_action( 'wp_ajax_nopriv_ajax_frontwidget_report', array( $this, 'ajax_frontend_widget' ) );
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Ajax handler for Item Reports
|
35 |
+
*
|
36 |
+
* @return string|int
|
37 |
+
*/
|
38 |
+
public function ajax_item_reports() {
|
39 |
+
if ( ! isset( $_POST['gadwp_security_frontend_item_reports'] ) || ! wp_verify_nonce( $_POST['gadwp_security_frontend_item_reports'], 'gadwp_frontend_item_reports' ) ) {
|
40 |
+
wp_die( - 30 );
|
41 |
+
}
|
42 |
+
|
43 |
+
$from = $_POST['from'];
|
44 |
+
$to = $_POST['to'];
|
45 |
+
$query = $_POST['query'];
|
46 |
+
$uri = $_POST['filter'];
|
47 |
+
|
48 |
+
$query = $_POST['query'];
|
49 |
+
if ( ob_get_length() ) {
|
50 |
+
ob_clean();
|
51 |
+
}
|
52 |
+
|
53 |
+
if ( ! GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) || 0 == $this->gadwp->config->options['frontend_item_reports'] ) {
|
54 |
+
wp_die( - 31 );
|
55 |
+
}
|
56 |
+
|
57 |
+
if ( $this->gadwp->config->options['ga_dash_token'] && $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
58 |
+
if ( null === $this->gadwp->gapi_controller ) {
|
59 |
+
$this->gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
60 |
+
}
|
61 |
+
} else {
|
62 |
+
wp_die( - 24 );
|
63 |
+
}
|
64 |
+
|
65 |
+
if ( $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
66 |
+
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
67 |
+
} else {
|
68 |
+
wp_die( - 26 );
|
69 |
+
}
|
70 |
+
|
71 |
+
$profile_info = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $projectId );
|
72 |
+
|
73 |
+
if ( isset( $profile_info[4] ) ) {
|
74 |
+
$this->gadwp->gapi_controller->timeshift = $profile_info[4];
|
75 |
+
} else {
|
76 |
+
$this->gadwp->gapi_controller->timeshift = (int) current_time( 'timestamp' ) - time();
|
77 |
+
}
|
78 |
+
|
79 |
+
$uri = '/' . ltrim( $uri, '/' );
|
80 |
+
|
81 |
+
// allow URL correction before sending an API request
|
82 |
+
$filter = apply_filters( 'gadwp_frontenditem_uri', $uri );
|
83 |
+
|
84 |
+
$lastchar = substr( $filter, - 1 );
|
85 |
+
|
86 |
+
if ( isset( $profile_info[6] ) && $profile_info[6] && $lastchar == '/' ) {
|
87 |
+
$filter = $filter . $profile_info[6];
|
88 |
+
}
|
89 |
+
|
90 |
+
// Encode URL
|
91 |
+
$filter = rawurlencode( rawurldecode( $filter ) );
|
92 |
+
|
93 |
+
$queries = explode( ',', $query );
|
94 |
+
|
95 |
+
$results = array();
|
96 |
+
|
97 |
+
foreach ( $queries as $value ) {
|
98 |
+
$results[] = $this->gadwp->gapi_controller->get( $projectId, $value, $from, $to, $filter );
|
99 |
+
}
|
100 |
+
|
101 |
+
wp_send_json( $results );
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Ajax handler for getting analytics data for frontend Widget
|
106 |
+
*
|
107 |
+
* @return string|int
|
108 |
+
*/
|
109 |
+
public function ajax_frontend_widget() {
|
110 |
+
if ( ! isset( $_POST['gadwp_number'] ) || ! isset( $_POST['gadwp_optionname'] ) || ! is_active_widget( false, false, 'gadwp-frontwidget-report' ) ) {
|
111 |
+
wp_die( - 30 );
|
112 |
+
}
|
113 |
+
$widget_index = $_POST['gadwp_number'];
|
114 |
+
$option_name = $_POST['gadwp_optionname'];
|
115 |
+
$options = get_option( $option_name );
|
116 |
+
if ( isset( $options[$widget_index] ) ) {
|
117 |
+
$instance = $options[$widget_index];
|
118 |
+
} else {
|
119 |
+
wp_die( - 32 );
|
120 |
+
}
|
121 |
+
switch ( $instance['period'] ) { // make sure we have a valid request
|
122 |
+
case '7daysAgo' :
|
123 |
+
$period = '7daysAgo';
|
124 |
+
break;
|
125 |
+
case '14daysAgo' :
|
126 |
+
$period = '14daysAgo';
|
127 |
+
break;
|
128 |
+
default :
|
129 |
+
$period = '30daysAgo';
|
130 |
+
break;
|
131 |
+
}
|
132 |
+
if ( ob_get_length() ) {
|
133 |
+
ob_clean();
|
134 |
+
}
|
135 |
+
if ( $this->gadwp->config->options['ga_dash_token'] && $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
136 |
+
if ( null === $this->gadwp->gapi_controller ) {
|
137 |
+
$this->gadwp->gapi_controller = new GADWP_GAPI_Controller();
|
138 |
+
}
|
139 |
+
} else {
|
140 |
+
wp_die( - 24 );
|
141 |
+
}
|
142 |
+
$projectId = $this->gadwp->config->options['ga_dash_tableid_jail'];
|
143 |
+
$profile_info = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $projectId );
|
144 |
+
if ( isset( $profile_info[4] ) ) {
|
145 |
+
$this->gadwp->gapi_controller->timeshift = $profile_info[4];
|
146 |
+
} else {
|
147 |
+
$this->gadwp->gapi_controller->timeshift = (int) current_time( 'timestamp' ) - time();
|
148 |
+
}
|
149 |
+
wp_send_json( $this->gadwp->gapi_controller->frontend_widget_stats( $projectId, $period, (int) $instance['anonim'] ) );
|
150 |
+
}
|
151 |
+
}
|
152 |
+
}
|
front/css/item-reports.css
CHANGED
@@ -1,185 +1,185 @@
|
|
1 |
-
/**
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
/* Frontend Item Reports */
|
10 |
-
.column-gadwp_stats {
|
11 |
-
width: 70px;
|
12 |
-
}
|
13 |
-
|
14 |
-
.gadwp-icon {
|
15 |
-
color: #555;
|
16 |
-
}
|
17 |
-
|
18 |
-
.gadwp-icon:hover {
|
19 |
-
color: #2ea2cc;
|
20 |
-
}
|
21 |
-
|
22 |
-
.gadwp-icon-oldwp {
|
23 |
-
padding-top: 5px;
|
24 |
-
}
|
25 |
-
|
26 |
-
[id^=gadwp-container-] {
|
27 |
-
width: 480px;
|
28 |
-
}
|
29 |
-
|
30 |
-
[id^=gadwp-areachart-] {
|
31 |
-
height: 280px;
|
32 |
-
}
|
33 |
-
|
34 |
-
[id^=gadwp-progressbar-] {
|
35 |
-
width: 100%;
|
36 |
-
height: 3px;
|
37 |
-
margin: 5px 0 0px 0;
|
38 |
-
}
|
39 |
-
|
40 |
-
[id^=gadwp-bottomstats-] {
|
41 |
-
width: 100%;
|
42 |
-
}
|
43 |
-
|
44 |
-
[id^=gadwp-bottomstats-] .inside {
|
45 |
-
display: table;
|
46 |
-
margin: 0 auto;
|
47 |
-
padding: 0px;
|
48 |
-
}
|
49 |
-
|
50 |
-
[id^=gadwp-bottomstats-] .inside .small-box {
|
51 |
-
width: 31.2%;
|
52 |
-
float: left;
|
53 |
-
margin: 10px 5px 10px 5px;
|
54 |
-
background: #fff;
|
55 |
-
text-align: center;
|
56 |
-
-moz-box-shadow: 0px 0px 7px 0px #BBB;
|
57 |
-
-webkit-box-shadow: 0px 0px 7px 0px #BBB;
|
58 |
-
box-shadow: 0px 0px 7px 0px #BBB;
|
59 |
-
}
|
60 |
-
|
61 |
-
[id^=gadwp-bottomstats-] .inside .small-box h3 {
|
62 |
-
font-family: 'Open Sans', sans-serif;
|
63 |
-
font-size: 1em;
|
64 |
-
color: #777;
|
65 |
-
padding: 0px 5px 0px 5px;
|
66 |
-
margin: 0px 0px 0px 0px;
|
67 |
-
text-overflow: ellipsis;
|
68 |
-
overflow: hidden;
|
69 |
-
white-space: nowrap;
|
70 |
-
}
|
71 |
-
|
72 |
-
[id^=gadwp-bottomstats-] .inside .small-box p {
|
73 |
-
font-size: 1.2em;
|
74 |
-
margin: 0px 0px 2px 0px;
|
75 |
-
}
|
76 |
-
|
77 |
-
.gadwp-floatwraper {
|
78 |
-
display: table;
|
79 |
-
width: 100%;
|
80 |
-
height: 100%;
|
81 |
-
}
|
82 |
-
|
83 |
-
[id^=gadwp-piechart-].halfsize {
|
84 |
-
width: 47%;
|
85 |
-
margin: 10px 0 0 0;
|
86 |
-
height: 200px;
|
87 |
-
float: left;
|
88 |
-
}
|
89 |
-
|
90 |
-
[id^=gadwp-piechart-].floatleft {
|
91 |
-
float: left;
|
92 |
-
}
|
93 |
-
|
94 |
-
[id^=gadwp-piechart-].floatright {
|
95 |
-
float: right;
|
96 |
-
}
|
97 |
-
|
98 |
-
[id^=gadwp-tablechart-], [id^=gadwp-tablechart-] {
|
99 |
-
margin: 10px 0 0 0;
|
100 |
-
}
|
101 |
-
|
102 |
-
.ui-dialog.gadwp {
|
103 |
-
font-family: 'Open Sans', sans-serif;
|
104 |
-
font-size: 13px;
|
105 |
-
-webkit-box-sizing: initial;
|
106 |
-
-moz-box-sizing: initial;
|
107 |
-
}
|
108 |
-
|
109 |
-
.ui-dialog.gadwp select {
|
110 |
-
font-family: 'Open Sans', sans-serif;
|
111 |
-
border: 1px solid #ddd;
|
112 |
-
font-size: 14px;
|
113 |
-
background: #fff;
|
114 |
-
padding: 2px;
|
115 |
-
color: #333;
|
116 |
-
width: auto;
|
117 |
-
}
|
118 |
-
|
119 |
-
.ui-dialog.gadwp table {
|
120 |
-
margin: auto;
|
121 |
-
width: auto;
|
122 |
-
}
|
123 |
-
|
124 |
-
.gadwp .ui-dialog-titlebar {
|
125 |
-
font-size: 1.1em;
|
126 |
-
text-overflow: ellipsis;
|
127 |
-
overflow: hidden;
|
128 |
-
}
|
129 |
-
|
130 |
-
@media screen and (max-width: 500px) {
|
131 |
-
[id^=gadwp-container-] {
|
132 |
-
width: 410px;
|
133 |
-
}
|
134 |
-
[id^=gadwp-bottomstats-] .inside .small-box {
|
135 |
-
width: 30.8%;
|
136 |
-
}
|
137 |
-
}
|
138 |
-
|
139 |
-
@media screen and (max-width: 410px) {
|
140 |
-
[id^=gadwp-container-] {
|
141 |
-
width: 260px;
|
142 |
-
}
|
143 |
-
[id^=gadwp-bottomstats-] .inside .small-box {
|
144 |
-
width: 46%;
|
145 |
-
}
|
146 |
-
}
|
147 |
-
|
148 |
-
/* Toolbar Node (Analytics menu item) */
|
149 |
-
#wpadminbar #wp-admin-bar-gadwp-1>.ab-item:before {
|
150 |
-
content: '\f239';
|
151 |
-
top: 2px;
|
152 |
-
}
|
153 |
-
|
154 |
-
.no-font-face #wpadminbar #wp-admin-bar-gadwp-1>.ab-item {
|
155 |
-
text-indent: 0;
|
156 |
-
}
|
157 |
-
|
158 |
-
@media screen and ( max-width: 782px ) {
|
159 |
-
#wpadminbar #wp-admin-bar-gadwp-1>.ab-item {
|
160 |
-
text-indent: 100%;
|
161 |
-
white-space: nowrap;
|
162 |
-
overflow: hidden;
|
163 |
-
width: 52px;
|
164 |
-
padding: 0;
|
165 |
-
color: #999;
|
166 |
-
position: relative;
|
167 |
-
}
|
168 |
-
#wpadminbar #wp-admin-bar-gadwp-1>.ab-item:before {
|
169 |
-
display: block;
|
170 |
-
text-indent: 0;
|
171 |
-
font: normal 32px/1 'dashicons';
|
172 |
-
speak: none;
|
173 |
-
top: 7px;
|
174 |
-
width: 52px;
|
175 |
-
text-align: center;
|
176 |
-
-webkit-font-smoothing: antialiased;
|
177 |
-
-moz-osx-font-smoothing: grayscale;
|
178 |
-
}
|
179 |
-
#wpadminbar li#wp-admin-bar-gadwp-1 {
|
180 |
-
display: block;
|
181 |
-
}
|
182 |
-
#wpadminbar #wp-admin-bar-gadwp-1 {
|
183 |
-
position: static;
|
184 |
-
}
|
185 |
}
|
1 |
+
/**
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
/* Frontend Item Reports */
|
10 |
+
.column-gadwp_stats {
|
11 |
+
width: 70px;
|
12 |
+
}
|
13 |
+
|
14 |
+
.gadwp-icon {
|
15 |
+
color: #555;
|
16 |
+
}
|
17 |
+
|
18 |
+
.gadwp-icon:hover {
|
19 |
+
color: #2ea2cc;
|
20 |
+
}
|
21 |
+
|
22 |
+
.gadwp-icon-oldwp {
|
23 |
+
padding-top: 5px;
|
24 |
+
}
|
25 |
+
|
26 |
+
[id^=gadwp-container-] {
|
27 |
+
width: 480px;
|
28 |
+
}
|
29 |
+
|
30 |
+
[id^=gadwp-areachart-] {
|
31 |
+
height: 280px;
|
32 |
+
}
|
33 |
+
|
34 |
+
[id^=gadwp-progressbar-] {
|
35 |
+
width: 100%;
|
36 |
+
height: 3px;
|
37 |
+
margin: 5px 0 0px 0;
|
38 |
+
}
|
39 |
+
|
40 |
+
[id^=gadwp-bottomstats-] {
|
41 |
+
width: 100%;
|
42 |
+
}
|
43 |
+
|
44 |
+
[id^=gadwp-bottomstats-] .inside {
|
45 |
+
display: table;
|
46 |
+
margin: 0 auto;
|
47 |
+
padding: 0px;
|
48 |
+
}
|
49 |
+
|
50 |
+
[id^=gadwp-bottomstats-] .inside .small-box {
|
51 |
+
width: 31.2%;
|
52 |
+
float: left;
|
53 |
+
margin: 10px 5px 10px 5px;
|
54 |
+
background: #fff;
|
55 |
+
text-align: center;
|
56 |
+
-moz-box-shadow: 0px 0px 7px 0px #BBB;
|
57 |
+
-webkit-box-shadow: 0px 0px 7px 0px #BBB;
|
58 |
+
box-shadow: 0px 0px 7px 0px #BBB;
|
59 |
+
}
|
60 |
+
|
61 |
+
[id^=gadwp-bottomstats-] .inside .small-box h3 {
|
62 |
+
font-family: 'Open Sans', sans-serif;
|
63 |
+
font-size: 1em;
|
64 |
+
color: #777;
|
65 |
+
padding: 0px 5px 0px 5px;
|
66 |
+
margin: 0px 0px 0px 0px;
|
67 |
+
text-overflow: ellipsis;
|
68 |
+
overflow: hidden;
|
69 |
+
white-space: nowrap;
|
70 |
+
}
|
71 |
+
|
72 |
+
[id^=gadwp-bottomstats-] .inside .small-box p {
|
73 |
+
font-size: 1.2em;
|
74 |
+
margin: 0px 0px 2px 0px;
|
75 |
+
}
|
76 |
+
|
77 |
+
.gadwp-floatwraper {
|
78 |
+
display: table;
|
79 |
+
width: 100%;
|
80 |
+
height: 100%;
|
81 |
+
}
|
82 |
+
|
83 |
+
[id^=gadwp-piechart-].halfsize {
|
84 |
+
width: 47%;
|
85 |
+
margin: 10px 0 0 0;
|
86 |
+
height: 200px;
|
87 |
+
float: left;
|
88 |
+
}
|
89 |
+
|
90 |
+
[id^=gadwp-piechart-].floatleft {
|
91 |
+
float: left;
|
92 |
+
}
|
93 |
+
|
94 |
+
[id^=gadwp-piechart-].floatright {
|
95 |
+
float: right;
|
96 |
+
}
|
97 |
+
|
98 |
+
[id^=gadwp-tablechart-], [id^=gadwp-tablechart-] {
|
99 |
+
margin: 10px 0 0 0;
|
100 |
+
}
|
101 |
+
|
102 |
+
.ui-dialog.gadwp {
|
103 |
+
font-family: 'Open Sans', sans-serif;
|
104 |
+
font-size: 13px;
|
105 |
+
-webkit-box-sizing: initial;
|
106 |
+
-moz-box-sizing: initial;
|
107 |
+
}
|
108 |
+
|
109 |
+
.ui-dialog.gadwp select {
|
110 |
+
font-family: 'Open Sans', sans-serif;
|
111 |
+
border: 1px solid #ddd;
|
112 |
+
font-size: 14px;
|
113 |
+
background: #fff;
|
114 |
+
padding: 2px;
|
115 |
+
color: #333;
|
116 |
+
width: auto;
|
117 |
+
}
|
118 |
+
|
119 |
+
.ui-dialog.gadwp table {
|
120 |
+
margin: auto;
|
121 |
+
width: auto;
|
122 |
+
}
|
123 |
+
|
124 |
+
.gadwp .ui-dialog-titlebar {
|
125 |
+
font-size: 1.1em;
|
126 |
+
text-overflow: ellipsis;
|
127 |
+
overflow: hidden;
|
128 |
+
}
|
129 |
+
|
130 |
+
@media screen and (max-width: 500px) {
|
131 |
+
[id^=gadwp-container-] {
|
132 |
+
width: 410px;
|
133 |
+
}
|
134 |
+
[id^=gadwp-bottomstats-] .inside .small-box {
|
135 |
+
width: 30.8%;
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
@media screen and (max-width: 410px) {
|
140 |
+
[id^=gadwp-container-] {
|
141 |
+
width: 260px;
|
142 |
+
}
|
143 |
+
[id^=gadwp-bottomstats-] .inside .small-box {
|
144 |
+
width: 46%;
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
/* Toolbar Node (Analytics menu item) */
|
149 |
+
#wpadminbar #wp-admin-bar-gadwp-1>.ab-item:before {
|
150 |
+
content: '\f239';
|
151 |
+
top: 2px;
|
152 |
+
}
|
153 |
+
|
154 |
+
.no-font-face #wpadminbar #wp-admin-bar-gadwp-1>.ab-item {
|
155 |
+
text-indent: 0;
|
156 |
+
}
|
157 |
+
|
158 |
+
@media screen and ( max-width: 782px ) {
|
159 |
+
#wpadminbar #wp-admin-bar-gadwp-1>.ab-item {
|
160 |
+
text-indent: 100%;
|
161 |
+
white-space: nowrap;
|
162 |
+
overflow: hidden;
|
163 |
+
width: 52px;
|
164 |
+
padding: 0;
|
165 |
+
color: #999;
|
166 |
+
position: relative;
|
167 |
+
}
|
168 |
+
#wpadminbar #wp-admin-bar-gadwp-1>.ab-item:before {
|
169 |
+
display: block;
|
170 |
+
text-indent: 0;
|
171 |
+
font: normal 32px/1 'dashicons';
|
172 |
+
speak: none;
|
173 |
+
top: 7px;
|
174 |
+
width: 52px;
|
175 |
+
text-align: center;
|
176 |
+
-webkit-font-smoothing: antialiased;
|
177 |
+
-moz-osx-font-smoothing: grayscale;
|
178 |
+
}
|
179 |
+
#wpadminbar li#wp-admin-bar-gadwp-1 {
|
180 |
+
display: block;
|
181 |
+
}
|
182 |
+
#wpadminbar #wp-admin-bar-gadwp-1 {
|
183 |
+
position: static;
|
184 |
+
}
|
185 |
}
|
front/css/widgets.css
CHANGED
@@ -1,75 +1,75 @@
|
|
1 |
-
/**
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
#gadwp {
|
9 |
-
font-family: 'Open Sans', sans-serif;
|
10 |
-
}
|
11 |
-
|
12 |
-
#gadwp-searches td {
|
13 |
-
line-height: 1.5em;
|
14 |
-
padding: 2px;
|
15 |
-
font-size: 1em;
|
16 |
-
}
|
17 |
-
|
18 |
-
#gadwp-searches {
|
19 |
-
line-height: 10px;
|
20 |
-
margin-top: 15px;
|
21 |
-
}
|
22 |
-
|
23 |
-
#gadwp-visits {
|
24 |
-
height: 200px;
|
25 |
-
margin-top: 15px;
|
26 |
-
}
|
27 |
-
|
28 |
-
#gadwp-content {
|
29 |
-
width: 100%;
|
30 |
-
}
|
31 |
-
|
32 |
-
#gadwp-title {
|
33 |
-
text-transform: uppercase;
|
34 |
-
font-weight: 600;
|
35 |
-
font-size: 14px;
|
36 |
-
padding-bottom: 2px;
|
37 |
-
}
|
38 |
-
|
39 |
-
#gadwp-widget {
|
40 |
-
padding: 0 5px;
|
41 |
-
}
|
42 |
-
|
43 |
-
#gadwp-widgetchart {
|
44 |
-
width: 100%;
|
45 |
-
}
|
46 |
-
|
47 |
-
#gadwp-widgettotals {
|
48 |
-
margin: 0 0 10px 0;
|
49 |
-
width: 100%;
|
50 |
-
display: table;
|
51 |
-
clear: both;
|
52 |
-
}
|
53 |
-
|
54 |
-
#gadwp-widgettotals .gadwp-left {
|
55 |
-
padding: 10px 0 0 0;
|
56 |
-
width: 45%;
|
57 |
-
float: left;
|
58 |
-
font-weight: 600;
|
59 |
-
}
|
60 |
-
|
61 |
-
#gadwp-progressbar {
|
62 |
-
width: 100%;
|
63 |
-
height: 3px;
|
64 |
-
margin: 3px 0;
|
65 |
-
}
|
66 |
-
|
67 |
-
#gadwp-widgettotals .gadwp-right {
|
68 |
-
padding: 10px 0 0 0;
|
69 |
-
float: left;
|
70 |
-
font-style: italic;
|
71 |
-
}
|
72 |
-
|
73 |
-
.widget_gadwp-frontwidget-report h2.widget-title {
|
74 |
-
margin-bottom: 0px;
|
75 |
}
|
1 |
+
/**
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
#gadwp {
|
9 |
+
font-family: 'Open Sans', sans-serif;
|
10 |
+
}
|
11 |
+
|
12 |
+
#gadwp-searches td {
|
13 |
+
line-height: 1.5em;
|
14 |
+
padding: 2px;
|
15 |
+
font-size: 1em;
|
16 |
+
}
|
17 |
+
|
18 |
+
#gadwp-searches {
|
19 |
+
line-height: 10px;
|
20 |
+
margin-top: 15px;
|
21 |
+
}
|
22 |
+
|
23 |
+
#gadwp-visits {
|
24 |
+
height: 200px;
|
25 |
+
margin-top: 15px;
|
26 |
+
}
|
27 |
+
|
28 |
+
#gadwp-content {
|
29 |
+
width: 100%;
|
30 |
+
}
|
31 |
+
|
32 |
+
#gadwp-title {
|
33 |
+
text-transform: uppercase;
|
34 |
+
font-weight: 600;
|
35 |
+
font-size: 14px;
|
36 |
+
padding-bottom: 2px;
|
37 |
+
}
|
38 |
+
|
39 |
+
#gadwp-widget {
|
40 |
+
padding: 0 5px;
|
41 |
+
}
|
42 |
+
|
43 |
+
#gadwp-widgetchart {
|
44 |
+
width: 100%;
|
45 |
+
}
|
46 |
+
|
47 |
+
#gadwp-widgettotals {
|
48 |
+
margin: 0 0 10px 0;
|
49 |
+
width: 100%;
|
50 |
+
display: table;
|
51 |
+
clear: both;
|
52 |
+
}
|
53 |
+
|
54 |
+
#gadwp-widgettotals .gadwp-left {
|
55 |
+
padding: 10px 0 0 0;
|
56 |
+
width: 45%;
|
57 |
+
float: left;
|
58 |
+
font-weight: 600;
|
59 |
+
}
|
60 |
+
|
61 |
+
#gadwp-progressbar {
|
62 |
+
width: 100%;
|
63 |
+
height: 3px;
|
64 |
+
margin: 3px 0;
|
65 |
+
}
|
66 |
+
|
67 |
+
#gadwp-widgettotals .gadwp-right {
|
68 |
+
padding: 10px 0 0 0;
|
69 |
+
float: left;
|
70 |
+
font-style: italic;
|
71 |
+
}
|
72 |
+
|
73 |
+
.widget_gadwp-frontwidget-report h2.widget-title {
|
74 |
+
margin-bottom: 0px;
|
75 |
}
|
front/item-reports.php
CHANGED
@@ -1,38 +1,38 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Frontend_Item_Reports' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Frontend_Item_Reports {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
add_action( 'admin_bar_menu', array( $this, 'custom_adminbar_node' ), 999 );
|
24 |
-
}
|
25 |
-
|
26 |
-
function custom_adminbar_node( $wp_admin_bar ) {
|
27 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) && $this->gadwp->config->options['frontend_item_reports'] ) {
|
28 |
-
/* @formatter:off */
|
29 |
-
$args = array( 'id' => 'gadwp-1',
|
30 |
-
'title' => '<span class="ab-icon"></span><span class="">' . __( "Analytics", 'google-analytics-dashboard-for-wp' ) . '</span>',
|
31 |
-
'href' => '#1',
|
32 |
-
);
|
33 |
-
/* @formatter:on */
|
34 |
-
$wp_admin_bar->add_node( $args );
|
35 |
-
}
|
36 |
-
}
|
37 |
-
}
|
38 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Frontend_Item_Reports' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Frontend_Item_Reports {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
add_action( 'admin_bar_menu', array( $this, 'custom_adminbar_node' ), 999 );
|
24 |
+
}
|
25 |
+
|
26 |
+
function custom_adminbar_node( $wp_admin_bar ) {
|
27 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) && $this->gadwp->config->options['frontend_item_reports'] ) {
|
28 |
+
/* @formatter:off */
|
29 |
+
$args = array( 'id' => 'gadwp-1',
|
30 |
+
'title' => '<span class="ab-icon"></span><span class="">' . __( "Analytics", 'google-analytics-dashboard-for-wp' ) . '</span>',
|
31 |
+
'href' => '#1',
|
32 |
+
);
|
33 |
+
/* @formatter:on */
|
34 |
+
$wp_admin_bar->add_node( $args );
|
35 |
+
}
|
36 |
+
}
|
37 |
+
}
|
38 |
+
}
|
front/js/widgets.js
CHANGED
@@ -1,13 +1,13 @@
|
|
1 |
-
/*-
|
2 |
-
* Author: Alin Marcu
|
3 |
-
* Author URI: https://deconf.com
|
4 |
-
* Copyright 2013 Alin Marcu
|
5 |
-
* License: GPLv2 or later
|
6 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
-
*/
|
8 |
-
|
9 |
-
jQuery( window ).resize( function () {
|
10 |
-
if ( typeof gadwp_drawFrontWidgetChart == "function" && typeof gadwpFrontWidgetData !== 'undefined' && !jQuery.isNumeric( gadwpFrontWidgetData ) ) {
|
11 |
-
gadwp_drawFrontWidgetChart( gadwpFrontWidgetData );
|
12 |
-
}
|
13 |
} );
|
1 |
+
/*-
|
2 |
+
* Author: Alin Marcu
|
3 |
+
* Author URI: https://deconf.com
|
4 |
+
* Copyright 2013 Alin Marcu
|
5 |
+
* License: GPLv2 or later
|
6 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
7 |
+
*/
|
8 |
+
|
9 |
+
jQuery( window ).resize( function () {
|
10 |
+
if ( typeof gadwp_drawFrontWidgetChart == "function" && typeof gadwpFrontWidgetData !== 'undefined' && !jQuery.isNumeric( gadwpFrontWidgetData ) ) {
|
11 |
+
gadwp_drawFrontWidgetChart( gadwpFrontWidgetData );
|
12 |
+
}
|
13 |
} );
|
front/setup.php
CHANGED
@@ -1,123 +1,123 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Frontend_Setup' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_Frontend_Setup {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
// Styles & Scripts
|
24 |
-
add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_scripts' ) );
|
25 |
-
}
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Styles & Scripts conditional loading
|
29 |
-
*
|
30 |
-
* @param
|
31 |
-
* $hook
|
32 |
-
*/
|
33 |
-
public function load_styles_scripts() {
|
34 |
-
$lang = get_bloginfo( 'language' );
|
35 |
-
$lang = explode( '-', $lang );
|
36 |
-
$lang = $lang[0];
|
37 |
-
|
38 |
-
/*
|
39 |
-
* Item reports Styles & Scripts
|
40 |
-
*/
|
41 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) && $this->gadwp->config->options['frontend_item_reports'] ) {
|
42 |
-
|
43 |
-
wp_enqueue_style( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.css', null, GADWP_CURRENT_VERSION );
|
44 |
-
|
45 |
-
wp_enqueue_style( 'gadwp-frontend-item-reports', GADWP_URL . 'front/css/item-reports.css', null, GADWP_CURRENT_VERSION );
|
46 |
-
|
47 |
-
$country_codes = GADWP_Tools::get_countrycodes();
|
48 |
-
if ( $this->gadwp->config->options['ga_target_geomap'] && isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
|
49 |
-
$region = $this->gadwp->config->options['ga_target_geomap'];
|
50 |
-
} else {
|
51 |
-
$region = false;
|
52 |
-
}
|
53 |
-
|
54 |
-
wp_enqueue_style( "wp-jquery-ui-dialog" );
|
55 |
-
|
56 |
-
wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
57 |
-
|
58 |
-
wp_enqueue_script( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
59 |
-
|
60 |
-
wp_enqueue_script( 'gadwp-frontend-item-reports', GADWP_URL . 'common/js/reports.js', array( 'gadwp-nprogress', 'googlecharts', 'jquery', 'jquery-ui-dialog' ), GADWP_CURRENT_VERSION, true );
|
61 |
-
|
62 |
-
/* @formatter:off */
|
63 |
-
wp_localize_script( 'gadwp-frontend-item-reports', 'gadwpItemData', array(
|
64 |
-
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
65 |
-
'security' => wp_create_nonce( 'gadwp_frontend_item_reports' ),
|
66 |
-
'dateList' => array(
|
67 |
-
'today' => __( "Today", 'google-analytics-dashboard-for-wp' ),
|
68 |
-
'yesterday' => __( "Yesterday", 'google-analytics-dashboard-for-wp' ),
|
69 |
-
'7daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 7 ),
|
70 |
-
'14daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 14 ),
|
71 |
-
'30daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 30 ),
|
72 |
-
'90daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 90 ),
|
73 |
-
'365daysAgo' => sprintf( _n( "%s Year", "%s Years", 1, 'google-analytics-dashboard-for-wp' ), __('One', 'google-analytics-dashboard-for-wp') ),
|
74 |
-
'1095daysAgo' => sprintf( _n( "%s Year", "%s Years", 3, 'google-analytics-dashboard-for-wp' ), __('Three', 'google-analytics-dashboard-for-wp') ),
|
75 |
-
),
|
76 |
-
'reportList' => array(
|
77 |
-
'sessions' => __( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
78 |
-
'users' => __( "Users", 'google-analytics-dashboard-for-wp' ),
|
79 |
-
'organicSearches' => __( "Organic", 'google-analytics-dashboard-for-wp' ),
|
80 |
-
'pageviews' => __( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
81 |
-
'visitBounceRate' => __( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
82 |
-
'locations' => __( "Location", 'google-analytics-dashboard-for-wp' ),
|
83 |
-
'referrers' => __( "Referrers", 'google-analytics-dashboard-for-wp' ),
|
84 |
-
'searches' => __( "Searches", 'google-analytics-dashboard-for-wp' ),
|
85 |
-
'trafficdetails' => __( "Traffic", 'google-analytics-dashboard-for-wp' ),
|
86 |
-
'technologydetails' => __( "Technology", 'google-analytics-dashboard-for-wp' ),
|
87 |
-
),
|
88 |
-
'i18n' => array(
|
89 |
-
__( "A JavaScript Error is blocking plugin resources!", 'google-analytics-dashboard-for-wp' ), //0
|
90 |
-
__( "Traffic Mediums", 'google-analytics-dashboard-for-wp' ),
|
91 |
-
__( "Visitor Type", 'google-analytics-dashboard-for-wp' ),
|
92 |
-
__( "Search Engines", 'google-analytics-dashboard-for-wp' ),
|
93 |
-
__( "Social Networks", 'google-analytics-dashboard-for-wp' ),
|
94 |
-
__( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
95 |
-
__( "Users", 'google-analytics-dashboard-for-wp' ),
|
96 |
-
__( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
97 |
-
__( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
98 |
-
__( "Organic Search", 'google-analytics-dashboard-for-wp' ),
|
99 |
-
__( "Pages/Session", 'google-analytics-dashboard-for-wp' ),
|
100 |
-
__( "Invalid response", 'google-analytics-dashboard-for-wp' ),
|
101 |
-
__( "Not enough data collected", 'google-analytics-dashboard-for-wp' ),
|
102 |
-
__( "This report is unavailable", 'google-analytics-dashboard-for-wp' ),
|
103 |
-
__( "report generated by", 'google-analytics-dashboard-for-wp' ), //14
|
104 |
-
__( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . ' <strong>' . __( "authorize the plugin", 'google-analytics-dashboard-for-wp' ) . '</strong>!',
|
105 |
-
__( "Browser", 'google-analytics-dashboard-for-wp' ), //16
|
106 |
-
__( "Operating System", 'google-analytics-dashboard-for-wp' ),
|
107 |
-
__( "Screen Resolution", 'google-analytics-dashboard-for-wp' ),
|
108 |
-
__( "Mobile Brand", 'google-analytics-dashboard-for-wp' ),
|
109 |
-
),
|
110 |
-
'colorVariations' => GADWP_Tools::variations( $this->gadwp->config->options['ga_dash_style'] ),
|
111 |
-
'region' => $region,
|
112 |
-
'mapsApiKey' => $this->gadwp->config->options['maps_api_key'],
|
113 |
-
'language' => get_bloginfo( 'language' ),
|
114 |
-
'filter' => $_SERVER["REQUEST_URI"],
|
115 |
-
'viewList' => false,
|
116 |
-
'scope' => 'front-item',
|
117 |
-
)
|
118 |
-
);
|
119 |
-
/* @formatter:on */
|
120 |
-
}
|
121 |
-
}
|
122 |
-
}
|
123 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Frontend_Setup' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_Frontend_Setup {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
// Styles & Scripts
|
24 |
+
add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_scripts' ) );
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Styles & Scripts conditional loading
|
29 |
+
*
|
30 |
+
* @param
|
31 |
+
* $hook
|
32 |
+
*/
|
33 |
+
public function load_styles_scripts() {
|
34 |
+
$lang = get_bloginfo( 'language' );
|
35 |
+
$lang = explode( '-', $lang );
|
36 |
+
$lang = $lang[0];
|
37 |
+
|
38 |
+
/*
|
39 |
+
* Item reports Styles & Scripts
|
40 |
+
*/
|
41 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_dash_access_front'] ) && $this->gadwp->config->options['frontend_item_reports'] ) {
|
42 |
+
|
43 |
+
wp_enqueue_style( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.css', null, GADWP_CURRENT_VERSION );
|
44 |
+
|
45 |
+
wp_enqueue_style( 'gadwp-frontend-item-reports', GADWP_URL . 'front/css/item-reports.css', null, GADWP_CURRENT_VERSION );
|
46 |
+
|
47 |
+
$country_codes = GADWP_Tools::get_countrycodes();
|
48 |
+
if ( $this->gadwp->config->options['ga_target_geomap'] && isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
|
49 |
+
$region = $this->gadwp->config->options['ga_target_geomap'];
|
50 |
+
} else {
|
51 |
+
$region = false;
|
52 |
+
}
|
53 |
+
|
54 |
+
wp_enqueue_style( "wp-jquery-ui-dialog" );
|
55 |
+
|
56 |
+
wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
57 |
+
|
58 |
+
wp_enqueue_script( 'gadwp-nprogress', GADWP_URL . 'common/nprogress/nprogress.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
59 |
+
|
60 |
+
wp_enqueue_script( 'gadwp-frontend-item-reports', GADWP_URL . 'common/js/reports.js', array( 'gadwp-nprogress', 'googlecharts', 'jquery', 'jquery-ui-dialog' ), GADWP_CURRENT_VERSION, true );
|
61 |
+
|
62 |
+
/* @formatter:off */
|
63 |
+
wp_localize_script( 'gadwp-frontend-item-reports', 'gadwpItemData', array(
|
64 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
65 |
+
'security' => wp_create_nonce( 'gadwp_frontend_item_reports' ),
|
66 |
+
'dateList' => array(
|
67 |
+
'today' => __( "Today", 'google-analytics-dashboard-for-wp' ),
|
68 |
+
'yesterday' => __( "Yesterday", 'google-analytics-dashboard-for-wp' ),
|
69 |
+
'7daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 7 ),
|
70 |
+
'14daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 14 ),
|
71 |
+
'30daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 30 ),
|
72 |
+
'90daysAgo' => sprintf( __( "Last %d Days", 'google-analytics-dashboard-for-wp' ), 90 ),
|
73 |
+
'365daysAgo' => sprintf( _n( "%s Year", "%s Years", 1, 'google-analytics-dashboard-for-wp' ), __('One', 'google-analytics-dashboard-for-wp') ),
|
74 |
+
'1095daysAgo' => sprintf( _n( "%s Year", "%s Years", 3, 'google-analytics-dashboard-for-wp' ), __('Three', 'google-analytics-dashboard-for-wp') ),
|
75 |
+
),
|
76 |
+
'reportList' => array(
|
77 |
+
'sessions' => __( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
78 |
+
'users' => __( "Users", 'google-analytics-dashboard-for-wp' ),
|
79 |
+
'organicSearches' => __( "Organic", 'google-analytics-dashboard-for-wp' ),
|
80 |
+
'pageviews' => __( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
81 |
+
'visitBounceRate' => __( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
82 |
+
'locations' => __( "Location", 'google-analytics-dashboard-for-wp' ),
|
83 |
+
'referrers' => __( "Referrers", 'google-analytics-dashboard-for-wp' ),
|
84 |
+
'searches' => __( "Searches", 'google-analytics-dashboard-for-wp' ),
|
85 |
+
'trafficdetails' => __( "Traffic", 'google-analytics-dashboard-for-wp' ),
|
86 |
+
'technologydetails' => __( "Technology", 'google-analytics-dashboard-for-wp' ),
|
87 |
+
),
|
88 |
+
'i18n' => array(
|
89 |
+
__( "A JavaScript Error is blocking plugin resources!", 'google-analytics-dashboard-for-wp' ), //0
|
90 |
+
__( "Traffic Mediums", 'google-analytics-dashboard-for-wp' ),
|
91 |
+
__( "Visitor Type", 'google-analytics-dashboard-for-wp' ),
|
92 |
+
__( "Search Engines", 'google-analytics-dashboard-for-wp' ),
|
93 |
+
__( "Social Networks", 'google-analytics-dashboard-for-wp' ),
|
94 |
+
__( "Sessions", 'google-analytics-dashboard-for-wp' ),
|
95 |
+
__( "Users", 'google-analytics-dashboard-for-wp' ),
|
96 |
+
__( "Page Views", 'google-analytics-dashboard-for-wp' ),
|
97 |
+
__( "Bounce Rate", 'google-analytics-dashboard-for-wp' ),
|
98 |
+
__( "Organic Search", 'google-analytics-dashboard-for-wp' ),
|
99 |
+
__( "Pages/Session", 'google-analytics-dashboard-for-wp' ),
|
100 |
+
__( "Invalid response", 'google-analytics-dashboard-for-wp' ),
|
101 |
+
__( "Not enough data collected", 'google-analytics-dashboard-for-wp' ),
|
102 |
+
__( "This report is unavailable", 'google-analytics-dashboard-for-wp' ),
|
103 |
+
__( "report generated by", 'google-analytics-dashboard-for-wp' ), //14
|
104 |
+
__( "This plugin needs an authorization:", 'google-analytics-dashboard-for-wp' ) . ' <strong>' . __( "authorize the plugin", 'google-analytics-dashboard-for-wp' ) . '</strong>!',
|
105 |
+
__( "Browser", 'google-analytics-dashboard-for-wp' ), //16
|
106 |
+
__( "Operating System", 'google-analytics-dashboard-for-wp' ),
|
107 |
+
__( "Screen Resolution", 'google-analytics-dashboard-for-wp' ),
|
108 |
+
__( "Mobile Brand", 'google-analytics-dashboard-for-wp' ),
|
109 |
+
),
|
110 |
+
'colorVariations' => GADWP_Tools::variations( $this->gadwp->config->options['ga_dash_style'] ),
|
111 |
+
'region' => $region,
|
112 |
+
'mapsApiKey' => $this->gadwp->config->options['maps_api_key'],
|
113 |
+
'language' => get_bloginfo( 'language' ),
|
114 |
+
'filter' => $_SERVER["REQUEST_URI"],
|
115 |
+
'viewList' => false,
|
116 |
+
'scope' => 'front-item',
|
117 |
+
)
|
118 |
+
);
|
119 |
+
/* @formatter:on */
|
120 |
+
}
|
121 |
+
}
|
122 |
+
}
|
123 |
+
}
|
front/tracking.php
CHANGED
@@ -1,64 +1,64 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_Tracking' ) ) {
|
15 |
-
|
16 |
-
class GADWP_Tracking {
|
17 |
-
|
18 |
-
private $gadwp;
|
19 |
-
|
20 |
-
public function __construct() {
|
21 |
-
$this->gadwp = GADWP();
|
22 |
-
|
23 |
-
add_action( 'wp_head', array( $this, 'tracking_code' ), 99 );
|
24 |
-
add_action( 'wp_enqueue_scripts', array( $this, 'load_scripts' ) );
|
25 |
-
}
|
26 |
-
|
27 |
-
public function load_scripts() {
|
28 |
-
if ( $this->gadwp->config->options['ga_event_tracking'] ) {
|
29 |
-
if ( wp_script_is( 'jquery' ) ) {
|
30 |
-
wp_dequeue_script( 'jquery' );
|
31 |
-
}
|
32 |
-
wp_enqueue_script( 'jquery' );
|
33 |
-
}
|
34 |
-
}
|
35 |
-
|
36 |
-
public function tracking_code() {
|
37 |
-
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_track_exclude'], true ) || ( $this->gadwp->config->options['ga_dash_excludesa'] && current_user_can( 'manage_network' ) ) ) {
|
38 |
-
return;
|
39 |
-
}
|
40 |
-
$traking_mode = $this->gadwp->config->options['ga_dash_tracking'];
|
41 |
-
$traking_type = $this->gadwp->config->options['ga_dash_tracking_type'];
|
42 |
-
if ( $traking_mode > 0 ) {
|
43 |
-
if ( ! $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
44 |
-
return;
|
45 |
-
}
|
46 |
-
if ( $traking_type == "classic" ) {
|
47 |
-
echo "\n<!-- BEGIN GADWP v" . GADWP_CURRENT_VERSION . " Classic Tracking - https://deconf.com/google-analytics-dashboard-wordpress/ -->\n";
|
48 |
-
if ( $this->gadwp->config->options['ga_event_tracking'] ) {
|
49 |
-
require_once 'tracking/events-classic.php';
|
50 |
-
}
|
51 |
-
require_once 'tracking/code-classic.php';
|
52 |
-
echo "\n<!-- END GADWP Classic Tracking -->\n\n";
|
53 |
-
} else {
|
54 |
-
echo "\n<!-- BEGIN GADWP v" . GADWP_CURRENT_VERSION . " Universal Tracking - https://deconf.com/google-analytics-dashboard-wordpress/ -->\n";
|
55 |
-
if ( $this->gadwp->config->options['ga_event_tracking'] || $this->gadwp->config->options['ga_aff_tracking'] || $this->gadwp->config->options['ga_hash_tracking'] ) {
|
56 |
-
require_once 'tracking/events-universal.php';
|
57 |
-
}
|
58 |
-
require_once 'tracking/code-universal.php';
|
59 |
-
echo "\n<!-- END GADWP Universal Tracking -->\n\n";
|
60 |
-
}
|
61 |
-
}
|
62 |
-
}
|
63 |
-
}
|
64 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_Tracking' ) ) {
|
15 |
+
|
16 |
+
class GADWP_Tracking {
|
17 |
+
|
18 |
+
private $gadwp;
|
19 |
+
|
20 |
+
public function __construct() {
|
21 |
+
$this->gadwp = GADWP();
|
22 |
+
|
23 |
+
add_action( 'wp_head', array( $this, 'tracking_code' ), 99 );
|
24 |
+
add_action( 'wp_enqueue_scripts', array( $this, 'load_scripts' ) );
|
25 |
+
}
|
26 |
+
|
27 |
+
public function load_scripts() {
|
28 |
+
if ( $this->gadwp->config->options['ga_event_tracking'] ) {
|
29 |
+
if ( wp_script_is( 'jquery' ) ) {
|
30 |
+
wp_dequeue_script( 'jquery' );
|
31 |
+
}
|
32 |
+
wp_enqueue_script( 'jquery' );
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
public function tracking_code() {
|
37 |
+
if ( GADWP_Tools::check_roles( $this->gadwp->config->options['ga_track_exclude'], true ) || ( $this->gadwp->config->options['ga_dash_excludesa'] && current_user_can( 'manage_network' ) ) ) {
|
38 |
+
return;
|
39 |
+
}
|
40 |
+
$traking_mode = $this->gadwp->config->options['ga_dash_tracking'];
|
41 |
+
$traking_type = $this->gadwp->config->options['ga_dash_tracking_type'];
|
42 |
+
if ( $traking_mode > 0 ) {
|
43 |
+
if ( ! $this->gadwp->config->options['ga_dash_tableid_jail'] ) {
|
44 |
+
return;
|
45 |
+
}
|
46 |
+
if ( $traking_type == "classic" ) {
|
47 |
+
echo "\n<!-- BEGIN GADWP v" . GADWP_CURRENT_VERSION . " Classic Tracking - https://deconf.com/google-analytics-dashboard-wordpress/ -->\n";
|
48 |
+
if ( $this->gadwp->config->options['ga_event_tracking'] ) {
|
49 |
+
require_once 'tracking/events-classic.php';
|
50 |
+
}
|
51 |
+
require_once 'tracking/code-classic.php';
|
52 |
+
echo "\n<!-- END GADWP Classic Tracking -->\n\n";
|
53 |
+
} else {
|
54 |
+
echo "\n<!-- BEGIN GADWP v" . GADWP_CURRENT_VERSION . " Universal Tracking - https://deconf.com/google-analytics-dashboard-wordpress/ -->\n";
|
55 |
+
if ( $this->gadwp->config->options['ga_event_tracking'] || $this->gadwp->config->options['ga_aff_tracking'] || $this->gadwp->config->options['ga_hash_tracking'] ) {
|
56 |
+
require_once 'tracking/events-universal.php';
|
57 |
+
}
|
58 |
+
require_once 'tracking/code-universal.php';
|
59 |
+
echo "\n<!-- END GADWP Universal Tracking -->\n\n";
|
60 |
+
}
|
61 |
+
}
|
62 |
+
}
|
63 |
+
}
|
64 |
+
}
|
front/tracking/code-classic.php
CHANGED
@@ -1,34 +1,34 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
$profile = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $this->gadwp->config->options['ga_dash_tableid_jail'] );
|
15 |
-
?>
|
16 |
-
<script type="text/javascript">
|
17 |
-
var _gaq = _gaq || [];
|
18 |
-
<?php if ($this->gadwp->config->options ['ga_enhanced_links']) {?>
|
19 |
-
var pluginUrl = '//www.google-analytics.com/plugins/ga/inpage_linkid.js';
|
20 |
-
_gaq.push(['_require', 'inpage_linkid', pluginUrl]);
|
21 |
-
<?php }?>
|
22 |
-
_gaq.push(['_setAccount', '<?php echo esc_html($profile[2]); ?>']);
|
23 |
-
_gaq.push(['_trackPageview']<?php if ($this->gadwp->config->options ['ga_dash_anonim']) {?>, ['_gat._anonymizeIp']<?php }?>);
|
24 |
-
|
25 |
-
(function() {
|
26 |
-
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
27 |
-
<?php if ($this->gadwp->config->options ['ga_dash_remarketing']) { ?>
|
28 |
-
ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
|
29 |
-
<?php }else{?>
|
30 |
-
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
31 |
-
<?php }?>
|
32 |
-
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
33 |
-
})();
|
34 |
</script>
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
$profile = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $this->gadwp->config->options['ga_dash_tableid_jail'] );
|
15 |
+
?>
|
16 |
+
<script type="text/javascript">
|
17 |
+
var _gaq = _gaq || [];
|
18 |
+
<?php if ($this->gadwp->config->options ['ga_enhanced_links']) {?>
|
19 |
+
var pluginUrl = '//www.google-analytics.com/plugins/ga/inpage_linkid.js';
|
20 |
+
_gaq.push(['_require', 'inpage_linkid', pluginUrl]);
|
21 |
+
<?php }?>
|
22 |
+
_gaq.push(['_setAccount', '<?php echo esc_html($profile[2]); ?>']);
|
23 |
+
_gaq.push(['_trackPageview']<?php if ($this->gadwp->config->options ['ga_dash_anonim']) {?>, ['_gat._anonymizeIp']<?php }?>);
|
24 |
+
|
25 |
+
(function() {
|
26 |
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
27 |
+
<?php if ($this->gadwp->config->options ['ga_dash_remarketing']) { ?>
|
28 |
+
ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
|
29 |
+
<?php }else{?>
|
30 |
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
31 |
+
<?php }?>
|
32 |
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
33 |
+
})();
|
34 |
</script>
|
front/tracking/code-universal.php
CHANGED
@@ -1,138 +1,138 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
$profile = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $this->gadwp->config->options['ga_dash_tableid_jail'] );
|
15 |
-
?>
|
16 |
-
<script>
|
17 |
-
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
18 |
-
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
19 |
-
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
20 |
-
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
21 |
-
<?php
|
22 |
-
$create_options = '{';
|
23 |
-
if ( $this->gadwp->config->options['ga_speed_samplerate'] != 1 ) {
|
24 |
-
$create_options .= "'siteSpeedSampleRate' : " . (int) $this->gadwp->config->options['ga_speed_samplerate'];
|
25 |
-
}
|
26 |
-
if ( $this->gadwp->config->options['ga_crossdomain_tracking'] && $this->gadwp->config->options['ga_crossdomain_list'] != '' ) {
|
27 |
-
if ( $create_options != '{' ) {
|
28 |
-
$create_options .= ', ';
|
29 |
-
}
|
30 |
-
$create_options .= "'allowLinker' : true";
|
31 |
-
}
|
32 |
-
$create_options .= '}';
|
33 |
-
|
34 |
-
$options = "'auto'";
|
35 |
-
$optionsArray = array();
|
36 |
-
if ( ! empty( $this->gadwp->config->options['ga_cookiedomain'] ) ) {
|
37 |
-
$optionsArray['cookieDomain'] = $this->gadwp->config->options['ga_cookiedomain'];
|
38 |
-
}
|
39 |
-
if ( ! empty( $this->gadwp->config->options['ga_cookiename'] ) ) {
|
40 |
-
$optionsArray['cookieName'] = $this->gadwp->config->options['ga_cookiename'];
|
41 |
-
}
|
42 |
-
if ( ! empty( $this->gadwp->config->options['ga_cookieexpires'] ) ) {
|
43 |
-
$optionsArray['cookieExpires'] = (int) $this->gadwp->config->options['ga_cookieexpires'];
|
44 |
-
}
|
45 |
-
if ( ! empty( $optionsArray ) ) {
|
46 |
-
$options = json_encode( $optionsArray );
|
47 |
-
}
|
48 |
-
?>
|
49 |
-
ga('create', '<?php echo esc_html($profile[2]); ?>', <?php echo $options; ?><?php if ($create_options != '{}') {?>, <?php echo $create_options; }?>);
|
50 |
-
<?php if ($this->gadwp->config->options ['ga_crossdomain_tracking'] && $this->gadwp->config->options ['ga_crossdomain_list']!='') {?>
|
51 |
-
ga('require', 'linker');
|
52 |
-
<?php
|
53 |
-
$crossdomain_list = explode( ',', $this->gadwp->config->options['ga_crossdomain_list'] );
|
54 |
-
$crossdomain_list = array_map( 'trim', $crossdomain_list );
|
55 |
-
$crossdomain_list = strip_tags( implode( "','", $crossdomain_list ) );
|
56 |
-
?>
|
57 |
-
ga('linker:autoLink', ['<?php echo ($crossdomain_list)?>'] );
|
58 |
-
<?php
|
59 |
-
}
|
60 |
-
if ( $this->gadwp->config->options['ga_dash_remarketing'] ) {
|
61 |
-
?>
|
62 |
-
ga('require', 'displayfeatures');
|
63 |
-
<?php
|
64 |
-
}
|
65 |
-
if ( $this->gadwp->config->options['ga_enhanced_links'] ) {
|
66 |
-
?>
|
67 |
-
ga('require', 'linkid', 'linkid.js');
|
68 |
-
<?php
|
69 |
-
}
|
70 |
-
if ( $this->gadwp->config->options['ga_author_dimindex'] && ( is_single() || is_page() ) ) {
|
71 |
-
global $post;
|
72 |
-
$author_id = $post->post_author;
|
73 |
-
$author_name = get_the_author_meta( 'display_name', $author_id );
|
74 |
-
?>
|
75 |
-
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_author_dimindex']; ?>', '<?php echo esc_attr($author_name); ?>');
|
76 |
-
<?php
|
77 |
-
}
|
78 |
-
if ( $this->gadwp->config->options['ga_pubyear_dimindex'] && is_single() ) {
|
79 |
-
global $post;
|
80 |
-
$date = get_the_date( 'Y', $post->ID );
|
81 |
-
?>
|
82 |
-
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_pubyear_dimindex']; ?>', '<?php echo (int)$date; ?>');
|
83 |
-
<?php
|
84 |
-
}
|
85 |
-
if ( $this->gadwp->config->options['ga_pubyearmonth_dimindex'] && is_single() ) {
|
86 |
-
global $post;
|
87 |
-
$date = get_the_date( 'Y-m', $post->ID );
|
88 |
-
?>
|
89 |
-
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_pubyearmonth_dimindex']; ?>', '<?php echo $date; ?>');
|
90 |
-
<?php
|
91 |
-
}
|
92 |
-
if ( $this->gadwp->config->options['ga_category_dimindex'] && is_category() ) {
|
93 |
-
?>
|
94 |
-
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_category_dimindex']; ?>', '<?php echo esc_attr(single_tag_title()); ?>');
|
95 |
-
<?php
|
96 |
-
}
|
97 |
-
if ( $this->gadwp->config->options['ga_tag_dimindex'] && is_single() ) {
|
98 |
-
global $post;
|
99 |
-
$post_tags_list = '';
|
100 |
-
$post_tags_array = get_the_tags( $post->ID );
|
101 |
-
if ( $post_tags_array ) {
|
102 |
-
foreach ( $post_tags_array as $tag ) {
|
103 |
-
$post_tags_list .= $tag->name . ', ';
|
104 |
-
}
|
105 |
-
}
|
106 |
-
$post_tags_list = rtrim( $post_tags_list, ', ' );
|
107 |
-
if ( $post_tags_list ) {
|
108 |
-
?>
|
109 |
-
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_tag_dimindex']; ?>', '<?php echo esc_attr($post_tags_list); ?>');
|
110 |
-
<?php
|
111 |
-
}
|
112 |
-
}
|
113 |
-
if ( $this->gadwp->config->options['ga_category_dimindex'] && is_single() ) {
|
114 |
-
global $post;
|
115 |
-
$categories = get_the_category( $post->ID );
|
116 |
-
foreach ( $categories as $category ) {
|
117 |
-
?>
|
118 |
-
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_category_dimindex']; ?>', '<?php echo esc_attr($category->name); ?>');
|
119 |
-
<?php
|
120 |
-
break;
|
121 |
-
}
|
122 |
-
}
|
123 |
-
if ( $this->gadwp->config->options['ga_user_dimindex'] ) {
|
124 |
-
?>
|
125 |
-
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_user_dimindex']; ?>', '<?php echo is_user_logged_in()?'registered':'guest'; ?>');
|
126 |
-
<?php
|
127 |
-
}
|
128 |
-
do_action( 'ga_dash_addtrackingcode' );
|
129 |
-
if ( $this->gadwp->config->options['ga_dash_anonim'] ) {
|
130 |
-
?> ga('send', 'pageview', {'anonymizeIp': true});<?php } else {?> ga('send', 'pageview');
|
131 |
-
<?php
|
132 |
-
}
|
133 |
-
if ( $this->gadwp->config->options['ga_dash_adsense'] ) {
|
134 |
-
?>
|
135 |
-
|
136 |
-
window.google_analytics_uacct = "<?php echo esc_html($profile[2]); ?>";
|
137 |
-
<?php }?>
|
138 |
-
</script>
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
$profile = GADWP_Tools::get_selected_profile( $this->gadwp->config->options['ga_dash_profile_list'], $this->gadwp->config->options['ga_dash_tableid_jail'] );
|
15 |
+
?>
|
16 |
+
<script>
|
17 |
+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
18 |
+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
19 |
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
20 |
+
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
21 |
+
<?php
|
22 |
+
$create_options = '{';
|
23 |
+
if ( $this->gadwp->config->options['ga_speed_samplerate'] != 1 ) {
|
24 |
+
$create_options .= "'siteSpeedSampleRate' : " . (int) $this->gadwp->config->options['ga_speed_samplerate'];
|
25 |
+
}
|
26 |
+
if ( $this->gadwp->config->options['ga_crossdomain_tracking'] && $this->gadwp->config->options['ga_crossdomain_list'] != '' ) {
|
27 |
+
if ( $create_options != '{' ) {
|
28 |
+
$create_options .= ', ';
|
29 |
+
}
|
30 |
+
$create_options .= "'allowLinker' : true";
|
31 |
+
}
|
32 |
+
$create_options .= '}';
|
33 |
+
|
34 |
+
$options = "'auto'";
|
35 |
+
$optionsArray = array();
|
36 |
+
if ( ! empty( $this->gadwp->config->options['ga_cookiedomain'] ) ) {
|
37 |
+
$optionsArray['cookieDomain'] = $this->gadwp->config->options['ga_cookiedomain'];
|
38 |
+
}
|
39 |
+
if ( ! empty( $this->gadwp->config->options['ga_cookiename'] ) ) {
|
40 |
+
$optionsArray['cookieName'] = $this->gadwp->config->options['ga_cookiename'];
|
41 |
+
}
|
42 |
+
if ( ! empty( $this->gadwp->config->options['ga_cookieexpires'] ) ) {
|
43 |
+
$optionsArray['cookieExpires'] = (int) $this->gadwp->config->options['ga_cookieexpires'];
|
44 |
+
}
|
45 |
+
if ( ! empty( $optionsArray ) ) {
|
46 |
+
$options = json_encode( $optionsArray );
|
47 |
+
}
|
48 |
+
?>
|
49 |
+
ga('create', '<?php echo esc_html($profile[2]); ?>', <?php echo $options; ?><?php if ($create_options != '{}') {?>, <?php echo $create_options; }?>);
|
50 |
+
<?php if ($this->gadwp->config->options ['ga_crossdomain_tracking'] && $this->gadwp->config->options ['ga_crossdomain_list']!='') {?>
|
51 |
+
ga('require', 'linker');
|
52 |
+
<?php
|
53 |
+
$crossdomain_list = explode( ',', $this->gadwp->config->options['ga_crossdomain_list'] );
|
54 |
+
$crossdomain_list = array_map( 'trim', $crossdomain_list );
|
55 |
+
$crossdomain_list = strip_tags( implode( "','", $crossdomain_list ) );
|
56 |
+
?>
|
57 |
+
ga('linker:autoLink', ['<?php echo ($crossdomain_list)?>'] );
|
58 |
+
<?php
|
59 |
+
}
|
60 |
+
if ( $this->gadwp->config->options['ga_dash_remarketing'] ) {
|
61 |
+
?>
|
62 |
+
ga('require', 'displayfeatures');
|
63 |
+
<?php
|
64 |
+
}
|
65 |
+
if ( $this->gadwp->config->options['ga_enhanced_links'] ) {
|
66 |
+
?>
|
67 |
+
ga('require', 'linkid', 'linkid.js');
|
68 |
+
<?php
|
69 |
+
}
|
70 |
+
if ( $this->gadwp->config->options['ga_author_dimindex'] && ( is_single() || is_page() ) ) {
|
71 |
+
global $post;
|
72 |
+
$author_id = $post->post_author;
|
73 |
+
$author_name = get_the_author_meta( 'display_name', $author_id );
|
74 |
+
?>
|
75 |
+
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_author_dimindex']; ?>', '<?php echo esc_attr($author_name); ?>');
|
76 |
+
<?php
|
77 |
+
}
|
78 |
+
if ( $this->gadwp->config->options['ga_pubyear_dimindex'] && is_single() ) {
|
79 |
+
global $post;
|
80 |
+
$date = get_the_date( 'Y', $post->ID );
|
81 |
+
?>
|
82 |
+
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_pubyear_dimindex']; ?>', '<?php echo (int)$date; ?>');
|
83 |
+
<?php
|
84 |
+
}
|
85 |
+
if ( $this->gadwp->config->options['ga_pubyearmonth_dimindex'] && is_single() ) {
|
86 |
+
global $post;
|
87 |
+
$date = get_the_date( 'Y-m', $post->ID );
|
88 |
+
?>
|
89 |
+
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_pubyearmonth_dimindex']; ?>', '<?php echo $date; ?>');
|
90 |
+
<?php
|
91 |
+
}
|
92 |
+
if ( $this->gadwp->config->options['ga_category_dimindex'] && is_category() ) {
|
93 |
+
?>
|
94 |
+
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_category_dimindex']; ?>', '<?php echo esc_attr(single_tag_title()); ?>');
|
95 |
+
<?php
|
96 |
+
}
|
97 |
+
if ( $this->gadwp->config->options['ga_tag_dimindex'] && is_single() ) {
|
98 |
+
global $post;
|
99 |
+
$post_tags_list = '';
|
100 |
+
$post_tags_array = get_the_tags( $post->ID );
|
101 |
+
if ( $post_tags_array ) {
|
102 |
+
foreach ( $post_tags_array as $tag ) {
|
103 |
+
$post_tags_list .= $tag->name . ', ';
|
104 |
+
}
|
105 |
+
}
|
106 |
+
$post_tags_list = rtrim( $post_tags_list, ', ' );
|
107 |
+
if ( $post_tags_list ) {
|
108 |
+
?>
|
109 |
+
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_tag_dimindex']; ?>', '<?php echo esc_attr($post_tags_list); ?>');
|
110 |
+
<?php
|
111 |
+
}
|
112 |
+
}
|
113 |
+
if ( $this->gadwp->config->options['ga_category_dimindex'] && is_single() ) {
|
114 |
+
global $post;
|
115 |
+
$categories = get_the_category( $post->ID );
|
116 |
+
foreach ( $categories as $category ) {
|
117 |
+
?>
|
118 |
+
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_category_dimindex']; ?>', '<?php echo esc_attr($category->name); ?>');
|
119 |
+
<?php
|
120 |
+
break;
|
121 |
+
}
|
122 |
+
}
|
123 |
+
if ( $this->gadwp->config->options['ga_user_dimindex'] ) {
|
124 |
+
?>
|
125 |
+
ga('set', 'dimension<?php echo (int)$this->gadwp->config->options ['ga_user_dimindex']; ?>', '<?php echo is_user_logged_in()?'registered':'guest'; ?>');
|
126 |
+
<?php
|
127 |
+
}
|
128 |
+
do_action( 'ga_dash_addtrackingcode' );
|
129 |
+
if ( $this->gadwp->config->options['ga_dash_anonim'] ) {
|
130 |
+
?> ga('send', 'pageview', {'anonymizeIp': true});<?php } else {?> ga('send', 'pageview');
|
131 |
+
<?php
|
132 |
+
}
|
133 |
+
if ( $this->gadwp->config->options['ga_dash_adsense'] ) {
|
134 |
+
?>
|
135 |
+
|
136 |
+
window.google_analytics_uacct = "<?php echo esc_html($profile[2]); ?>";
|
137 |
+
<?php }?>
|
138 |
+
</script>
|
front/tracking/events-classic.php
CHANGED
@@ -1,55 +1,55 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
?>
|
14 |
-
<script type="text/javascript">
|
15 |
-
(function($){
|
16 |
-
$(window).load(function() {
|
17 |
-
if (this._gat) {
|
18 |
-
tks = this._gat._getTrackers();
|
19 |
-
ga_track = function(p) {
|
20 |
-
for (i=0; i < tks.length; i++) {
|
21 |
-
var n = tks[i]._getName() !== "" ? tks[i]._getName()+"." : "";
|
22 |
-
a = [];
|
23 |
-
for (i2=0; i2 < p.length; i2++) {
|
24 |
-
var b = i2===0 ? n+p[i2] : p[i2];
|
25 |
-
a.push(b);
|
26 |
-
}
|
27 |
-
_gaq.push(a);
|
28 |
-
}
|
29 |
-
};
|
30 |
-
$('a').filter(function() {
|
31 |
-
return this.href.match(/.*\.(<?php echo esc_js($this->gadwp->config->options['ga_event_downloads']);?>)(\?.*)?$/);
|
32 |
-
}).click(function(e) {
|
33 |
-
ga_track(['_trackEvent', 'download', 'click', this.href]);
|
34 |
-
});
|
35 |
-
$('a[href^="mailto"]').click(function(e) {
|
36 |
-
ga_track(['_trackSocial', 'email', 'send', this.href]);
|
37 |
-
});
|
38 |
-
var loc = location.host.split('.');
|
39 |
-
while (loc.length > 2) { loc.shift(); }
|
40 |
-
loc = loc.join('.');
|
41 |
-
var localURLs = [
|
42 |
-
loc,
|
43 |
-
'<?php echo esc_html(get_option('siteurl'));?>'
|
44 |
-
];
|
45 |
-
$('a[href^="http"]').filter(function() {
|
46 |
-
for (var i = 0; i < localURLs.length; i++) {
|
47 |
-
if (this.href.indexOf(localURLs[i]) == -1) return this.href;
|
48 |
-
}
|
49 |
-
}).click(function(e) {
|
50 |
-
ga_track(['_trackEvent', 'outbound', 'click', this.href]);
|
51 |
-
});
|
52 |
-
}
|
53 |
-
});
|
54 |
-
})(jQuery);
|
55 |
-
</script>
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
?>
|
14 |
+
<script type="text/javascript">
|
15 |
+
(function($){
|
16 |
+
$(window).load(function() {
|
17 |
+
if (this._gat) {
|
18 |
+
tks = this._gat._getTrackers();
|
19 |
+
ga_track = function(p) {
|
20 |
+
for (i=0; i < tks.length; i++) {
|
21 |
+
var n = tks[i]._getName() !== "" ? tks[i]._getName()+"." : "";
|
22 |
+
a = [];
|
23 |
+
for (i2=0; i2 < p.length; i2++) {
|
24 |
+
var b = i2===0 ? n+p[i2] : p[i2];
|
25 |
+
a.push(b);
|
26 |
+
}
|
27 |
+
_gaq.push(a);
|
28 |
+
}
|
29 |
+
};
|
30 |
+
$('a').filter(function() {
|
31 |
+
return this.href.match(/.*\.(<?php echo esc_js($this->gadwp->config->options['ga_event_downloads']);?>)(\?.*)?$/);
|
32 |
+
}).click(function(e) {
|
33 |
+
ga_track(['_trackEvent', 'download', 'click', this.href]);
|
34 |
+
});
|
35 |
+
$('a[href^="mailto"]').click(function(e) {
|
36 |
+
ga_track(['_trackSocial', 'email', 'send', this.href]);
|
37 |
+
});
|
38 |
+
var loc = location.host.split('.');
|
39 |
+
while (loc.length > 2) { loc.shift(); }
|
40 |
+
loc = loc.join('.');
|
41 |
+
var localURLs = [
|
42 |
+
loc,
|
43 |
+
'<?php echo esc_html(get_option('siteurl'));?>'
|
44 |
+
];
|
45 |
+
$('a[href^="http"]').filter(function() {
|
46 |
+
for (var i = 0; i < localURLs.length; i++) {
|
47 |
+
if (this.href.indexOf(localURLs[i]) == -1) return this.href;
|
48 |
+
}
|
49 |
+
}).click(function(e) {
|
50 |
+
ga_track(['_trackEvent', 'outbound', 'click', this.href]);
|
51 |
+
});
|
52 |
+
}
|
53 |
+
});
|
54 |
+
})(jQuery);
|
55 |
+
</script>
|
front/tracking/events-universal.php
CHANGED
@@ -1,67 +1,67 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
$domaindata = GADWP_Tools::get_root_domain( esc_html( get_option( 'siteurl' ) ) );
|
15 |
-
?>
|
16 |
-
<script type="text/javascript">
|
17 |
-
(function($){
|
18 |
-
$(window).load(function() {
|
19 |
-
<?php if ($this->gadwp->config->options['ga_event_tracking']){ ?>
|
20 |
-
|
21 |
-
//Track Downloads
|
22 |
-
$('a').filter(function() {
|
23 |
-
return this.href.match(/.*\.(<?php echo esc_js($this->gadwp->config->options['ga_event_downloads']);?>)(\?.*)?$/);
|
24 |
-
}).click(function(e) {
|
25 |
-
ga('send','event', 'download', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
26 |
-
});
|
27 |
-
|
28 |
-
//Track Mailto
|
29 |
-
$('a[href^="mailto"]').click(function(e) {
|
30 |
-
ga('send','event', 'email', 'send', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
31 |
-
});
|
32 |
-
<?php if (isset ( $domaindata ['domain'] ) && $domaindata ['domain']) { ?>
|
33 |
-
|
34 |
-
//Track Outbound Links
|
35 |
-
$('a[href^="http"]').filter(function() {
|
36 |
-
if (!this.href.match(/.*\.(<?php echo esc_js($this->gadwp->config->options['ga_event_downloads']);?>)(\?.*)?$/)){
|
37 |
-
if (this.href.indexOf('<?php echo $domaindata['domain']; ?>') == -1) return this.href;
|
38 |
-
}
|
39 |
-
}).click(function(e) {
|
40 |
-
ga('send','event', 'outbound', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
41 |
-
});
|
42 |
-
<?php } ?>
|
43 |
-
<?php } ?>
|
44 |
-
<?php if ($this->gadwp->config->options['ga_event_affiliates'] && $this->gadwp->config->options['ga_aff_tracking']){ ?>
|
45 |
-
|
46 |
-
//Track Affiliates
|
47 |
-
$('a').filter(function() {
|
48 |
-
if ('<?php echo esc_js($this->gadwp->config->options['ga_event_affiliates']);?>'!=''){
|
49 |
-
return this.href.match(/(<?php echo str_replace('/','\/',(esc_js($this->gadwp->config->options['ga_event_affiliates'])));?>)/);
|
50 |
-
}
|
51 |
-
}).click(function(event) {
|
52 |
-
ga('send','event', 'affiliates', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
53 |
-
});
|
54 |
-
<?php } ?>
|
55 |
-
<?php if (isset ( $domaindata ['domain'] ) && $domaindata ['domain'] && $this->gadwp->config->options ['ga_hash_tracking']) { ?>
|
56 |
-
|
57 |
-
//Track Hashmarks
|
58 |
-
$('a').filter(function() {
|
59 |
-
if (this.href.indexOf('<?php echo $domaindata['domain']; ?>') != -1 || this.href.indexOf('://') == -1) return this.hash;
|
60 |
-
}).click(function(e) {
|
61 |
-
ga('send','event', 'hashmark', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
62 |
-
});
|
63 |
-
|
64 |
-
<?php } ?>
|
65 |
-
});
|
66 |
-
})(jQuery);
|
67 |
-
</script>
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
$domaindata = GADWP_Tools::get_root_domain( esc_html( get_option( 'siteurl' ) ) );
|
15 |
+
?>
|
16 |
+
<script type="text/javascript">
|
17 |
+
(function($){
|
18 |
+
$(window).load(function() {
|
19 |
+
<?php if ($this->gadwp->config->options['ga_event_tracking']){ ?>
|
20 |
+
|
21 |
+
//Track Downloads
|
22 |
+
$('a').filter(function() {
|
23 |
+
return this.href.match(/.*\.(<?php echo esc_js($this->gadwp->config->options['ga_event_downloads']);?>)(\?.*)?$/);
|
24 |
+
}).click(function(e) {
|
25 |
+
ga('send','event', 'download', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
26 |
+
});
|
27 |
+
|
28 |
+
//Track Mailto
|
29 |
+
$('a[href^="mailto"]').click(function(e) {
|
30 |
+
ga('send','event', 'email', 'send', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
31 |
+
});
|
32 |
+
<?php if (isset ( $domaindata ['domain'] ) && $domaindata ['domain']) { ?>
|
33 |
+
|
34 |
+
//Track Outbound Links
|
35 |
+
$('a[href^="http"]').filter(function() {
|
36 |
+
if (!this.href.match(/.*\.(<?php echo esc_js($this->gadwp->config->options['ga_event_downloads']);?>)(\?.*)?$/)){
|
37 |
+
if (this.href.indexOf('<?php echo $domaindata['domain']; ?>') == -1) return this.href;
|
38 |
+
}
|
39 |
+
}).click(function(e) {
|
40 |
+
ga('send','event', 'outbound', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
41 |
+
});
|
42 |
+
<?php } ?>
|
43 |
+
<?php } ?>
|
44 |
+
<?php if ($this->gadwp->config->options['ga_event_affiliates'] && $this->gadwp->config->options['ga_aff_tracking']){ ?>
|
45 |
+
|
46 |
+
//Track Affiliates
|
47 |
+
$('a').filter(function() {
|
48 |
+
if ('<?php echo esc_js($this->gadwp->config->options['ga_event_affiliates']);?>'!=''){
|
49 |
+
return this.href.match(/(<?php echo str_replace('/','\/',(esc_js($this->gadwp->config->options['ga_event_affiliates'])));?>)/);
|
50 |
+
}
|
51 |
+
}).click(function(event) {
|
52 |
+
ga('send','event', 'affiliates', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
53 |
+
});
|
54 |
+
<?php } ?>
|
55 |
+
<?php if (isset ( $domaindata ['domain'] ) && $domaindata ['domain'] && $this->gadwp->config->options ['ga_hash_tracking']) { ?>
|
56 |
+
|
57 |
+
//Track Hashmarks
|
58 |
+
$('a').filter(function() {
|
59 |
+
if (this.href.indexOf('<?php echo $domaindata['domain']; ?>') != -1 || this.href.indexOf('://') == -1) return this.hash;
|
60 |
+
}).click(function(e) {
|
61 |
+
ga('send','event', 'hashmark', 'click', this.href<?php if(isset($this->gadwp->config->options['ga_event_bouncerate']) && $this->gadwp->config->options['ga_event_bouncerate']){echo ", {'nonInteraction': 1}";}?>);
|
62 |
+
});
|
63 |
+
|
64 |
+
<?php } ?>
|
65 |
+
});
|
66 |
+
})(jQuery);
|
67 |
+
</script>
|
front/widgets.php
CHANGED
@@ -1,194 +1,194 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
final class GADWP_Frontend_Widget extends WP_Widget {
|
15 |
-
|
16 |
-
private $gadwp;
|
17 |
-
|
18 |
-
public function __construct() {
|
19 |
-
$this->gadwp = GADWP();
|
20 |
-
|
21 |
-
parent::__construct( 'gadwp-frontwidget-report', __( 'Google Analytics Dashboard', 'google-analytics-dashboard-for-wp' ), array( 'description' => __( "Will display your google analytics stats in a widget", 'google-analytics-dashboard-for-wp' ) ) );
|
22 |
-
// Frontend Styles
|
23 |
-
if ( is_active_widget( false, false, $this->id_base, true ) ) {
|
24 |
-
add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_scripts' ) );
|
25 |
-
}
|
26 |
-
}
|
27 |
-
|
28 |
-
public function load_styles_scripts() {
|
29 |
-
$lang = get_bloginfo( 'language' );
|
30 |
-
$lang = explode( '-', $lang );
|
31 |
-
$lang = $lang[0];
|
32 |
-
|
33 |
-
wp_enqueue_style( 'gadwp-front-widget', GADWP_URL . 'front/css/widgets.css', null, GADWP_CURRENT_VERSION );
|
34 |
-
wp_enqueue_script( 'gadwp-front-widget', GADWP_URL . 'front/js/widgets.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
35 |
-
wp_enqueue_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
36 |
-
}
|
37 |
-
|
38 |
-
public function widget( $args, $instance ) {
|
39 |
-
$widget_title = apply_filters( 'widget_title', $instance['title'] );
|
40 |
-
$title = __( "Sessions", 'google-analytics-dashboard-for-wp' );
|
41 |
-
echo "\n<!-- BEGIN GADWP v" . GADWP_CURRENT_VERSION . " Widget - https://deconf.com/google-analytics-dashboard-wordpress/ -->\n";
|
42 |
-
echo $args['before_widget'];
|
43 |
-
if ( ! empty( $widget_title ) ) {
|
44 |
-
echo $args['before_title'] . $widget_title . $args['after_title'];
|
45 |
-
}
|
46 |
-
|
47 |
-
if ( isset( $this->gadwp->config->options['ga_dash_style'] ) ) {
|
48 |
-
$css = "colors:['" . $this->gadwp->config->options['ga_dash_style'] . "','" . GADWP_Tools::colourVariator( $this->gadwp->config->options['ga_dash_style'], - 20 ) . "'],";
|
49 |
-
$color = $this->gadwp->config->options['ga_dash_style'];
|
50 |
-
} else {
|
51 |
-
$css = "";
|
52 |
-
$color = "#3366CC";
|
53 |
-
}
|
54 |
-
ob_start();
|
55 |
-
if ( $instance['anonim'] ) {
|
56 |
-
$formater = "var formatter = new google.visualization.NumberFormat({
|
57 |
-
suffix: '%',
|
58 |
-
fractionDigits: 2
|
59 |
-
});
|
60 |
-
|
61 |
-
formatter.format(data, 1);";
|
62 |
-
} else {
|
63 |
-
$formater = '';
|
64 |
-
}
|
65 |
-
$periodtext = "";
|
66 |
-
switch ( $instance['period'] ) {
|
67 |
-
case '7daysAgo' :
|
68 |
-
$periodtext = sprintf( __( 'Last %d Days', 'google-analytics-dashboard-for-wp' ), 7 );
|
69 |
-
break;
|
70 |
-
case '14daysAgo' :
|
71 |
-
$periodtext = sprintf( __( 'Last %d Days', 'google-analytics-dashboard-for-wp' ), 14 );
|
72 |
-
break;
|
73 |
-
case '30daysAgo' :
|
74 |
-
$periodtext = sprintf( __( 'Last %d Days', 'google-analytics-dashboard-for-wp' ), 30 );
|
75 |
-
break;
|
76 |
-
default :
|
77 |
-
$periodtext = "";
|
78 |
-
break;
|
79 |
-
}
|
80 |
-
switch ( $instance['display'] ) {
|
81 |
-
case '1' :
|
82 |
-
echo '<div id="gadwp-widget"><div id="gadwp-widgetchart"></div><div id="gadwp-widgettotals"></div></div>';
|
83 |
-
break;
|
84 |
-
case '2' :
|
85 |
-
echo '<div id="gadwp-widget"><div id="gadwp-widgetchart"></div></div>';
|
86 |
-
break;
|
87 |
-
case '3' :
|
88 |
-
echo '<div id="gadwp-widget"><div id="gadwp-widgettotals"></div></div>';
|
89 |
-
break;
|
90 |
-
}
|
91 |
-
?>
|
92 |
-
<script type="text/javascript">
|
93 |
-
google.charts.load('current', {
|
94 |
-
google.charts.setOnLoadCallback( GADWPWidgetLoad );
|
95 |
-
function GADWPWidgetLoad (){
|
96 |
-
jQuery.post("<?php echo admin_url( 'admin-ajax.php' ); ?>", {action: "ajax_frontwidget_report", gadwp_number: "<?php echo $this->number; ?>", gadwp_optionname: "<?php echo $this->option_name; ?>" }, function(response){
|
97 |
-
if (!jQuery.isNumeric(response) && jQuery.isArray(response)){
|
98 |
-
if (jQuery("#gadwp-widgetchart")[0]){
|
99 |
-
gadwpFrontWidgetData = response[0];
|
100 |
-
gadwp_drawFrontWidgetChart(gadwpFrontWidgetData);
|
101 |
-
}
|
102 |
-
if (jQuery("#gadwp-widgettotals")[0]){
|
103 |
-
gadwp_drawFrontWidgetTotals(response[1]);
|
104 |
-
}
|
105 |
-
}else{
|
106 |
-
jQuery("#gadwp-widgetchart").css({"background-color":"#F7F7F7","height":"auto","padding-top":"50px","padding-bottom":"50px","color":"#000","text-align":"center"});
|
107 |
-
jQuery("#gadwp-widgetchart").html("<?php __( "This report is unavailable", 'google-analytics-dashboard-for-wp' ); ?> ("+response+")");
|
108 |
-
}
|
109 |
-
});
|
110 |
-
}
|
111 |
-
function gadwp_drawFrontWidgetChart(response) {
|
112 |
-
var data = google.visualization.arrayToDataTable(response);
|
113 |
-
var options = {
|
114 |
-
legend: { position: "none" },
|
115 |
-
pointSize: "3, <?php echo $css; ?>",
|
116 |
-
title: "<?php echo $title; ?>",
|
117 |
-
titlePosition: "in",
|
118 |
-
chartArea: { width: "95%", height: "75%" },
|
119 |
-
hAxis: { textPosition: "none"},
|
120 |
-
vAxis: { textPosition: "none", minValue: 0, gridlines: { color: "transparent" }, baselineColor: "transparent"}
|
121 |
-
}
|
122 |
-
var chart = new google.visualization.AreaChart(document.getElementById("gadwp-widgetchart"));
|
123 |
-
<?php echo $formater; ?>
|
124 |
-
chart.draw(data, options);
|
125 |
-
}
|
126 |
-
function gadwp_drawFrontWidgetTotals(response) {
|
127 |
-
if (response == null){
|
128 |
-
response = 0;
|
129 |
-
}
|
130 |
-
jQuery("#gadwp-widgettotals").html('<div class="gadwp-left"><?php _e( "Period:", 'google-analytics-dashboard-for-wp' ); ?></div> <div class="gadwp-right"><?php echo $periodtext; ?> </div><div class="gadwp-left"><?php _e( "Sessions:", 'google-analytics-dashboard-for-wp' ); ?></div> <div class="gadwp-right">'+response+'</div>');
|
131 |
-
}
|
132 |
-
</script>
|
133 |
-
<?php
|
134 |
-
if ( $instance['give_credits'] == 1 ) :
|
135 |
-
?>
|
136 |
-
<div style="text-align: right; width: 100%; font-size: 0.8em; clear: both; margin-right: 5px;"><?php _e( 'generated by', 'google-analytics-dashboard-for-wp' ); ?> <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_report&utm_medium=link&utm_content=front_widget&utm_campaign=gadwp" rel="nofollow" style="text-decoration: none; font-size: 1em;">GADWP</a>
|
137 |
-
</div>
|
138 |
-
|
139 |
-
<?php
|
140 |
-
endif;
|
141 |
-
$widget_content = ob_get_contents();
|
142 |
-
if ( ob_get_length() ) {
|
143 |
-
ob_end_clean();
|
144 |
-
}
|
145 |
-
echo $widget_content;
|
146 |
-
echo $args['after_widget'];
|
147 |
-
echo "\n<!-- END GADWP Widget -->\n";
|
148 |
-
}
|
149 |
-
|
150 |
-
public function form( $instance ) {
|
151 |
-
$widget_title = ( isset( $instance['title'] ) ? $instance['title'] : __( "Google Analytics Stats", 'google-analytics-dashboard-for-wp' ) );
|
152 |
-
$period = ( isset( $instance['period'] ) ? $instance['period'] : '7daysAgo' );
|
153 |
-
$display = ( isset( $instance['display'] ) ? $instance['display'] : 1 );
|
154 |
-
$give_credits = ( isset( $instance['give_credits'] ) ? $instance['give_credits'] : 1 );
|
155 |
-
$anonim = ( isset( $instance['anonim'] ) ? $instance['anonim'] : 0 );
|
156 |
-
/* @formatter:off */
|
157 |
-
?>
|
158 |
-
<p>
|
159 |
-
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( "Title:",'google-analytics-dashboard-for-wp' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $widget_title ); ?>">
|
160 |
-
</p>
|
161 |
-
<p>
|
162 |
-
<label for="<?php echo $this->get_field_id( 'display' ); ?>"><?php _e( "Display:",'google-analytics-dashboard-for-wp' ); ?></label> <select id="<?php echo $this->get_field_id('display'); ?>" class="widefat" name="<?php echo $this->get_field_name( 'display' ); ?>">
|
163 |
-
<option value="1" <?php selected( $display, 1 ); ?>><?php _e('Chart & Totals', 'google-analytics-dashboard-for-wp');?></option>
|
164 |
-
<option value="2" <?php selected( $display, 2 ); ?>><?php _e('Chart', 'google-analytics-dashboard-for-wp');?></option>
|
165 |
-
<option value="3" <?php selected( $display, 3 ); ?>><?php _e('Totals', 'google-analytics-dashboard-for-wp');?></option>
|
166 |
-
</select>
|
167 |
-
</p>
|
168 |
-
<p>
|
169 |
-
<label for="<?php echo $this->get_field_id( 'anonim' ); ?>"><?php _e( "Anonymize stats:",'google-analytics-dashboard-for-wp' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'anonim' ); ?>" name="<?php echo $this->get_field_name( 'anonim' ); ?>" type="checkbox" <?php checked( $anonim, 1 ); ?> value="1">
|
170 |
-
</p>
|
171 |
-
<p>
|
172 |
-
<label for="<?php echo $this->get_field_id( 'period' ); ?>"><?php _e( "Stats for:",'google-analytics-dashboard-for-wp' ); ?></label> <select id="<?php echo $this->get_field_id('period'); ?>" class="widefat" name="<?php echo $this->get_field_name( 'period' ); ?>">
|
173 |
-
<option value="7daysAgo" <?php selected( $period, '7daysAgo' ); ?>><?php printf( __('Last %d Days', 'google-analytics-dashboard-for-wp'), 7 );?></option>
|
174 |
-
<option value="14daysAgo" <?php selected( $period, '14daysAgo' ); ?>><?php printf( __('Last %d Days', 'google-analytics-dashboard-for-wp'), 14 );?></option>
|
175 |
-
<option value="30daysAgo" <?php selected( $period, '30daysAgo' ); ?>><?php printf( __('Last %d Days', 'google-analytics-dashboard-for-wp'), 30 );?></option>
|
176 |
-
</select>
|
177 |
-
</p>
|
178 |
-
<p>
|
179 |
-
<label for="<?php echo $this->get_field_id( 'give_credits' ); ?>"><?php _e( "Give credits:",'google-analytics-dashboard-for-wp' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'give_credits' ); ?>" name="<?php echo $this->get_field_name( 'give_credits' ); ?>" type="checkbox" <?php checked( $give_credits, 1 ); ?> value="1">
|
180 |
-
</p>
|
181 |
-
<?php
|
182 |
-
/* @formatter:on */
|
183 |
-
}
|
184 |
-
|
185 |
-
public function update( $new_instance, $old_instance ) {
|
186 |
-
$instance = array();
|
187 |
-
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : 'Analytics Stats';
|
188 |
-
$instance['period'] = ( ! empty( $new_instance['period'] ) ) ? strip_tags( $new_instance['period'] ) : '7daysAgo';
|
189 |
-
$instance['display'] = ( ! empty( $new_instance['display'] ) ) ? strip_tags( $new_instance['display'] ) : 1;
|
190 |
-
$instance['give_credits'] = ( ! empty( $new_instance['give_credits'] ) ) ? strip_tags( $new_instance['give_credits'] ) : 0;
|
191 |
-
$instance['anonim'] = ( ! empty( $new_instance['anonim'] ) ) ? strip_tags( $new_instance['anonim'] ) : 0;
|
192 |
-
return $instance;
|
193 |
-
}
|
194 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
final class GADWP_Frontend_Widget extends WP_Widget {
|
15 |
+
|
16 |
+
private $gadwp;
|
17 |
+
|
18 |
+
public function __construct() {
|
19 |
+
$this->gadwp = GADWP();
|
20 |
+
|
21 |
+
parent::__construct( 'gadwp-frontwidget-report', __( 'Google Analytics Dashboard', 'google-analytics-dashboard-for-wp' ), array( 'description' => __( "Will display your google analytics stats in a widget", 'google-analytics-dashboard-for-wp' ) ) );
|
22 |
+
// Frontend Styles
|
23 |
+
if ( is_active_widget( false, false, $this->id_base, true ) ) {
|
24 |
+
add_action( 'wp_enqueue_scripts', array( $this, 'load_styles_scripts' ) );
|
25 |
+
}
|
26 |
+
}
|
27 |
+
|
28 |
+
public function load_styles_scripts() {
|
29 |
+
$lang = get_bloginfo( 'language' );
|
30 |
+
$lang = explode( '-', $lang );
|
31 |
+
$lang = $lang[0];
|
32 |
+
|
33 |
+
wp_enqueue_style( 'gadwp-front-widget', GADWP_URL . 'front/css/widgets.css', null, GADWP_CURRENT_VERSION );
|
34 |
+
wp_enqueue_script( 'gadwp-front-widget', GADWP_URL . 'front/js/widgets.js', array( 'jquery' ), GADWP_CURRENT_VERSION );
|
35 |
+
wp_enqueue_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', array(), null );
|
36 |
+
}
|
37 |
+
|
38 |
+
public function widget( $args, $instance ) {
|
39 |
+
$widget_title = apply_filters( 'widget_title', $instance['title'] );
|
40 |
+
$title = __( "Sessions", 'google-analytics-dashboard-for-wp' );
|
41 |
+
echo "\n<!-- BEGIN GADWP v" . GADWP_CURRENT_VERSION . " Widget - https://deconf.com/google-analytics-dashboard-wordpress/ -->\n";
|
42 |
+
echo $args['before_widget'];
|
43 |
+
if ( ! empty( $widget_title ) ) {
|
44 |
+
echo $args['before_title'] . $widget_title . $args['after_title'];
|
45 |
+
}
|
46 |
+
|
47 |
+
if ( isset( $this->gadwp->config->options['ga_dash_style'] ) ) {
|
48 |
+
$css = "colors:['" . $this->gadwp->config->options['ga_dash_style'] . "','" . GADWP_Tools::colourVariator( $this->gadwp->config->options['ga_dash_style'], - 20 ) . "'],";
|
49 |
+
$color = $this->gadwp->config->options['ga_dash_style'];
|
50 |
+
} else {
|
51 |
+
$css = "";
|
52 |
+
$color = "#3366CC";
|
53 |
+
}
|
54 |
+
ob_start();
|
55 |
+
if ( $instance['anonim'] ) {
|
56 |
+
$formater = "var formatter = new google.visualization.NumberFormat({
|
57 |
+
suffix: '%',
|
58 |
+
fractionDigits: 2
|
59 |
+
});
|
60 |
+
|
61 |
+
formatter.format(data, 1);";
|
62 |
+
} else {
|
63 |
+
$formater = '';
|
64 |
+
}
|
65 |
+
$periodtext = "";
|
66 |
+
switch ( $instance['period'] ) {
|
67 |
+
case '7daysAgo' :
|
68 |
+
$periodtext = sprintf( __( 'Last %d Days', 'google-analytics-dashboard-for-wp' ), 7 );
|
69 |
+
break;
|
70 |
+
case '14daysAgo' :
|
71 |
+
$periodtext = sprintf( __( 'Last %d Days', 'google-analytics-dashboard-for-wp' ), 14 );
|
72 |
+
break;
|
73 |
+
case '30daysAgo' :
|
74 |
+
$periodtext = sprintf( __( 'Last %d Days', 'google-analytics-dashboard-for-wp' ), 30 );
|
75 |
+
break;
|
76 |
+
default :
|
77 |
+
$periodtext = "";
|
78 |
+
break;
|
79 |
+
}
|
80 |
+
switch ( $instance['display'] ) {
|
81 |
+
case '1' :
|
82 |
+
echo '<div id="gadwp-widget"><div id="gadwp-widgetchart"></div><div id="gadwp-widgettotals"></div></div>';
|
83 |
+
break;
|
84 |
+
case '2' :
|
85 |
+
echo '<div id="gadwp-widget"><div id="gadwp-widgetchart"></div></div>';
|
86 |
+
break;
|
87 |
+
case '3' :
|
88 |
+
echo '<div id="gadwp-widget"><div id="gadwp-widgettotals"></div></div>';
|
89 |
+
break;
|
90 |
+
}
|
91 |
+
?>
|
92 |
+
<script type="text/javascript">
|
93 |
+
google.charts.load('current', {'packages':['corechart']});
|
94 |
+
google.charts.setOnLoadCallback( GADWPWidgetLoad );
|
95 |
+
function GADWPWidgetLoad (){
|
96 |
+
jQuery.post("<?php echo admin_url( 'admin-ajax.php' ); ?>", {action: "ajax_frontwidget_report", gadwp_number: "<?php echo $this->number; ?>", gadwp_optionname: "<?php echo $this->option_name; ?>" }, function(response){
|
97 |
+
if (!jQuery.isNumeric(response) && jQuery.isArray(response)){
|
98 |
+
if (jQuery("#gadwp-widgetchart")[0]){
|
99 |
+
gadwpFrontWidgetData = response[0];
|
100 |
+
gadwp_drawFrontWidgetChart(gadwpFrontWidgetData);
|
101 |
+
}
|
102 |
+
if (jQuery("#gadwp-widgettotals")[0]){
|
103 |
+
gadwp_drawFrontWidgetTotals(response[1]);
|
104 |
+
}
|
105 |
+
}else{
|
106 |
+
jQuery("#gadwp-widgetchart").css({"background-color":"#F7F7F7","height":"auto","padding-top":"50px","padding-bottom":"50px","color":"#000","text-align":"center"});
|
107 |
+
jQuery("#gadwp-widgetchart").html("<?php __( "This report is unavailable", 'google-analytics-dashboard-for-wp' ); ?> ("+response+")");
|
108 |
+
}
|
109 |
+
});
|
110 |
+
}
|
111 |
+
function gadwp_drawFrontWidgetChart(response) {
|
112 |
+
var data = google.visualization.arrayToDataTable(response);
|
113 |
+
var options = {
|
114 |
+
legend: { position: "none" },
|
115 |
+
pointSize: "3, <?php echo $css; ?>",
|
116 |
+
title: "<?php echo $title; ?>",
|
117 |
+
titlePosition: "in",
|
118 |
+
chartArea: { width: "95%", height: "75%" },
|
119 |
+
hAxis: { textPosition: "none"},
|
120 |
+
vAxis: { textPosition: "none", minValue: 0, gridlines: { color: "transparent" }, baselineColor: "transparent"}
|
121 |
+
}
|
122 |
+
var chart = new google.visualization.AreaChart(document.getElementById("gadwp-widgetchart"));
|
123 |
+
<?php echo $formater; ?>
|
124 |
+
chart.draw(data, options);
|
125 |
+
}
|
126 |
+
function gadwp_drawFrontWidgetTotals(response) {
|
127 |
+
if (response == null){
|
128 |
+
response = 0;
|
129 |
+
}
|
130 |
+
jQuery("#gadwp-widgettotals").html('<div class="gadwp-left"><?php _e( "Period:", 'google-analytics-dashboard-for-wp' ); ?></div> <div class="gadwp-right"><?php echo $periodtext; ?> </div><div class="gadwp-left"><?php _e( "Sessions:", 'google-analytics-dashboard-for-wp' ); ?></div> <div class="gadwp-right">'+response+'</div>');
|
131 |
+
}
|
132 |
+
</script>
|
133 |
+
<?php
|
134 |
+
if ( $instance['give_credits'] == 1 ) :
|
135 |
+
?>
|
136 |
+
<div style="text-align: right; width: 100%; font-size: 0.8em; clear: both; margin-right: 5px;"><?php _e( 'generated by', 'google-analytics-dashboard-for-wp' ); ?> <a href="https://deconf.com/google-analytics-dashboard-wordpress/?utm_source=gadwp_report&utm_medium=link&utm_content=front_widget&utm_campaign=gadwp" rel="nofollow" style="text-decoration: none; font-size: 1em;">GADWP</a>
|
137 |
+
</div>
|
138 |
+
|
139 |
+
<?php
|
140 |
+
endif;
|
141 |
+
$widget_content = ob_get_contents();
|
142 |
+
if ( ob_get_length() ) {
|
143 |
+
ob_end_clean();
|
144 |
+
}
|
145 |
+
echo $widget_content;
|
146 |
+
echo $args['after_widget'];
|
147 |
+
echo "\n<!-- END GADWP Widget -->\n";
|
148 |
+
}
|
149 |
+
|
150 |
+
public function form( $instance ) {
|
151 |
+
$widget_title = ( isset( $instance['title'] ) ? $instance['title'] : __( "Google Analytics Stats", 'google-analytics-dashboard-for-wp' ) );
|
152 |
+
$period = ( isset( $instance['period'] ) ? $instance['period'] : '7daysAgo' );
|
153 |
+
$display = ( isset( $instance['display'] ) ? $instance['display'] : 1 );
|
154 |
+
$give_credits = ( isset( $instance['give_credits'] ) ? $instance['give_credits'] : 1 );
|
155 |
+
$anonim = ( isset( $instance['anonim'] ) ? $instance['anonim'] : 0 );
|
156 |
+
/* @formatter:off */
|
157 |
+
?>
|
158 |
+
<p>
|
159 |
+
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( "Title:",'google-analytics-dashboard-for-wp' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $widget_title ); ?>">
|
160 |
+
</p>
|
161 |
+
<p>
|
162 |
+
<label for="<?php echo $this->get_field_id( 'display' ); ?>"><?php _e( "Display:",'google-analytics-dashboard-for-wp' ); ?></label> <select id="<?php echo $this->get_field_id('display'); ?>" class="widefat" name="<?php echo $this->get_field_name( 'display' ); ?>">
|
163 |
+
<option value="1" <?php selected( $display, 1 ); ?>><?php _e('Chart & Totals', 'google-analytics-dashboard-for-wp');?></option>
|
164 |
+
<option value="2" <?php selected( $display, 2 ); ?>><?php _e('Chart', 'google-analytics-dashboard-for-wp');?></option>
|
165 |
+
<option value="3" <?php selected( $display, 3 ); ?>><?php _e('Totals', 'google-analytics-dashboard-for-wp');?></option>
|
166 |
+
</select>
|
167 |
+
</p>
|
168 |
+
<p>
|
169 |
+
<label for="<?php echo $this->get_field_id( 'anonim' ); ?>"><?php _e( "Anonymize stats:",'google-analytics-dashboard-for-wp' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'anonim' ); ?>" name="<?php echo $this->get_field_name( 'anonim' ); ?>" type="checkbox" <?php checked( $anonim, 1 ); ?> value="1">
|
170 |
+
</p>
|
171 |
+
<p>
|
172 |
+
<label for="<?php echo $this->get_field_id( 'period' ); ?>"><?php _e( "Stats for:",'google-analytics-dashboard-for-wp' ); ?></label> <select id="<?php echo $this->get_field_id('period'); ?>" class="widefat" name="<?php echo $this->get_field_name( 'period' ); ?>">
|
173 |
+
<option value="7daysAgo" <?php selected( $period, '7daysAgo' ); ?>><?php printf( __('Last %d Days', 'google-analytics-dashboard-for-wp'), 7 );?></option>
|
174 |
+
<option value="14daysAgo" <?php selected( $period, '14daysAgo' ); ?>><?php printf( __('Last %d Days', 'google-analytics-dashboard-for-wp'), 14 );?></option>
|
175 |
+
<option value="30daysAgo" <?php selected( $period, '30daysAgo' ); ?>><?php printf( __('Last %d Days', 'google-analytics-dashboard-for-wp'), 30 );?></option>
|
176 |
+
</select>
|
177 |
+
</p>
|
178 |
+
<p>
|
179 |
+
<label for="<?php echo $this->get_field_id( 'give_credits' ); ?>"><?php _e( "Give credits:",'google-analytics-dashboard-for-wp' ); ?></label> <input class="widefat" id="<?php echo $this->get_field_id( 'give_credits' ); ?>" name="<?php echo $this->get_field_name( 'give_credits' ); ?>" type="checkbox" <?php checked( $give_credits, 1 ); ?> value="1">
|
180 |
+
</p>
|
181 |
+
<?php
|
182 |
+
/* @formatter:on */
|
183 |
+
}
|
184 |
+
|
185 |
+
public function update( $new_instance, $old_instance ) {
|
186 |
+
$instance = array();
|
187 |
+
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : 'Analytics Stats';
|
188 |
+
$instance['period'] = ( ! empty( $new_instance['period'] ) ) ? strip_tags( $new_instance['period'] ) : '7daysAgo';
|
189 |
+
$instance['display'] = ( ! empty( $new_instance['display'] ) ) ? strip_tags( $new_instance['display'] ) : 1;
|
190 |
+
$instance['give_credits'] = ( ! empty( $new_instance['give_credits'] ) ) ? strip_tags( $new_instance['give_credits'] ) : 0;
|
191 |
+
$instance['anonim'] = ( ! empty( $new_instance['anonim'] ) ) ? strip_tags( $new_instance['anonim'] ) : 0;
|
192 |
+
return $instance;
|
193 |
+
}
|
194 |
+
}
|
gadwp.php
CHANGED
@@ -1,258 +1,258 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Plugin Name: Google Analytics Dashboard for WP
|
4 |
-
* Plugin URI: https://deconf.com
|
5 |
-
* Description: Displays Google Analytics Reports and Real-Time Statistics in your Dashboard. Automatically inserts the tracking code in every page of your website.
|
6 |
-
* Author: Alin Marcu
|
7 |
-
* Version: 4.9.
|
8 |
-
* Author URI: https://deconf.com
|
9 |
-
* Text Domain: google-analytics-dashboard-for-wp
|
10 |
-
* Domain Path: /languages
|
11 |
-
*/
|
12 |
-
|
13 |
-
// Exit if accessed directly
|
14 |
-
if ( ! defined( 'ABSPATH' ) )
|
15 |
-
exit();
|
16 |
-
|
17 |
-
// Plugin Version
|
18 |
-
if ( ! defined( 'GADWP_CURRENT_VERSION' ) ) {
|
19 |
-
define( 'GADWP_CURRENT_VERSION', '4.9.
|
20 |
-
}
|
21 |
-
|
22 |
-
if ( ! class_exists( 'GADWP_Manager' ) ) {
|
23 |
-
|
24 |
-
final class GADWP_Manager {
|
25 |
-
|
26 |
-
private static $instance = null;
|
27 |
-
|
28 |
-
public $config = null;
|
29 |
-
|
30 |
-
public $frontend_actions = null;
|
31 |
-
|
32 |
-
public $common_actions = null;
|
33 |
-
|
34 |
-
public $backend_actions = null;
|
35 |
-
|
36 |
-
public $tracking = null;
|
37 |
-
|
38 |
-
public $frontend_item_reports = null;
|
39 |
-
|
40 |
-
public $backend_setup = null;
|
41 |
-
|
42 |
-
public $frontend_setup = null;
|
43 |
-
|
44 |
-
public $backend_widgets = null;
|
45 |
-
|
46 |
-
public $backend_item_reports = null;
|
47 |
-
|
48 |
-
public $gapi_controller = null;
|
49 |
-
|
50 |
-
/**
|
51 |
-
* Construct forbidden
|
52 |
-
*/
|
53 |
-
private function __construct() {
|
54 |
-
if ( null !== self::$instance ) {
|
55 |
-
_doing_it_wrong( __FUNCTION__, __( "This is not allowed, read the documentation!", 'google-analytics-dashboard-for-wp' ), '4.6' );
|
56 |
-
}
|
57 |
-
}
|
58 |
-
|
59 |
-
/**
|
60 |
-
* Clone warning
|
61 |
-
*/
|
62 |
-
private function __clone() {
|
63 |
-
_doing_it_wrong( __FUNCTION__, __( "This is not allowed, read the documentation!", 'google-analytics-dashboard-for-wp' ), '4.6' );
|
64 |
-
}
|
65 |
-
|
66 |
-
/**
|
67 |
-
* Wakeup warning
|
68 |
-
*/
|
69 |
-
private function __wakeup() {
|
70 |
-
_doing_it_wrong( __FUNCTION__, __( "This is not allowed, read the documentation!", 'google-analytics-dashboard-for-wp' ), '4.6' );
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Creates a single instance for GADWP and makes sure only one instance is present in memory.
|
75 |
-
*
|
76 |
-
* @return GADWP_Manager
|
77 |
-
*/
|
78 |
-
public static function instance() {
|
79 |
-
if ( null === self::$instance ) {
|
80 |
-
self::$instance = new self();
|
81 |
-
self::$instance->setup();
|
82 |
-
self::$instance->config = new GADWP_Config();
|
83 |
-
}
|
84 |
-
return self::$instance;
|
85 |
-
}
|
86 |
-
|
87 |
-
/**
|
88 |
-
* Defines constants and loads required resources
|
89 |
-
*/
|
90 |
-
private function setup() {
|
91 |
-
|
92 |
-
// Plugin Path
|
93 |
-
if ( ! defined( 'GADWP_DIR' ) ) {
|
94 |
-
define( 'GADWP_DIR', plugin_dir_path( __FILE__ ) );
|
95 |
-
}
|
96 |
-
|
97 |
-
// Plugin URL
|
98 |
-
if ( ! defined( 'GADWP_URL' ) ) {
|
99 |
-
define( 'GADWP_URL', plugin_dir_url( __FILE__ ) );
|
100 |
-
}
|
101 |
-
|
102 |
-
// Plugin main File
|
103 |
-
if ( ! defined( 'GADWP_FILE' ) ) {
|
104 |
-
define( 'GADWP_FILE', __FILE__ );
|
105 |
-
}
|
106 |
-
|
107 |
-
/*
|
108 |
-
* Load Tools class
|
109 |
-
*/
|
110 |
-
include_once ( GADWP_DIR . 'tools/tools.php' );
|
111 |
-
|
112 |
-
/*
|
113 |
-
* Load Config class
|
114 |
-
*/
|
115 |
-
include_once ( GADWP_DIR . 'config.php' );
|
116 |
-
|
117 |
-
/*
|
118 |
-
* Load GAPI Controller class
|
119 |
-
*/
|
120 |
-
include_once ( GADWP_DIR . 'tools/gapi.php' );
|
121 |
-
|
122 |
-
/*
|
123 |
-
* Plugin i18n
|
124 |
-
*/
|
125 |
-
add_action( 'init', array( self::$instance, 'load_i18n' ) );
|
126 |
-
|
127 |
-
/*
|
128 |
-
* Plugin Init
|
129 |
-
*/
|
130 |
-
add_action( 'init', array( self::$instance, 'load' ) );
|
131 |
-
|
132 |
-
/*
|
133 |
-
* Include Install
|
134 |
-
*/
|
135 |
-
include_once ( GADWP_DIR . 'install/install.php' );
|
136 |
-
register_activation_hook( GADWP_FILE, array( 'GADWP_Install', 'install' ) );
|
137 |
-
|
138 |
-
/*
|
139 |
-
* Include Uninstall
|
140 |
-
*/
|
141 |
-
include_once ( GADWP_DIR . 'install/uninstall.php' );
|
142 |
-
register_uninstall_hook( GADWP_FILE, array( 'GADWP_Uninstall', 'uninstall' ) );
|
143 |
-
|
144 |
-
/*
|
145 |
-
* Load Frontend Widgets
|
146 |
-
* (needed during ajax)
|
147 |
-
*/
|
148 |
-
include_once ( GADWP_DIR . 'front/widgets.php' );
|
149 |
-
|
150 |
-
/*
|
151 |
-
* Add Frontend Widgets
|
152 |
-
* (needed during ajax)
|
153 |
-
*/
|
154 |
-
add_action( 'widgets_init', array( self::$instance, 'add_frontend_widget' ) );
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Load i18n
|
159 |
-
*/
|
160 |
-
public function load_i18n() {
|
161 |
-
load_plugin_textdomain( 'google-analytics-dashboard-for-wp', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
|
162 |
-
}
|
163 |
-
|
164 |
-
/**
|
165 |
-
* Register Frontend Widgets
|
166 |
-
*/
|
167 |
-
public function add_frontend_widget() {
|
168 |
-
register_widget( 'GADWP_Frontend_Widget' );
|
169 |
-
}
|
170 |
-
|
171 |
-
/**
|
172 |
-
* Conditional load
|
173 |
-
*/
|
174 |
-
public function load() {
|
175 |
-
if ( is_admin() ) {
|
176 |
-
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
|
177 |
-
if ( GADWP_Tools::check_roles( self::$instance->config->options['ga_dash_access_back'] ) ) {
|
178 |
-
/*
|
179 |
-
* Load Backend ajax actions
|
180 |
-
*/
|
181 |
-
include_once ( GADWP_DIR . 'admin/ajax-actions.php' );
|
182 |
-
self::$instance->backend_actions = new GADWP_Backend_Ajax();
|
183 |
-
}
|
184 |
-
|
185 |
-
/*
|
186 |
-
* Load Frontend ajax actions
|
187 |
-
*/
|
188 |
-
include_once ( GADWP_DIR . 'front/ajax-actions.php' );
|
189 |
-
self::$instance->frontend_actions = new GADWP_Frontend_Ajax();
|
190 |
-
|
191 |
-
/*
|
192 |
-
* Load Common ajax actions
|
193 |
-
*/
|
194 |
-
include_once ( GADWP_DIR . 'common/ajax-actions.php' );
|
195 |
-
self::$instance->common_actions = new GADWP_Common_Ajax();
|
196 |
-
} else if ( GADWP_Tools::check_roles( self::$instance->config->options['ga_dash_access_back'] ) ) {
|
197 |
-
/*
|
198 |
-
* Load Backend Setup
|
199 |
-
*/
|
200 |
-
include_once ( GADWP_DIR . 'admin/setup.php' );
|
201 |
-
self::$instance->backend_setup = new GADWP_Backend_Setup();
|
202 |
-
|
203 |
-
if ( self::$instance->config->options['dashboard_widget'] ) {
|
204 |
-
/*
|
205 |
-
* Load Backend Widget
|
206 |
-
*/
|
207 |
-
include_once ( GADWP_DIR . 'admin/widgets.php' );
|
208 |
-
self::$instance->backend_widgets = new GADWP_Backend_Widgets();
|
209 |
-
}
|
210 |
-
|
211 |
-
if ( self::$instance->config->options['backend_item_reports'] ) {
|
212 |
-
/*
|
213 |
-
* Load Backend Item Reports
|
214 |
-
*/
|
215 |
-
include_once ( GADWP_DIR . 'admin/item-reports.php' );
|
216 |
-
self::$instance->backend_item_reports = new GADWP_Backend_Item_Reports();
|
217 |
-
}
|
218 |
-
}
|
219 |
-
} else {
|
220 |
-
if ( GADWP_Tools::check_roles( self::$instance->config->options['ga_dash_access_front'] ) ) {
|
221 |
-
/*
|
222 |
-
* Load Frontend Setup
|
223 |
-
*/
|
224 |
-
include_once ( GADWP_DIR . 'front/setup.php' );
|
225 |
-
self::$instance->frontend_setup = new GADWP_Frontend_Setup();
|
226 |
-
|
227 |
-
if ( self::$instance->config->options['frontend_item_reports'] ) {
|
228 |
-
/*
|
229 |
-
* Load Frontend Item Reports
|
230 |
-
*/
|
231 |
-
include_once ( GADWP_DIR . 'front/item-reports.php' );
|
232 |
-
self::$instance->frontend_item_reports = new GADWP_Frontend_Item_Reports();
|
233 |
-
}
|
234 |
-
}
|
235 |
-
|
236 |
-
if ( ! GADWP_Tools::check_roles( self::$instance->config->options['ga_track_exclude'], true ) && self::$instance->config->options['ga_dash_tracking'] ) {
|
237 |
-
/*
|
238 |
-
* Load tracking class
|
239 |
-
*/
|
240 |
-
include_once ( GADWP_DIR . 'front/tracking.php' );
|
241 |
-
self::$instance->tracking = new GADWP_Tracking();
|
242 |
-
}
|
243 |
-
}
|
244 |
-
}
|
245 |
-
}
|
246 |
-
}
|
247 |
-
|
248 |
-
/**
|
249 |
-
* Returns a unique instance of GADWP
|
250 |
-
*/
|
251 |
-
function GADWP() {
|
252 |
-
return GADWP_Manager::instance();
|
253 |
-
}
|
254 |
-
|
255 |
-
/*
|
256 |
-
* Start GADWP
|
257 |
-
*/
|
258 |
-
GADWP();
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Plugin Name: Google Analytics Dashboard for WP
|
4 |
+
* Plugin URI: https://deconf.com
|
5 |
+
* Description: Displays Google Analytics Reports and Real-Time Statistics in your Dashboard. Automatically inserts the tracking code in every page of your website.
|
6 |
+
* Author: Alin Marcu
|
7 |
+
* Version: 4.9.5
|
8 |
+
* Author URI: https://deconf.com
|
9 |
+
* Text Domain: google-analytics-dashboard-for-wp
|
10 |
+
* Domain Path: /languages
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( ! defined( 'ABSPATH' ) )
|
15 |
+
exit();
|
16 |
+
|
17 |
+
// Plugin Version
|
18 |
+
if ( ! defined( 'GADWP_CURRENT_VERSION' ) ) {
|
19 |
+
define( 'GADWP_CURRENT_VERSION', '4.9.5' );
|
20 |
+
}
|
21 |
+
|
22 |
+
if ( ! class_exists( 'GADWP_Manager' ) ) {
|
23 |
+
|
24 |
+
final class GADWP_Manager {
|
25 |
+
|
26 |
+
private static $instance = null;
|
27 |
+
|
28 |
+
public $config = null;
|
29 |
+
|
30 |
+
public $frontend_actions = null;
|
31 |
+
|
32 |
+
public $common_actions = null;
|
33 |
+
|
34 |
+
public $backend_actions = null;
|
35 |
+
|
36 |
+
public $tracking = null;
|
37 |
+
|
38 |
+
public $frontend_item_reports = null;
|
39 |
+
|
40 |
+
public $backend_setup = null;
|
41 |
+
|
42 |
+
public $frontend_setup = null;
|
43 |
+
|
44 |
+
public $backend_widgets = null;
|
45 |
+
|
46 |
+
public $backend_item_reports = null;
|
47 |
+
|
48 |
+
public $gapi_controller = null;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Construct forbidden
|
52 |
+
*/
|
53 |
+
private function __construct() {
|
54 |
+
if ( null !== self::$instance ) {
|
55 |
+
_doing_it_wrong( __FUNCTION__, __( "This is not allowed, read the documentation!", 'google-analytics-dashboard-for-wp' ), '4.6' );
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Clone warning
|
61 |
+
*/
|
62 |
+
private function __clone() {
|
63 |
+
_doing_it_wrong( __FUNCTION__, __( "This is not allowed, read the documentation!", 'google-analytics-dashboard-for-wp' ), '4.6' );
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Wakeup warning
|
68 |
+
*/
|
69 |
+
private function __wakeup() {
|
70 |
+
_doing_it_wrong( __FUNCTION__, __( "This is not allowed, read the documentation!", 'google-analytics-dashboard-for-wp' ), '4.6' );
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Creates a single instance for GADWP and makes sure only one instance is present in memory.
|
75 |
+
*
|
76 |
+
* @return GADWP_Manager
|
77 |
+
*/
|
78 |
+
public static function instance() {
|
79 |
+
if ( null === self::$instance ) {
|
80 |
+
self::$instance = new self();
|
81 |
+
self::$instance->setup();
|
82 |
+
self::$instance->config = new GADWP_Config();
|
83 |
+
}
|
84 |
+
return self::$instance;
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* Defines constants and loads required resources
|
89 |
+
*/
|
90 |
+
private function setup() {
|
91 |
+
|
92 |
+
// Plugin Path
|
93 |
+
if ( ! defined( 'GADWP_DIR' ) ) {
|
94 |
+
define( 'GADWP_DIR', plugin_dir_path( __FILE__ ) );
|
95 |
+
}
|
96 |
+
|
97 |
+
// Plugin URL
|
98 |
+
if ( ! defined( 'GADWP_URL' ) ) {
|
99 |
+
define( 'GADWP_URL', plugin_dir_url( __FILE__ ) );
|
100 |
+
}
|
101 |
+
|
102 |
+
// Plugin main File
|
103 |
+
if ( ! defined( 'GADWP_FILE' ) ) {
|
104 |
+
define( 'GADWP_FILE', __FILE__ );
|
105 |
+
}
|
106 |
+
|
107 |
+
/*
|
108 |
+
* Load Tools class
|
109 |
+
*/
|
110 |
+
include_once ( GADWP_DIR . 'tools/tools.php' );
|
111 |
+
|
112 |
+
/*
|
113 |
+
* Load Config class
|
114 |
+
*/
|
115 |
+
include_once ( GADWP_DIR . 'config.php' );
|
116 |
+
|
117 |
+
/*
|
118 |
+
* Load GAPI Controller class
|
119 |
+
*/
|
120 |
+
include_once ( GADWP_DIR . 'tools/gapi.php' );
|
121 |
+
|
122 |
+
/*
|
123 |
+
* Plugin i18n
|
124 |
+
*/
|
125 |
+
add_action( 'init', array( self::$instance, 'load_i18n' ) );
|
126 |
+
|
127 |
+
/*
|
128 |
+
* Plugin Init
|
129 |
+
*/
|
130 |
+
add_action( 'init', array( self::$instance, 'load' ) );
|
131 |
+
|
132 |
+
/*
|
133 |
+
* Include Install
|
134 |
+
*/
|
135 |
+
include_once ( GADWP_DIR . 'install/install.php' );
|
136 |
+
register_activation_hook( GADWP_FILE, array( 'GADWP_Install', 'install' ) );
|
137 |
+
|
138 |
+
/*
|
139 |
+
* Include Uninstall
|
140 |
+
*/
|
141 |
+
include_once ( GADWP_DIR . 'install/uninstall.php' );
|
142 |
+
register_uninstall_hook( GADWP_FILE, array( 'GADWP_Uninstall', 'uninstall' ) );
|
143 |
+
|
144 |
+
/*
|
145 |
+
* Load Frontend Widgets
|
146 |
+
* (needed during ajax)
|
147 |
+
*/
|
148 |
+
include_once ( GADWP_DIR . 'front/widgets.php' );
|
149 |
+
|
150 |
+
/*
|
151 |
+
* Add Frontend Widgets
|
152 |
+
* (needed during ajax)
|
153 |
+
*/
|
154 |
+
add_action( 'widgets_init', array( self::$instance, 'add_frontend_widget' ) );
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Load i18n
|
159 |
+
*/
|
160 |
+
public function load_i18n() {
|
161 |
+
load_plugin_textdomain( 'google-analytics-dashboard-for-wp', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Register Frontend Widgets
|
166 |
+
*/
|
167 |
+
public function add_frontend_widget() {
|
168 |
+
register_widget( 'GADWP_Frontend_Widget' );
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* Conditional load
|
173 |
+
*/
|
174 |
+
public function load() {
|
175 |
+
if ( is_admin() ) {
|
176 |
+
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
|
177 |
+
if ( GADWP_Tools::check_roles( self::$instance->config->options['ga_dash_access_back'] ) ) {
|
178 |
+
/*
|
179 |
+
* Load Backend ajax actions
|
180 |
+
*/
|
181 |
+
include_once ( GADWP_DIR . 'admin/ajax-actions.php' );
|
182 |
+
self::$instance->backend_actions = new GADWP_Backend_Ajax();
|
183 |
+
}
|
184 |
+
|
185 |
+
/*
|
186 |
+
* Load Frontend ajax actions
|
187 |
+
*/
|
188 |
+
include_once ( GADWP_DIR . 'front/ajax-actions.php' );
|
189 |
+
self::$instance->frontend_actions = new GADWP_Frontend_Ajax();
|
190 |
+
|
191 |
+
/*
|
192 |
+
* Load Common ajax actions
|
193 |
+
*/
|
194 |
+
include_once ( GADWP_DIR . 'common/ajax-actions.php' );
|
195 |
+
self::$instance->common_actions = new GADWP_Common_Ajax();
|
196 |
+
} else if ( GADWP_Tools::check_roles( self::$instance->config->options['ga_dash_access_back'] ) ) {
|
197 |
+
/*
|
198 |
+
* Load Backend Setup
|
199 |
+
*/
|
200 |
+
include_once ( GADWP_DIR . 'admin/setup.php' );
|
201 |
+
self::$instance->backend_setup = new GADWP_Backend_Setup();
|
202 |
+
|
203 |
+
if ( self::$instance->config->options['dashboard_widget'] ) {
|
204 |
+
/*
|
205 |
+
* Load Backend Widget
|
206 |
+
*/
|
207 |
+
include_once ( GADWP_DIR . 'admin/widgets.php' );
|
208 |
+
self::$instance->backend_widgets = new GADWP_Backend_Widgets();
|
209 |
+
}
|
210 |
+
|
211 |
+
if ( self::$instance->config->options['backend_item_reports'] ) {
|
212 |
+
/*
|
213 |
+
* Load Backend Item Reports
|
214 |
+
*/
|
215 |
+
include_once ( GADWP_DIR . 'admin/item-reports.php' );
|
216 |
+
self::$instance->backend_item_reports = new GADWP_Backend_Item_Reports();
|
217 |
+
}
|
218 |
+
}
|
219 |
+
} else {
|
220 |
+
if ( GADWP_Tools::check_roles( self::$instance->config->options['ga_dash_access_front'] ) ) {
|
221 |
+
/*
|
222 |
+
* Load Frontend Setup
|
223 |
+
*/
|
224 |
+
include_once ( GADWP_DIR . 'front/setup.php' );
|
225 |
+
self::$instance->frontend_setup = new GADWP_Frontend_Setup();
|
226 |
+
|
227 |
+
if ( self::$instance->config->options['frontend_item_reports'] ) {
|
228 |
+
/*
|
229 |
+
* Load Frontend Item Reports
|
230 |
+
*/
|
231 |
+
include_once ( GADWP_DIR . 'front/item-reports.php' );
|
232 |
+
self::$instance->frontend_item_reports = new GADWP_Frontend_Item_Reports();
|
233 |
+
}
|
234 |
+
}
|
235 |
+
|
236 |
+
if ( ! GADWP_Tools::check_roles( self::$instance->config->options['ga_track_exclude'], true ) && self::$instance->config->options['ga_dash_tracking'] ) {
|
237 |
+
/*
|
238 |
+
* Load tracking class
|
239 |
+
*/
|
240 |
+
include_once ( GADWP_DIR . 'front/tracking.php' );
|
241 |
+
self::$instance->tracking = new GADWP_Tracking();
|
242 |
+
}
|
243 |
+
}
|
244 |
+
}
|
245 |
+
}
|
246 |
+
}
|
247 |
+
|
248 |
+
/**
|
249 |
+
* Returns a unique instance of GADWP
|
250 |
+
*/
|
251 |
+
function GADWP() {
|
252 |
+
return GADWP_Manager::instance();
|
253 |
+
}
|
254 |
+
|
255 |
+
/*
|
256 |
+
* Start GADWP
|
257 |
+
*/
|
258 |
+
GADWP();
|
install/install.php
CHANGED
@@ -1,149 +1,149 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
class GADWP_Install {
|
15 |
-
|
16 |
-
public static function install() {
|
17 |
-
if ( ! get_option( 'ga_dash_token' ) ) {
|
18 |
-
$options = array();
|
19 |
-
$options['ga_dash_clientid'] = '';
|
20 |
-
$options['ga_dash_clientsecret'] = '';
|
21 |
-
$options['ga_dash_access_front'][] = 'administrator';
|
22 |
-
$options['ga_dash_access_back'][] = 'administrator';
|
23 |
-
$options['ga_dash_tableid_jail'] = '';
|
24 |
-
$options['ga_dash_style'] = '#1e73be';
|
25 |
-
$options['switch_profile'] = 0;
|
26 |
-
$options['ga_dash_cachetime'] = 3600;
|
27 |
-
$options['ga_dash_tracking'] = 1;
|
28 |
-
$options['ga_dash_tracking_type'] = 'universal';
|
29 |
-
$options['ga_dash_default_ua'] = '';
|
30 |
-
$options['ga_dash_anonim'] = 0;
|
31 |
-
$options['ga_dash_userapi'] = 0;
|
32 |
-
$options['ga_event_tracking'] = 0;
|
33 |
-
$options['ga_event_downloads'] = 'zip|mp3*|mpe*g|pdf|docx*|pptx*|xlsx*|rar*';
|
34 |
-
$options['ga_track_exclude'] = array();
|
35 |
-
$options['ga_target_geomap'] = '';
|
36 |
-
$options['ga_realtime_pages'] = 10;
|
37 |
-
$options['ga_dash_token'] = '';
|
38 |
-
$options['ga_dash_profile_list'] = array();
|
39 |
-
$options['ga_dash_frontend_keywords'] = 0;
|
40 |
-
$options['ga_tracking_code'] = '';
|
41 |
-
$options['ga_enhanced_links'] = 0;
|
42 |
-
$options['ga_dash_remarketing'] = 0;
|
43 |
-
$options['ga_dash_frontend_stats'] = 0;
|
44 |
-
$options['ga_dash_network'] = 0;
|
45 |
-
$options['ga_dash_adsense'] = 0;
|
46 |
-
$options['ga_speed_samplerate'] = 1;
|
47 |
-
$options['ga_event_bouncerate'] = 0;
|
48 |
-
$options['ga_crossdomain_tracking'] = 0;
|
49 |
-
$options['ga_crossdomain_list'] = '';
|
50 |
-
$options['ga_author_dimindex'] = 0;
|
51 |
-
$options['ga_category_dimindex'] = 0;
|
52 |
-
$options['ga_tag_dimindex'] = 0;
|
53 |
-
$options['ga_user_dimindex'] = 0;
|
54 |
-
$options['ga_pubyear_dimindex'] = 0;
|
55 |
-
$options['ga_pubyearmonth_dimindex'] = 0;
|
56 |
-
$options['ga_aff_tracking'] = 0;
|
57 |
-
$options['ga_event_affiliates'] = '/out/';
|
58 |
-
$options['automatic_updates_minorversion'] = 1;
|
59 |
-
$options['backend_item_reports'] = 1;
|
60 |
-
$options['frontend_item_reports'] = 0;
|
61 |
-
$options['dashboard_widget'] = 1;
|
62 |
-
$options['api_backoff'] = 0;
|
63 |
-
$options['ga_cookiedomain'] = '';
|
64 |
-
$options['ga_cookiename'] = '';
|
65 |
-
$options['ga_cookieexpires'] = '';
|
66 |
-
$option['pagetitle_404'] = 'Page Not Found';
|
67 |
-
$option['maps_api_key'] = '';
|
68 |
-
|
69 |
-
} else {
|
70 |
-
$options = array();
|
71 |
-
$options['ga_dash_clientid'] = get_option( 'ga_dash_clientid' );
|
72 |
-
$options['ga_dash_clientsecret'] = get_option( 'ga_dash_clientsecret' );
|
73 |
-
$options['ga_dash_access'] = get_option( 'ga_dash_access' );
|
74 |
-
$options['ga_dash_access_front'][] = 'administrator';
|
75 |
-
$options['ga_dash_access_back'][] = 'administrator';
|
76 |
-
$options['ga_dash_tableid_jail'] = get_option( 'ga_dash_tableid_jail' );
|
77 |
-
$options['ga_dash_frontend_stats'] = get_option( 'ga_dash_frontend' );
|
78 |
-
$options['ga_dash_style'] = '#1e73be';
|
79 |
-
$options['switch_profile'] = get_option( 'ga_dash_jailadmins' );
|
80 |
-
$options['ga_dash_cachetime'] = get_option( 'ga_dash_cachetime' );
|
81 |
-
if ( get_option( 'ga_dash_tracking' ) == 4 ) {
|
82 |
-
$options['ga_dash_tracking'] = 0;
|
83 |
-
} else {
|
84 |
-
$options['ga_dash_tracking'] = 1;
|
85 |
-
}
|
86 |
-
$options['ga_dash_tracking_type'] = get_option( 'ga_dash_tracking_type' );
|
87 |
-
$options['ga_dash_default_ua'] = get_option( 'ga_dash_default_ua' );
|
88 |
-
$options['ga_dash_anonim'] = get_option( 'ga_dash_anonim' );
|
89 |
-
$options['ga_dash_userapi'] = get_option( 'ga_dash_userapi' );
|
90 |
-
$options['ga_event_tracking'] = get_option( 'ga_event_tracking' );
|
91 |
-
$options['ga_event_downloads'] = get_option( 'ga_event_downloads' );
|
92 |
-
$options['ga_track_exclude'] = array();
|
93 |
-
$options['ga_target_geomap'] = get_option( 'ga_target_geomap' );
|
94 |
-
$options['ga_realtime_pages'] = get_option( 'ga_realtime_pages' );
|
95 |
-
$options['ga_dash_token'] = get_option( 'ga_dash_token' );
|
96 |
-
$options['ga_dash_profile_list'] = get_option( 'ga_dash_profile_list' );
|
97 |
-
$options['ga_dash_frontend_keywords'] = 0;
|
98 |
-
$options['ga_enhanced_links'] = 0;
|
99 |
-
$options['ga_dash_remarketing'] = 0;
|
100 |
-
$options['ga_dash_network'] = 0;
|
101 |
-
$options['ga_event_bouncerate'] = 0;
|
102 |
-
$options['ga_crossdomain_tracking'] = 0;
|
103 |
-
$options['ga_crossdomain_list'] = '';
|
104 |
-
$options['ga_author_dimindex'] = 0;
|
105 |
-
$options['ga_category_dimindex'] = 0;
|
106 |
-
$options['ga_tag_dimindex'] = 0;
|
107 |
-
$options['ga_user_dimindex'] = 0;
|
108 |
-
$options['ga_pubyear_dimindex'] = 0;
|
109 |
-
$options['ga_pubyearmonth_dimindex'] = 0;
|
110 |
-
$options['ga_event_affiliates'] = '/out/';
|
111 |
-
$options['ga_aff_tracking'] = 0;
|
112 |
-
$options['automatic_updates_minorversion'] = 1;
|
113 |
-
$options['backend_item_reports'] = 1;
|
114 |
-
$options['frontend_item_reports'] = 0;
|
115 |
-
$options['dashboard_widget'] = 1;
|
116 |
-
$options['api_backoff'] = 0;
|
117 |
-
$options['ga_cookiedomain'] = '';
|
118 |
-
$options['ga_cookiename'] = '';
|
119 |
-
$options['ga_cookieexpires'] = '';
|
120 |
-
$option['pagetitle_404'] = 'Page Not Found';
|
121 |
-
$option['maps_api_key'] = '';
|
122 |
-
|
123 |
-
delete_option( 'ga_dash_clientid' );
|
124 |
-
delete_option( 'ga_dash_clientsecret' );
|
125 |
-
delete_option( 'ga_dash_access' );
|
126 |
-
delete_option( 'ga_dash_access_front' );
|
127 |
-
delete_option( 'ga_dash_access_back' );
|
128 |
-
delete_option( 'ga_dash_tableid_jail' );
|
129 |
-
delete_option( 'ga_dash_frontend' );
|
130 |
-
delete_option( 'ga_dash_style' );
|
131 |
-
delete_option( 'ga_dash_jailadmins' );
|
132 |
-
delete_option( 'ga_dash_cachetime' );
|
133 |
-
delete_option( 'ga_dash_tracking' );
|
134 |
-
delete_option( 'ga_dash_tracking_type' );
|
135 |
-
delete_option( 'ga_dash_default_ua' );
|
136 |
-
delete_option( 'ga_dash_anonim' );
|
137 |
-
delete_option( 'ga_dash_userapi' );
|
138 |
-
delete_option( 'ga_event_tracking' );
|
139 |
-
delete_option( 'ga_event_downloads' );
|
140 |
-
delete_option( 'ga_track_exclude' );
|
141 |
-
delete_option( 'ga_target_geomap' );
|
142 |
-
delete_option( 'ga_realtime_pages' );
|
143 |
-
delete_option( 'ga_dash_token' );
|
144 |
-
delete_option( 'ga_dash_refresh_token' );
|
145 |
-
delete_option( 'ga_dash_profile_list' );
|
146 |
-
}
|
147 |
-
add_option( 'gadash_options', json_encode( $options ) );
|
148 |
-
}
|
149 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
class GADWP_Install {
|
15 |
+
|
16 |
+
public static function install() {
|
17 |
+
if ( ! get_option( 'ga_dash_token' ) ) {
|
18 |
+
$options = array();
|
19 |
+
$options['ga_dash_clientid'] = '';
|
20 |
+
$options['ga_dash_clientsecret'] = '';
|
21 |
+
$options['ga_dash_access_front'][] = 'administrator';
|
22 |
+
$options['ga_dash_access_back'][] = 'administrator';
|
23 |
+
$options['ga_dash_tableid_jail'] = '';
|
24 |
+
$options['ga_dash_style'] = '#1e73be';
|
25 |
+
$options['switch_profile'] = 0;
|
26 |
+
$options['ga_dash_cachetime'] = 3600;
|
27 |
+
$options['ga_dash_tracking'] = 1;
|
28 |
+
$options['ga_dash_tracking_type'] = 'universal';
|
29 |
+
$options['ga_dash_default_ua'] = '';
|
30 |
+
$options['ga_dash_anonim'] = 0;
|
31 |
+
$options['ga_dash_userapi'] = 0;
|
32 |
+
$options['ga_event_tracking'] = 0;
|
33 |
+
$options['ga_event_downloads'] = 'zip|mp3*|mpe*g|pdf|docx*|pptx*|xlsx*|rar*';
|
34 |
+
$options['ga_track_exclude'] = array();
|
35 |
+
$options['ga_target_geomap'] = '';
|
36 |
+
$options['ga_realtime_pages'] = 10;
|
37 |
+
$options['ga_dash_token'] = '';
|
38 |
+
$options['ga_dash_profile_list'] = array();
|
39 |
+
$options['ga_dash_frontend_keywords'] = 0;
|
40 |
+
$options['ga_tracking_code'] = '';
|
41 |
+
$options['ga_enhanced_links'] = 0;
|
42 |
+
$options['ga_dash_remarketing'] = 0;
|
43 |
+
$options['ga_dash_frontend_stats'] = 0;
|
44 |
+
$options['ga_dash_network'] = 0;
|
45 |
+
$options['ga_dash_adsense'] = 0;
|
46 |
+
$options['ga_speed_samplerate'] = 1;
|
47 |
+
$options['ga_event_bouncerate'] = 0;
|
48 |
+
$options['ga_crossdomain_tracking'] = 0;
|
49 |
+
$options['ga_crossdomain_list'] = '';
|
50 |
+
$options['ga_author_dimindex'] = 0;
|
51 |
+
$options['ga_category_dimindex'] = 0;
|
52 |
+
$options['ga_tag_dimindex'] = 0;
|
53 |
+
$options['ga_user_dimindex'] = 0;
|
54 |
+
$options['ga_pubyear_dimindex'] = 0;
|
55 |
+
$options['ga_pubyearmonth_dimindex'] = 0;
|
56 |
+
$options['ga_aff_tracking'] = 0;
|
57 |
+
$options['ga_event_affiliates'] = '/out/';
|
58 |
+
$options['automatic_updates_minorversion'] = 1;
|
59 |
+
$options['backend_item_reports'] = 1;
|
60 |
+
$options['frontend_item_reports'] = 0;
|
61 |
+
$options['dashboard_widget'] = 1;
|
62 |
+
$options['api_backoff'] = 0;
|
63 |
+
$options['ga_cookiedomain'] = '';
|
64 |
+
$options['ga_cookiename'] = '';
|
65 |
+
$options['ga_cookieexpires'] = '';
|
66 |
+
$option['pagetitle_404'] = 'Page Not Found';
|
67 |
+
$option['maps_api_key'] = '';
|
68 |
+
|
69 |
+
} else {
|
70 |
+
$options = array();
|
71 |
+
$options['ga_dash_clientid'] = get_option( 'ga_dash_clientid' );
|
72 |
+
$options['ga_dash_clientsecret'] = get_option( 'ga_dash_clientsecret' );
|
73 |
+
$options['ga_dash_access'] = get_option( 'ga_dash_access' );
|
74 |
+
$options['ga_dash_access_front'][] = 'administrator';
|
75 |
+
$options['ga_dash_access_back'][] = 'administrator';
|
76 |
+
$options['ga_dash_tableid_jail'] = get_option( 'ga_dash_tableid_jail' );
|
77 |
+
$options['ga_dash_frontend_stats'] = get_option( 'ga_dash_frontend' );
|
78 |
+
$options['ga_dash_style'] = '#1e73be';
|
79 |
+
$options['switch_profile'] = get_option( 'ga_dash_jailadmins' );
|
80 |
+
$options['ga_dash_cachetime'] = get_option( 'ga_dash_cachetime' );
|
81 |
+
if ( get_option( 'ga_dash_tracking' ) == 4 ) {
|
82 |
+
$options['ga_dash_tracking'] = 0;
|
83 |
+
} else {
|
84 |
+
$options['ga_dash_tracking'] = 1;
|
85 |
+
}
|
86 |
+
$options['ga_dash_tracking_type'] = get_option( 'ga_dash_tracking_type' );
|
87 |
+
$options['ga_dash_default_ua'] = get_option( 'ga_dash_default_ua' );
|
88 |
+
$options['ga_dash_anonim'] = get_option( 'ga_dash_anonim' );
|
89 |
+
$options['ga_dash_userapi'] = get_option( 'ga_dash_userapi' );
|
90 |
+
$options['ga_event_tracking'] = get_option( 'ga_event_tracking' );
|
91 |
+
$options['ga_event_downloads'] = get_option( 'ga_event_downloads' );
|
92 |
+
$options['ga_track_exclude'] = array();
|
93 |
+
$options['ga_target_geomap'] = get_option( 'ga_target_geomap' );
|
94 |
+
$options['ga_realtime_pages'] = get_option( 'ga_realtime_pages' );
|
95 |
+
$options['ga_dash_token'] = get_option( 'ga_dash_token' );
|
96 |
+
$options['ga_dash_profile_list'] = get_option( 'ga_dash_profile_list' );
|
97 |
+
$options['ga_dash_frontend_keywords'] = 0;
|
98 |
+
$options['ga_enhanced_links'] = 0;
|
99 |
+
$options['ga_dash_remarketing'] = 0;
|
100 |
+
$options['ga_dash_network'] = 0;
|
101 |
+
$options['ga_event_bouncerate'] = 0;
|
102 |
+
$options['ga_crossdomain_tracking'] = 0;
|
103 |
+
$options['ga_crossdomain_list'] = '';
|
104 |
+
$options['ga_author_dimindex'] = 0;
|
105 |
+
$options['ga_category_dimindex'] = 0;
|
106 |
+
$options['ga_tag_dimindex'] = 0;
|
107 |
+
$options['ga_user_dimindex'] = 0;
|
108 |
+
$options['ga_pubyear_dimindex'] = 0;
|
109 |
+
$options['ga_pubyearmonth_dimindex'] = 0;
|
110 |
+
$options['ga_event_affiliates'] = '/out/';
|
111 |
+
$options['ga_aff_tracking'] = 0;
|
112 |
+
$options['automatic_updates_minorversion'] = 1;
|
113 |
+
$options['backend_item_reports'] = 1;
|
114 |
+
$options['frontend_item_reports'] = 0;
|
115 |
+
$options['dashboard_widget'] = 1;
|
116 |
+
$options['api_backoff'] = 0;
|
117 |
+
$options['ga_cookiedomain'] = '';
|
118 |
+
$options['ga_cookiename'] = '';
|
119 |
+
$options['ga_cookieexpires'] = '';
|
120 |
+
$option['pagetitle_404'] = 'Page Not Found';
|
121 |
+
$option['maps_api_key'] = '';
|
122 |
+
|
123 |
+
delete_option( 'ga_dash_clientid' );
|
124 |
+
delete_option( 'ga_dash_clientsecret' );
|
125 |
+
delete_option( 'ga_dash_access' );
|
126 |
+
delete_option( 'ga_dash_access_front' );
|
127 |
+
delete_option( 'ga_dash_access_back' );
|
128 |
+
delete_option( 'ga_dash_tableid_jail' );
|
129 |
+
delete_option( 'ga_dash_frontend' );
|
130 |
+
delete_option( 'ga_dash_style' );
|
131 |
+
delete_option( 'ga_dash_jailadmins' );
|
132 |
+
delete_option( 'ga_dash_cachetime' );
|
133 |
+
delete_option( 'ga_dash_tracking' );
|
134 |
+
delete_option( 'ga_dash_tracking_type' );
|
135 |
+
delete_option( 'ga_dash_default_ua' );
|
136 |
+
delete_option( 'ga_dash_anonim' );
|
137 |
+
delete_option( 'ga_dash_userapi' );
|
138 |
+
delete_option( 'ga_event_tracking' );
|
139 |
+
delete_option( 'ga_event_downloads' );
|
140 |
+
delete_option( 'ga_track_exclude' );
|
141 |
+
delete_option( 'ga_target_geomap' );
|
142 |
+
delete_option( 'ga_realtime_pages' );
|
143 |
+
delete_option( 'ga_dash_token' );
|
144 |
+
delete_option( 'ga_dash_refresh_token' );
|
145 |
+
delete_option( 'ga_dash_profile_list' );
|
146 |
+
}
|
147 |
+
add_option( 'gadash_options', json_encode( $options ) );
|
148 |
+
}
|
149 |
+
}
|
install/uninstall.php
CHANGED
@@ -1,34 +1,34 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
class GADWP_Uninstall {
|
15 |
-
|
16 |
-
public static function uninstall() {
|
17 |
-
global $wpdb;
|
18 |
-
if ( is_multisite() ) { // Cleanup Network install
|
19 |
-
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
20 |
-
switch_to_blog( $blog['blog_id'] );
|
21 |
-
$sqlquery = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'gadwp_cache_%%'" );
|
22 |
-
delete_option( 'gadash_options' );
|
23 |
-
restore_current_blog();
|
24 |
-
}
|
25 |
-
delete_site_option( 'gadash_network_options' );
|
26 |
-
} else { // Cleanup Single install
|
27 |
-
$sqlquery = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'gadwp_cache_%%'" );
|
28 |
-
delete_option( 'gadash_options' );
|
29 |
-
}
|
30 |
-
GADWP_Tools::unset_cookie( 'default_metric' );
|
31 |
-
GADWP_Tools::unset_cookie( 'default_dimension' );
|
32 |
-
GADWP_Tools::unset_cookie( 'default_view' );
|
33 |
-
}
|
34 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
class GADWP_Uninstall {
|
15 |
+
|
16 |
+
public static function uninstall() {
|
17 |
+
global $wpdb;
|
18 |
+
if ( is_multisite() ) { // Cleanup Network install
|
19 |
+
foreach ( GADWP_Tools::get_sites( array( 'limit' => apply_filters( 'gadwp_sites_limit', 100 ) ) ) as $blog ) {
|
20 |
+
switch_to_blog( $blog['blog_id'] );
|
21 |
+
$sqlquery = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'gadwp_cache_%%'" );
|
22 |
+
delete_option( 'gadash_options' );
|
23 |
+
restore_current_blog();
|
24 |
+
}
|
25 |
+
delete_site_option( 'gadash_network_options' );
|
26 |
+
} else { // Cleanup Single install
|
27 |
+
$sqlquery = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'gadwp_cache_%%'" );
|
28 |
+
delete_option( 'gadash_options' );
|
29 |
+
}
|
30 |
+
GADWP_Tools::unset_cookie( 'default_metric' );
|
31 |
+
GADWP_Tools::unset_cookie( 'default_dimension' );
|
32 |
+
GADWP_Tools::unset_cookie( 'default_view' );
|
33 |
+
}
|
34 |
+
}
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Donate link: https://deconf.com/donate/
|
|
4 |
Tags: google,analytics,google analytics,dashboard,analytics dashboard,google analytics dashboard,google analytics plugin,google analytics widget,tracking,universal google analytics,realtime,multisite,gadwp
|
5 |
Requires at least: 3.5
|
6 |
Tested up to: 4.7
|
7 |
-
Stable tag: 4.9.
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
@@ -137,6 +137,14 @@ Google Analytics Dashboard for WP it's released under the GPLv2, you can use it
|
|
137 |
|
138 |
== Changelog ==
|
139 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
= 4.9.4 =
|
141 |
* Enhancements:
|
142 |
* always load analytics.js over SSL
|
4 |
Tags: google,analytics,google analytics,dashboard,analytics dashboard,google analytics dashboard,google analytics plugin,google analytics widget,tracking,universal google analytics,realtime,multisite,gadwp
|
5 |
Requires at least: 3.5
|
6 |
Tested up to: 4.7
|
7 |
+
Stable tag: 4.9.5
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
137 |
|
138 |
== Changelog ==
|
139 |
|
140 |
+
= 4.9.5 =
|
141 |
+
* Bug Fixes:
|
142 |
+
* correction of some files with mixed endings, props by [Edward Dekker](http://www.github.com/edwarddekker)
|
143 |
+
* only load the necessary resources for frontend widget
|
144 |
+
* corrected a JavaScript error on frontend sidebar widget
|
145 |
+
* Enhancements:
|
146 |
+
* introducing the <strong>gadwp_curl_options</strong> filter to allow changes on CURL options for the Google_IO_Curl class, props by [Alexandre Simard](https://github.com/brocheafoin)
|
147 |
+
|
148 |
= 4.9.4 =
|
149 |
* Enhancements:
|
150 |
* always load analytics.js over SSL
|
tools/autoload.php
CHANGED
@@ -1,38 +1,38 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
* Copyright 2014 Google Inc.
|
5 |
-
*
|
6 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
-
* you may not use this file except in compliance with the License.
|
8 |
-
* You may obtain a copy of the License at
|
9 |
-
*
|
10 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
-
*
|
12 |
-
* Unless required by applicable law or agreed to in writing, software
|
13 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
-
* See the License for the specific language governing permissions and
|
16 |
-
* limitations under the License.
|
17 |
-
*/
|
18 |
-
|
19 |
-
// Exit if accessed directly
|
20 |
-
if (! defined('ABSPATH'))
|
21 |
-
exit();
|
22 |
-
|
23 |
-
function google_api_php_client_autoload_gadwp($className)
|
24 |
-
{
|
25 |
-
$classPath = explode('_', $className);
|
26 |
-
if ($classPath[0] != 'Google') {
|
27 |
-
return;
|
28 |
-
}
|
29 |
-
if (count($classPath) > 3) {
|
30 |
-
// Maximum class file path depth in this project is 3.
|
31 |
-
$classPath = array_slice($classPath, 0, 3);
|
32 |
-
}
|
33 |
-
$filePath = dirname(__FILE__) . '/src/' . implode('/', $classPath) . '.php';
|
34 |
-
if (file_exists($filePath)) {
|
35 |
-
require_once ($filePath);
|
36 |
-
}
|
37 |
-
}
|
38 |
spl_autoload_register('google_api_php_client_autoload_gadwp');
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright 2014 Google Inc.
|
5 |
+
*
|
6 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
+
* you may not use this file except in compliance with the License.
|
8 |
+
* You may obtain a copy of the License at
|
9 |
+
*
|
10 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
+
*
|
12 |
+
* Unless required by applicable law or agreed to in writing, software
|
13 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
+
* See the License for the specific language governing permissions and
|
16 |
+
* limitations under the License.
|
17 |
+
*/
|
18 |
+
|
19 |
+
// Exit if accessed directly
|
20 |
+
if (! defined('ABSPATH'))
|
21 |
+
exit();
|
22 |
+
|
23 |
+
function google_api_php_client_autoload_gadwp($className)
|
24 |
+
{
|
25 |
+
$classPath = explode('_', $className);
|
26 |
+
if ($classPath[0] != 'Google') {
|
27 |
+
return;
|
28 |
+
}
|
29 |
+
if (count($classPath) > 3) {
|
30 |
+
// Maximum class file path depth in this project is 3.
|
31 |
+
$classPath = array_slice($classPath, 0, 3);
|
32 |
+
}
|
33 |
+
$filePath = dirname(__FILE__) . '/src/' . implode('/', $classPath) . '.php';
|
34 |
+
if (file_exists($filePath)) {
|
35 |
+
require_once ($filePath);
|
36 |
+
}
|
37 |
+
}
|
38 |
spl_autoload_register('google_api_php_client_autoload_gadwp');
|
tools/gapi.php
CHANGED
@@ -1,862 +1,867 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
if ( ! class_exists( 'GADWP_GAPI_Controller' ) ) {
|
15 |
-
|
16 |
-
final class GADWP_GAPI_Controller {
|
17 |
-
|
18 |
-
public $client;
|
19 |
-
|
20 |
-
public $service;
|
21 |
-
|
22 |
-
public $timeshift;
|
23 |
-
|
24 |
-
public $error_timeout;
|
25 |
-
|
26 |
-
private $managequota;
|
27 |
-
|
28 |
-
private $gadwp;
|
29 |
-
|
30 |
-
private $access = array( '65556128672.apps.googleusercontent.com', 'Kc7888wgbc_JbeCmApbFjnYpwE' );
|
31 |
-
|
32 |
-
public function __construct() {
|
33 |
-
$this->gadwp = GADWP();
|
34 |
-
|
35 |
-
include_once ( GADWP_DIR . 'tools/autoload.php' );
|
36 |
-
$config = new Google_Config();
|
37 |
-
$config->setCacheClass( 'Google_Cache_Null' );
|
38 |
-
if ( function_exists( 'curl_version' ) ) {
|
39 |
-
$curlversion = curl_version();
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
$this->
|
50 |
-
$this->
|
51 |
-
$this->
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
$
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
$
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
$this->
|
80 |
-
}
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
$
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
<tr>
|
156 |
-
<td
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
</
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
}
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
*
|
255 |
-
*
|
256 |
-
*
|
257 |
-
*
|
258 |
-
*
|
259 |
-
*
|
260 |
-
*
|
261 |
-
*
|
262 |
-
*
|
263 |
-
*
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
$this->
|
280 |
-
|
281 |
-
|
282 |
-
$data = $
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
return
|
296 |
-
}
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
*
|
317 |
-
*
|
318 |
-
*
|
319 |
-
*
|
320 |
-
*
|
321 |
-
*
|
322 |
-
*
|
323 |
-
*
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
}
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
$
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
$
|
356 |
-
|
357 |
-
|
358 |
-
$
|
359 |
-
if (
|
360 |
-
|
361 |
-
}
|
362 |
-
$
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
*
|
397 |
-
*
|
398 |
-
*
|
399 |
-
*
|
400 |
-
*
|
401 |
-
*
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
$gadwp_data[
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
*
|
443 |
-
*
|
444 |
-
*
|
445 |
-
*
|
446 |
-
*
|
447 |
-
*
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
|
454 |
-
|
455 |
-
|
456 |
-
$
|
457 |
-
$
|
458 |
-
if (
|
459 |
-
|
460 |
-
}
|
461 |
-
$
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
*
|
475 |
-
*
|
476 |
-
*
|
477 |
-
*
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
$
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
$
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
-
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
-
*
|
505 |
-
*
|
506 |
-
*
|
507 |
-
*
|
508 |
-
*
|
509 |
-
*
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
|
523 |
-
|
524 |
-
}
|
525 |
-
$
|
526 |
-
|
527 |
-
|
528 |
-
|
529 |
-
|
530 |
-
|
531 |
-
|
532 |
-
|
533 |
-
|
534 |
-
|
535 |
-
|
536 |
-
|
537 |
-
|
538 |
-
*
|
539 |
-
*
|
540 |
-
*
|
541 |
-
*
|
542 |
-
*
|
543 |
-
*
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
553 |
-
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
}
|
559 |
-
|
560 |
-
$
|
561 |
-
|
562 |
-
|
563 |
-
}
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
*
|
574 |
-
*
|
575 |
-
*
|
576 |
-
*
|
577 |
-
*
|
578 |
-
*
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
$
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
608 |
-
|
609 |
-
|
610 |
-
|
611 |
-
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
|
629 |
-
*
|
630 |
-
*
|
631 |
-
*
|
632 |
-
*
|
633 |
-
*
|
634 |
-
*
|
635 |
-
*
|
636 |
-
*
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
|
644 |
-
|
645 |
-
$
|
646 |
-
$
|
647 |
-
if (
|
648 |
-
|
649 |
-
}
|
650 |
-
$
|
651 |
-
$
|
652 |
-
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
|
658 |
-
|
659 |
-
|
660 |
-
|
661 |
-
|
662 |
-
|
663 |
-
|
664 |
-
|
665 |
-
*
|
666 |
-
*
|
667 |
-
*
|
668 |
-
*
|
669 |
-
*
|
670 |
-
*
|
671 |
-
*
|
672 |
-
*
|
673 |
-
|
674 |
-
|
675 |
-
|
676 |
-
|
677 |
-
|
678 |
-
|
679 |
-
|
680 |
-
|
681 |
-
|
682 |
-
|
683 |
-
|
684 |
-
|
685 |
-
|
686 |
-
|
687 |
-
|
688 |
-
$options['filters'] = 'ga:
|
689 |
-
}
|
690 |
-
|
691 |
-
|
692 |
-
|
693 |
-
|
694 |
-
|
695 |
-
|
696 |
-
|
697 |
-
}
|
698 |
-
$
|
699 |
-
$
|
700 |
-
$
|
701 |
-
|
702 |
-
|
703 |
-
|
704 |
-
|
705 |
-
|
706 |
-
|
707 |
-
|
708 |
-
|
709 |
-
|
710 |
-
|
711 |
-
|
712 |
-
|
713 |
-
|
714 |
-
}
|
715 |
-
|
716 |
-
|
717 |
-
|
718 |
-
|
719 |
-
|
720 |
-
|
721 |
-
|
722 |
-
|
723 |
-
|
724 |
-
|
725 |
-
*
|
726 |
-
*
|
727 |
-
*
|
728 |
-
*
|
729 |
-
|
730 |
-
|
731 |
-
|
732 |
-
|
733 |
-
|
734 |
-
|
735 |
-
|
736 |
-
$
|
737 |
-
$
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
-
$
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
|
774 |
-
|
775 |
-
$this->
|
776 |
-
|
777 |
-
|
778 |
-
$data = $
|
779 |
-
|
780 |
-
|
781 |
-
|
782 |
-
|
783 |
-
|
784 |
-
|
785 |
-
|
786 |
-
|
787 |
-
|
788 |
-
|
789 |
-
|
790 |
-
|
791 |
-
|
792 |
-
|
793 |
-
|
794 |
-
|
795 |
-
|
796 |
-
|
797 |
-
|
798 |
-
|
799 |
-
|
800 |
-
|
801 |
-
|
802 |
-
|
803 |
-
|
804 |
-
|
805 |
-
|
806 |
-
|
807 |
-
|
808 |
-
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
|
816 |
-
*
|
817 |
-
*
|
818 |
-
*
|
819 |
-
*
|
820 |
-
*
|
821 |
-
*
|
822 |
-
*
|
823 |
-
|
824 |
-
|
825 |
-
|
826 |
-
|
827 |
-
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
|
832 |
-
|
833 |
-
|
834 |
-
|
835 |
-
|
836 |
-
|
837 |
-
|
838 |
-
|
839 |
-
|
840 |
-
|
841 |
-
|
842 |
-
|
843 |
-
|
844 |
-
|
845 |
-
|
846 |
-
|
847 |
-
|
848 |
-
|
849 |
-
|
850 |
-
|
851 |
-
|
852 |
-
|
853 |
-
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
|
860 |
-
|
861 |
-
|
862 |
-
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
if ( ! class_exists( 'GADWP_GAPI_Controller' ) ) {
|
15 |
+
|
16 |
+
final class GADWP_GAPI_Controller {
|
17 |
+
|
18 |
+
public $client;
|
19 |
+
|
20 |
+
public $service;
|
21 |
+
|
22 |
+
public $timeshift;
|
23 |
+
|
24 |
+
public $error_timeout;
|
25 |
+
|
26 |
+
private $managequota;
|
27 |
+
|
28 |
+
private $gadwp;
|
29 |
+
|
30 |
+
private $access = array( '65556128672.apps.googleusercontent.com', 'Kc7888wgbc_JbeCmApbFjnYpwE' );
|
31 |
+
|
32 |
+
public function __construct() {
|
33 |
+
$this->gadwp = GADWP();
|
34 |
+
|
35 |
+
include_once ( GADWP_DIR . 'tools/autoload.php' );
|
36 |
+
$config = new Google_Config();
|
37 |
+
$config->setCacheClass( 'Google_Cache_Null' );
|
38 |
+
if ( function_exists( 'curl_version' ) ) {
|
39 |
+
$curlversion = curl_version();
|
40 |
+
$curl_options = array();
|
41 |
+
if ( isset( $curlversion['version'] ) && ( version_compare( PHP_VERSION, '5.3.0' ) >= 0 ) && version_compare( $curlversion['version'], '7.10.8' ) >= 0 && defined( 'GADWP_IP_VERSION' ) && GADWP_IP_VERSION ) {
|
42 |
+
$curl_options[CURLOPT_IPRESOLVE] = GADWP_IP_VERSION; // Force CURL_IPRESOLVE_V4 or CURL_IPRESOLVE_V6
|
43 |
+
}
|
44 |
+
$curl_options = apply_filters( 'gadwp_curl_options', $curl_options );
|
45 |
+
if ( !empty( $curl_options ) ) {
|
46 |
+
$config->setClassConfig( 'Google_IO_Curl', array( 'options' => $curl_options ) );
|
47 |
+
}
|
48 |
+
}
|
49 |
+
$this->client = new Google_Client( $config );
|
50 |
+
$this->client->setScopes( 'https://www.googleapis.com/auth/analytics.readonly' );
|
51 |
+
$this->client->setAccessType( 'offline' );
|
52 |
+
$this->client->setApplicationName( 'Google Analytics Dashboard' );
|
53 |
+
$this->client->setRedirectUri( 'urn:ietf:wg:oauth:2.0:oob' );
|
54 |
+
$this->set_error_timeout();
|
55 |
+
$this->managequota = 'u' . get_current_user_id() . 's' . get_current_blog_id();
|
56 |
+
$this->access = array_map( array( $this, 'map' ), $this->access );
|
57 |
+
if ( $this->gadwp->config->options['ga_dash_userapi'] ) {
|
58 |
+
$this->client->setClientId( $this->gadwp->config->options['ga_dash_clientid'] );
|
59 |
+
$this->client->setClientSecret( $this->gadwp->config->options['ga_dash_clientsecret'] );
|
60 |
+
} else {
|
61 |
+
$this->client->setClientId( $this->access[0] );
|
62 |
+
$this->client->setClientSecret( $this->access[1] );
|
63 |
+
}
|
64 |
+
$this->service = new Google_Service_Analytics( $this->client );
|
65 |
+
if ( $this->gadwp->config->options['ga_dash_token'] ) {
|
66 |
+
$token = $this->gadwp->config->options['ga_dash_token'];
|
67 |
+
if ( $token ) {
|
68 |
+
try {
|
69 |
+
$this->client->setAccessToken( $token );
|
70 |
+
$gadwp->config->options['ga_dash_token'] = $this->client->getAccessToken();
|
71 |
+
} catch ( Google_IO_Exception $e ) {
|
72 |
+
GADWP_Tools::set_cache( 'ga_dash_lasterror', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $this->error_timeout );
|
73 |
+
} catch ( Google_Service_Exception $e ) {
|
74 |
+
GADWP_Tools::set_cache( 'ga_dash_lasterror', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $this->error_timeout );
|
75 |
+
GADWP_Tools::set_cache( 'ga_dash_gapi_errors', array( $e->getCode(), (array) $e->getErrors() ), $this->error_timeout );
|
76 |
+
$this->reset_token();
|
77 |
+
} catch ( Exception $e ) {
|
78 |
+
GADWP_Tools::set_cache( 'ga_dash_lasterror', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $this->error_timeout );
|
79 |
+
$this->reset_token();
|
80 |
+
}
|
81 |
+
if ( is_multisite() && $this->gadwp->config->options['ga_dash_network'] ) {
|
82 |
+
$this->gadwp->config->set_plugin_options( true );
|
83 |
+
} else {
|
84 |
+
$this->gadwp->config->set_plugin_options();
|
85 |
+
}
|
86 |
+
}
|
87 |
+
}
|
88 |
+
}
|
89 |
+
|
90 |
+
private function set_error_timeout() {
|
91 |
+
$midnight = strtotime( "tomorrow 00:00:00" ); // UTC midnight
|
92 |
+
$midnight = $midnight + 8 * 3600; // UTC 8 AM
|
93 |
+
$this->error_timeout = $midnight - time();
|
94 |
+
return;
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Handles errors returned by GAPI Library
|
99 |
+
*
|
100 |
+
* @return boolean
|
101 |
+
*/
|
102 |
+
public function gapi_errors_handler() {
|
103 |
+
$errors = GADWP_Tools::get_cache( 'gapi_errors' );
|
104 |
+
if ( $errors === false || ! isset( $errors[0] ) ) { // invalid error
|
105 |
+
return false;
|
106 |
+
}
|
107 |
+
if ( isset( $errors[1][0]['reason'] ) && ( $errors[1][0]['reason'] == 'invalidCredentials' || $errors[1][0]['reason'] == 'authError' || $errors[1][0]['reason'] == 'insufficientPermissions' || $errors[1][0]['reason'] == 'required' || $errors[1][0]['reason'] == 'keyExpired' ) ) {
|
108 |
+
$this->reset_token( false );
|
109 |
+
return true;
|
110 |
+
}
|
111 |
+
if ( isset( $errors[1][0]['reason'] ) && ( $errors[1][0]['reason'] == 'userRateLimitExceeded' || $errors[1][0]['reason'] == 'quotaExceeded' ) ) {
|
112 |
+
if ( $this->gadwp->config->options['api_backoff'] <= 5 ) {
|
113 |
+
usleep( rand( 100000, 1500000 ) );
|
114 |
+
$this->gadwp->config->options['api_backoff'] = $this->gadwp->config->options['api_backoff'] + 1;
|
115 |
+
$this->gadwp->config->set_plugin_options();
|
116 |
+
return false;
|
117 |
+
} else {
|
118 |
+
return true;
|
119 |
+
}
|
120 |
+
}
|
121 |
+
if ( $errors[0] == 400 || $errors[0] == 401 || $errors[0] == 403 ) {
|
122 |
+
return true;
|
123 |
+
}
|
124 |
+
return false;
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Calculates proper timeouts for each GAPI query
|
129 |
+
*
|
130 |
+
* @param
|
131 |
+
* $daily
|
132 |
+
* @return number
|
133 |
+
*/
|
134 |
+
public function get_timeouts( $daily ) {
|
135 |
+
$local_time = time() + $this->timeshift;
|
136 |
+
if ( $daily ) {
|
137 |
+
$nextday = explode( '-', date( 'n-j-Y', strtotime( ' +1 day', $local_time ) ) );
|
138 |
+
$midnight = mktime( 0, 0, 0, $nextday[0], $nextday[1], $nextday[2] );
|
139 |
+
return $midnight - $local_time;
|
140 |
+
} else {
|
141 |
+
$nexthour = explode( '-', date( 'H-n-j-Y', strtotime( ' +1 hour', $local_time ) ) );
|
142 |
+
$newhour = mktime( $nexthour[0], 0, 0, $nexthour[1], $nexthour[2], $nexthour[3] );
|
143 |
+
return $newhour - $local_time;
|
144 |
+
}
|
145 |
+
}
|
146 |
+
|
147 |
+
/**
|
148 |
+
* Generates and retrieves the Access Code
|
149 |
+
*/
|
150 |
+
public function token_request() {
|
151 |
+
$authUrl = $this->client->createAuthUrl();
|
152 |
+
?>
|
153 |
+
<form name="input" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>" method="post">
|
154 |
+
<table class="gadwp-settings-options">
|
155 |
+
<tr>
|
156 |
+
<td colspan="2" class="gadwp-settings-info">
|
157 |
+
<?php echo __( "Use this link to get your access code:", 'google-analytics-dashboard-for-wp' ) . ' <a href="' . $authUrl . '" id="gapi-access-code" target="_blank">' . __ ( "Get Access Code", 'google-analytics-dashboard-for-wp' ) . '</a>.'; ?>
|
158 |
+
</td>
|
159 |
+
</tr>
|
160 |
+
<tr>
|
161 |
+
<td class="gadwp-settings-title"><label for="ga_dash_code" title="<?php _e("Use the red link to get your access code!",'google-analytics-dashboard-for-wp')?>"><?php echo _e( "Access Code:", 'google-analytics-dashboard-for-wp' ); ?></label></td>
|
162 |
+
<td><input type="text" id="ga_dash_code" name="ga_dash_code" value="" size="61" required="required" title="<?php _e("Use the red link to get your access code!",'google-analytics-dashboard-for-wp')?>"></td>
|
163 |
+
</tr>
|
164 |
+
<tr>
|
165 |
+
<td colspan="2"><hr></td>
|
166 |
+
</tr>
|
167 |
+
<tr>
|
168 |
+
<td colspan="2"><input type="submit" class="button button-secondary" name="ga_dash_authorize" value="<?php _e( "Save Access Code", 'google-analytics-dashboard-for-wp' ); ?>" /></td>
|
169 |
+
</tr>
|
170 |
+
</table>
|
171 |
+
</form>
|
172 |
+
<?php
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Retrieves all Google Analytics Views with details
|
177 |
+
*
|
178 |
+
* @return array
|
179 |
+
*/
|
180 |
+
public function refresh_profiles() {
|
181 |
+
try {
|
182 |
+
|
183 |
+
$ga_dash_profile_list = array();
|
184 |
+
$startindex = 1;
|
185 |
+
$totalresults = 65535; // use something big
|
186 |
+
|
187 |
+
while ( $startindex < $totalresults ) {
|
188 |
+
|
189 |
+
$profiles = $this->service->management_profiles->listManagementProfiles( '~all', '~all', array( 'start-index' => $startindex ) );
|
190 |
+
|
191 |
+
$items = $profiles->getItems();
|
192 |
+
|
193 |
+
$totalresults = $profiles->getTotalResults();
|
194 |
+
|
195 |
+
if ( $totalresults > 0 ) {
|
196 |
+
|
197 |
+
foreach ( $items as $profile ) {
|
198 |
+
$timetz = new DateTimeZone( $profile->getTimezone() );
|
199 |
+
$localtime = new DateTime( 'now', $timetz );
|
200 |
+
$timeshift = strtotime( $localtime->format( 'Y-m-d H:i:s' ) ) - time();
|
201 |
+
$ga_dash_profile_list[] = array( $profile->getName(), $profile->getId(), $profile->getwebPropertyId(), $profile->getwebsiteUrl(), $timeshift, $profile->getTimezone(), $profile->getDefaultPage() );
|
202 |
+
$startindex++;
|
203 |
+
}
|
204 |
+
}
|
205 |
+
}
|
206 |
+
|
207 |
+
if ( empty( $ga_dash_profile_list ) ) {
|
208 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': No properties were found in this account!', $this->error_timeout );
|
209 |
+
} else {
|
210 |
+
GADWP_Tools::delete_cache( 'last_error' );
|
211 |
+
}
|
212 |
+
return $ga_dash_profile_list;
|
213 |
+
} catch ( Google_IO_Exception $e ) {
|
214 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $this->error_timeout );
|
215 |
+
return $ga_dash_profile_list;
|
216 |
+
} catch ( Google_Service_Exception $e ) {
|
217 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $this->error_timeout );
|
218 |
+
GADWP_Tools::set_cache( 'gapi_errors', array( $e->getCode(), (array) $e->getErrors() ), $this->error_timeout );
|
219 |
+
} catch ( Exception $e ) {
|
220 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $this->error_timeout );
|
221 |
+
return $ga_dash_profile_list;
|
222 |
+
}
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
* Handles the token reset process
|
227 |
+
*
|
228 |
+
* @param
|
229 |
+
* $all
|
230 |
+
*/
|
231 |
+
public function reset_token( $all = true ) {
|
232 |
+
$this->gadwp->config->options['ga_dash_token'] = "";
|
233 |
+
if ( $all ) {
|
234 |
+
$this->gadwp->config->options['ga_dash_tableid_jail'] = "";
|
235 |
+
$this->gadwp->config->options['ga_dash_profile_list'] = array();
|
236 |
+
try {
|
237 |
+
$this->client->revokeToken();
|
238 |
+
} catch ( Exception $e ) {
|
239 |
+
if ( is_multisite() && $this->gadwp->config->options['ga_dash_network'] ) {
|
240 |
+
$this->gadwp->config->set_plugin_options( true );
|
241 |
+
} else {
|
242 |
+
$this->gadwp->config->set_plugin_options();
|
243 |
+
}
|
244 |
+
}
|
245 |
+
}
|
246 |
+
if ( is_multisite() && $this->gadwp->config->options['ga_dash_network'] ) {
|
247 |
+
$this->gadwp->config->set_plugin_options( true );
|
248 |
+
} else {
|
249 |
+
$this->gadwp->config->set_plugin_options();
|
250 |
+
}
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Get and cache Core Reports
|
255 |
+
*
|
256 |
+
* @param
|
257 |
+
* $projecId
|
258 |
+
* @param
|
259 |
+
* $from
|
260 |
+
* @param
|
261 |
+
* $to
|
262 |
+
* @param
|
263 |
+
* $metrics
|
264 |
+
* @param
|
265 |
+
* $options
|
266 |
+
* @param
|
267 |
+
* $serial
|
268 |
+
* @return int|Google_Service_Analytics_GaData
|
269 |
+
*/
|
270 |
+
private function handle_corereports( $projectId, $from, $to, $metrics, $options, $serial ) {
|
271 |
+
try {
|
272 |
+
if ( $from == "today" ) {
|
273 |
+
$timeouts = 0;
|
274 |
+
} else {
|
275 |
+
$timeouts = 1;
|
276 |
+
}
|
277 |
+
$transient = GADWP_Tools::get_cache( $serial );
|
278 |
+
if ( $transient === false ) {
|
279 |
+
if ( $this->gapi_errors_handler() ) {
|
280 |
+
return - 23;
|
281 |
+
}
|
282 |
+
$data = $this->service->data_ga->get( 'ga:' . $projectId, $from, $to, $metrics, $options );
|
283 |
+
GADWP_Tools::set_cache( $serial, $data, $this->get_timeouts( $timeouts ) );
|
284 |
+
$this->gadwp->config->options['api_backoff'] = 0;
|
285 |
+
$this->gadwp->config->set_plugin_options();
|
286 |
+
} else {
|
287 |
+
$data = $transient;
|
288 |
+
}
|
289 |
+
} catch ( Google_Service_Exception $e ) {
|
290 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $this->error_timeout );
|
291 |
+
GADWP_Tools::set_cache( 'gapi_errors', array( $e->getCode(), (array) $e->getErrors() ), $this->error_timeout );
|
292 |
+
return $e->getCode();
|
293 |
+
} catch ( Exception $e ) {
|
294 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $this->error_timeout );
|
295 |
+
return $e->getCode();
|
296 |
+
}
|
297 |
+
if ( $data->getRows() > 0 ) {
|
298 |
+
return $data;
|
299 |
+
} else {
|
300 |
+
return - 21;
|
301 |
+
}
|
302 |
+
}
|
303 |
+
|
304 |
+
/**
|
305 |
+
* Generates serials for transients
|
306 |
+
*
|
307 |
+
* @param
|
308 |
+
* $serial
|
309 |
+
* @return string
|
310 |
+
*/
|
311 |
+
public function get_serial( $serial ) {
|
312 |
+
return sprintf( "%u", crc32( $serial ) );
|
313 |
+
}
|
314 |
+
|
315 |
+
/**
|
316 |
+
* Analytics data for Area Charts (Admin Dashboard Widget report)
|
317 |
+
*
|
318 |
+
* @param
|
319 |
+
* $projectId
|
320 |
+
* @param
|
321 |
+
* $from
|
322 |
+
* @param
|
323 |
+
* $to
|
324 |
+
* @param
|
325 |
+
* $query
|
326 |
+
* @param
|
327 |
+
* $filter
|
328 |
+
* @return array|int
|
329 |
+
*/
|
330 |
+
private function get_areachart_data( $projectId, $from, $to, $query, $filter = '' ) {
|
331 |
+
switch ( $query ) {
|
332 |
+
case 'users' :
|
333 |
+
$title = __( "Users", 'google-analytics-dashboard-for-wp' );
|
334 |
+
break;
|
335 |
+
case 'pageviews' :
|
336 |
+
$title = __( "Page Views", 'google-analytics-dashboard-for-wp' );
|
337 |
+
break;
|
338 |
+
case 'visitBounceRate' :
|
339 |
+
$title = __( "Bounce Rate", 'google-analytics-dashboard-for-wp' );
|
340 |
+
break;
|
341 |
+
case 'organicSearches' :
|
342 |
+
$title = __( "Organic Searches", 'google-analytics-dashboard-for-wp' );
|
343 |
+
break;
|
344 |
+
default :
|
345 |
+
$title = __( "Sessions", 'google-analytics-dashboard-for-wp' );
|
346 |
+
}
|
347 |
+
$metrics = 'ga:' . $query;
|
348 |
+
if ( $from == "today" || $from == "yesterday" ) {
|
349 |
+
$dimensions = 'ga:hour';
|
350 |
+
$dayorhour = __( "Hour", 'google-analytics-dashboard-for-wp' );
|
351 |
+
} else if ( $from == "365daysAgo" || $from == "1095daysAgo" ) {
|
352 |
+
$dimensions = 'ga:yearMonth, ga:month';
|
353 |
+
$dayorhour = __( "Date", 'google-analytics-dashboard-for-wp' );
|
354 |
+
} else {
|
355 |
+
$dimensions = 'ga:date,ga:dayOfWeekName';
|
356 |
+
$dayorhour = __( "Date", 'google-analytics-dashboard-for-wp' );
|
357 |
+
}
|
358 |
+
$options = array( 'dimensions' => $dimensions, 'quotaUser' => $this->managequota . 'p' . $projectId );
|
359 |
+
if ( $filter ) {
|
360 |
+
$options['filters'] = 'ga:pagePath==' . $filter;
|
361 |
+
}
|
362 |
+
$serial = 'qr2_' . $this->get_serial( $projectId . $from . $metrics . $filter );
|
363 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
364 |
+
if ( is_numeric( $data ) ) {
|
365 |
+
return $data;
|
366 |
+
}
|
367 |
+
$gadwp_data = array( array( $dayorhour, $title ) );
|
368 |
+
if ( $from == "today" || $from == "yesterday" ) {
|
369 |
+
foreach ( $data->getRows() as $row ) {
|
370 |
+
$gadwp_data[] = array( (int) $row[0] . ':00', round( $row[1], 2 ) );
|
371 |
+
}
|
372 |
+
} else if ( $from == "365daysAgo" || $from == "1095daysAgo" ) {
|
373 |
+
foreach ( $data->getRows() as $row ) {
|
374 |
+
/*
|
375 |
+
* translators:
|
376 |
+
* Example: 'F, Y' will become 'November, 2015'
|
377 |
+
* For details see: http://php.net/manual/en/function.date.php#refsect1-function.date-parameters
|
378 |
+
*/
|
379 |
+
$gadwp_data[] = array( date_i18n( __( 'F, Y', 'google-analytics-dashboard-for-wp' ), strtotime( $row[0] . '01' ) ), round( $row[2], 2 ) );
|
380 |
+
}
|
381 |
+
} else {
|
382 |
+
foreach ( $data->getRows() as $row ) {
|
383 |
+
/*
|
384 |
+
* translators:
|
385 |
+
* Example: 'l, F j, Y' will become 'Thusday, November 17, 2015'
|
386 |
+
* For details see: http://php.net/manual/en/function.date.php#refsect1-function.date-parameters
|
387 |
+
*/
|
388 |
+
$gadwp_data[] = array( date_i18n( __( 'l, F j, Y', 'google-analytics-dashboard-for-wp' ), strtotime( $row[0] ) ), round( $row[2], 2 ) );
|
389 |
+
}
|
390 |
+
}
|
391 |
+
|
392 |
+
return $gadwp_data;
|
393 |
+
}
|
394 |
+
|
395 |
+
/**
|
396 |
+
* Analytics data for Bottom Stats (bottom stats on main report)
|
397 |
+
*
|
398 |
+
* @param
|
399 |
+
* $projectId
|
400 |
+
* @param
|
401 |
+
* $from
|
402 |
+
* @param
|
403 |
+
* $to
|
404 |
+
* @param
|
405 |
+
* $filter
|
406 |
+
* @return array|int
|
407 |
+
*/
|
408 |
+
private function get_bottomstats( $projectId, $from, $to, $filter = '' ) {
|
409 |
+
$options = array( 'dimensions' => null, 'quotaUser' => $this->managequota . 'p' . $projectId );
|
410 |
+
if ( $filter ) {
|
411 |
+
$options['filters'] = 'ga:pagePath==' . $filter;
|
412 |
+
$metrics = 'ga:sessions,ga:users,ga:pageviews,ga:BounceRate,ga:organicSearches,ga:pageviewsPerSession';
|
413 |
+
} else {
|
414 |
+
$metrics = 'ga:sessions,ga:users,ga:pageviews,ga:BounceRate,ga:organicSearches,ga:pageviewsPerSession';
|
415 |
+
}
|
416 |
+
$serial = 'qr3_' . $this->get_serial( $projectId . $from . $filter );
|
417 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
418 |
+
if ( is_numeric( $data ) ) {
|
419 |
+
if ( $data == - 21 ) {
|
420 |
+
return array_fill( 0, 6, 0 );
|
421 |
+
} else {
|
422 |
+
return $data;
|
423 |
+
}
|
424 |
+
}
|
425 |
+
$gadwp_data = array();
|
426 |
+
foreach ( $data->getRows() as $row ) {
|
427 |
+
$gadwp_data = array_map( 'floatval', $row );
|
428 |
+
}
|
429 |
+
|
430 |
+
// i18n support
|
431 |
+
$gadwp_data[0] = number_format_i18n( $gadwp_data[0] );
|
432 |
+
$gadwp_data[1] = number_format_i18n( $gadwp_data[1] );
|
433 |
+
$gadwp_data[2] = number_format_i18n( $gadwp_data[2] );
|
434 |
+
$gadwp_data[3] = number_format_i18n( $gadwp_data[3], 2 );
|
435 |
+
$gadwp_data[4] = number_format_i18n( $gadwp_data[4] );
|
436 |
+
$gadwp_data[5] = number_format_i18n( $gadwp_data[5], 2 );
|
437 |
+
|
438 |
+
return $gadwp_data;
|
439 |
+
}
|
440 |
+
|
441 |
+
/**
|
442 |
+
* Analytics data for Org Charts & Table Charts (content pages)
|
443 |
+
*
|
444 |
+
* @param
|
445 |
+
* $projectId
|
446 |
+
* @param
|
447 |
+
* $from
|
448 |
+
* @param
|
449 |
+
* $to
|
450 |
+
* @param
|
451 |
+
* $filter
|
452 |
+
* @return array|int
|
453 |
+
*/
|
454 |
+
private function get_contentpages( $projectId, $from, $to, $filter = '' ) {
|
455 |
+
$metrics = 'ga:sessions';
|
456 |
+
$dimensions = 'ga:pageTitle';
|
457 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
458 |
+
if ( $filter ) {
|
459 |
+
$options['filters'] = 'ga:pagePath==' . $filter;
|
460 |
+
}
|
461 |
+
$serial = 'qr4_' . $this->get_serial( $projectId . $from . $filter );
|
462 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
463 |
+
if ( is_numeric( $data ) ) {
|
464 |
+
return $data;
|
465 |
+
}
|
466 |
+
$gadwp_data = array( array( __( "Pages", 'google-analytics-dashboard-for-wp' ), __( "Sessions", 'google-analytics-dashboard-for-wp' ) ) );
|
467 |
+
foreach ( $data->getRows() as $row ) {
|
468 |
+
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
|
469 |
+
}
|
470 |
+
return $gadwp_data;
|
471 |
+
}
|
472 |
+
|
473 |
+
/**
|
474 |
+
* Analytics data for 404 Errors
|
475 |
+
*
|
476 |
+
* @param
|
477 |
+
* $projectId
|
478 |
+
* @param
|
479 |
+
* $from
|
480 |
+
* @param
|
481 |
+
* $to
|
482 |
+
* @return array|int
|
483 |
+
*/
|
484 |
+
private function get_404errors( $projectId, $from, $to, $filter = "Page Not Found" ) {
|
485 |
+
$metrics = 'ga:sessions';
|
486 |
+
$dimensions = 'ga:pagePath,ga:fullReferrer';
|
487 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
488 |
+
$options['filters'] = 'ga:pageTitle=@' . $filter;
|
489 |
+
$serial = 'qr4_' . $this->get_serial( $projectId . $from . $filter );
|
490 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
491 |
+
if ( is_numeric( $data ) ) {
|
492 |
+
return $data;
|
493 |
+
}
|
494 |
+
$gadwp_data = array( array( __( "404 Errors", 'google-analytics-dashboard-for-wp' ), __( "Sessions", 'google-analytics-dashboard-for-wp' ) ) );
|
495 |
+
foreach ( $data->getRows() as $row ) {
|
496 |
+
$path = esc_html( $row[0] );
|
497 |
+
$source = esc_html( $row[1] );
|
498 |
+
$gadwp_data[] = array( "<strong>" . __( "URI:", 'google-analytics-dashboard-for-wp' ) . "</strong> " . $path . "<br><strong>" . __( "Source:", 'google-analytics-dashboard-for-wp' ) . "</strong> " . $source, (int) $row[2] );
|
499 |
+
}
|
500 |
+
return $gadwp_data;
|
501 |
+
}
|
502 |
+
|
503 |
+
/**
|
504 |
+
* Analytics data for Org Charts & Table Charts (referrers)
|
505 |
+
*
|
506 |
+
* @param
|
507 |
+
* $projectId
|
508 |
+
* @param
|
509 |
+
* $from
|
510 |
+
* @param
|
511 |
+
* $to
|
512 |
+
* @param
|
513 |
+
* $filter
|
514 |
+
* @return array|int
|
515 |
+
*/
|
516 |
+
private function get_referrers( $projectId, $from, $to, $filter = '' ) {
|
517 |
+
$metrics = 'ga:sessions';
|
518 |
+
$dimensions = 'ga:source';
|
519 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
520 |
+
if ( $filter ) {
|
521 |
+
$options['filters'] = 'ga:medium==referral;ga:pagePath==' . $filter;
|
522 |
+
} else {
|
523 |
+
$options['filters'] = 'ga:medium==referral';
|
524 |
+
}
|
525 |
+
$serial = 'qr5_' . $this->get_serial( $projectId . $from . $filter );
|
526 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
527 |
+
if ( is_numeric( $data ) ) {
|
528 |
+
return $data;
|
529 |
+
}
|
530 |
+
$gadwp_data = array( array( __( "Referrers", 'google-analytics-dashboard-for-wp' ), __( "Sessions", 'google-analytics-dashboard-for-wp' ) ) );
|
531 |
+
foreach ( $data->getRows() as $row ) {
|
532 |
+
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
|
533 |
+
}
|
534 |
+
return $gadwp_data;
|
535 |
+
}
|
536 |
+
|
537 |
+
/**
|
538 |
+
* Analytics data for Org Charts & Table Charts (searches)
|
539 |
+
*
|
540 |
+
* @param
|
541 |
+
* $projectId
|
542 |
+
* @param
|
543 |
+
* $from
|
544 |
+
* @param
|
545 |
+
* $to
|
546 |
+
* @param
|
547 |
+
* $filter
|
548 |
+
* @return array|int
|
549 |
+
*/
|
550 |
+
private function get_searches( $projectId, $from, $to, $filter = '' ) {
|
551 |
+
$metrics = 'ga:sessions';
|
552 |
+
$dimensions = 'ga:keyword';
|
553 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
554 |
+
if ( $filter ) {
|
555 |
+
$options['filters'] = 'ga:keyword!=(not set);ga:pagePath==' . $filter;
|
556 |
+
} else {
|
557 |
+
$options['filters'] = 'ga:keyword!=(not set)';
|
558 |
+
}
|
559 |
+
$serial = 'qr6_' . $this->get_serial( $projectId . $from . $filter );
|
560 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
561 |
+
if ( is_numeric( $data ) ) {
|
562 |
+
return $data;
|
563 |
+
}
|
564 |
+
|
565 |
+
$gadwp_data = array( array( __( "Searches", 'google-analytics-dashboard-for-wp' ), __( "Sessions", 'google-analytics-dashboard-for-wp' ) ) );
|
566 |
+
foreach ( $data->getRows() as $row ) {
|
567 |
+
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
|
568 |
+
}
|
569 |
+
return $gadwp_data;
|
570 |
+
}
|
571 |
+
|
572 |
+
/**
|
573 |
+
* Analytics data for Org Charts & Table Charts (location reports)
|
574 |
+
*
|
575 |
+
* @param
|
576 |
+
* $projectId
|
577 |
+
* @param
|
578 |
+
* $from
|
579 |
+
* @param
|
580 |
+
* $to
|
581 |
+
* @param
|
582 |
+
* $filter
|
583 |
+
* @return array|int
|
584 |
+
*/
|
585 |
+
private function get_locations( $projectId, $from, $to, $filter = '' ) {
|
586 |
+
$metrics = 'ga:sessions';
|
587 |
+
$options = "";
|
588 |
+
$title = __( "Countries", 'google-analytics-dashboard-for-wp' );
|
589 |
+
$serial = 'qr7_' . $this->get_serial( $projectId . $from . $filter );
|
590 |
+
$dimensions = 'ga:country';
|
591 |
+
$local_filter = '';
|
592 |
+
if ( $this->gadwp->config->options['ga_target_geomap'] ) {
|
593 |
+
$dimensions = 'ga:city, ga:region';
|
594 |
+
|
595 |
+
$country_codes = GADWP_Tools::get_countrycodes();
|
596 |
+
if ( isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
|
597 |
+
$local_filter = 'ga:country==' . ( $country_codes[$this->gadwp->config->options['ga_target_geomap']] );
|
598 |
+
$title = __( "Cities from", 'google-analytics-dashboard-for-wp' ) . ' ' . __( $country_codes[$this->gadwp->config->options['ga_target_geomap']] );
|
599 |
+
$serial = 'qr7_' . $this->get_serial( $projectId . $from . $this->gadwp->config->options['ga_target_geomap'] . $filter );
|
600 |
+
}
|
601 |
+
}
|
602 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
603 |
+
if ( $filter ) {
|
604 |
+
$options['filters'] = 'ga:pagePath==' . $filter;
|
605 |
+
if ( $local_filter ) {
|
606 |
+
$options['filters'] .= ';' . $local_filter;
|
607 |
+
}
|
608 |
+
} else {
|
609 |
+
if ( $local_filter ) {
|
610 |
+
$options['filters'] = $local_filter;
|
611 |
+
}
|
612 |
+
}
|
613 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
614 |
+
if ( is_numeric( $data ) ) {
|
615 |
+
return $data;
|
616 |
+
}
|
617 |
+
$gadwp_data = array( array( $title, __( "Sessions", 'google-analytics-dashboard-for-wp' ) ) );
|
618 |
+
foreach ( $data->getRows() as $row ) {
|
619 |
+
if ( isset( $row[2] ) ) {
|
620 |
+
$gadwp_data[] = array( esc_html( $row[0] ) . ', ' . esc_html( $row[1] ), (int) $row[2] );
|
621 |
+
} else {
|
622 |
+
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
|
623 |
+
}
|
624 |
+
}
|
625 |
+
return $gadwp_data;
|
626 |
+
}
|
627 |
+
|
628 |
+
/**
|
629 |
+
* Analytics data for Org Charts (traffic channels, device categories)
|
630 |
+
*
|
631 |
+
* @param
|
632 |
+
* $projectId
|
633 |
+
* @param
|
634 |
+
* $from
|
635 |
+
* @param
|
636 |
+
* $to
|
637 |
+
* @param
|
638 |
+
* $query
|
639 |
+
* @param
|
640 |
+
* $filter
|
641 |
+
* @return array|int
|
642 |
+
*/
|
643 |
+
private function get_orgchart_data( $projectId, $from, $to, $query, $filter = '' ) {
|
644 |
+
$metrics = 'ga:sessions';
|
645 |
+
$dimensions = 'ga:' . $query;
|
646 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
647 |
+
if ( $filter ) {
|
648 |
+
$options['filters'] = 'ga:pagePath==' . $filter;
|
649 |
+
}
|
650 |
+
$serial = 'qr8_' . $this->get_serial( $projectId . $from . $query . $filter );
|
651 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
652 |
+
if ( is_numeric( $data ) ) {
|
653 |
+
return $data;
|
654 |
+
}
|
655 |
+
$block = ( $query == 'channelGrouping' ) ? __( "Channels", 'google-analytics-dashboard-for-wp' ) : __( "Devices", 'google-analytics-dashboard-for-wp' );
|
656 |
+
$gadwp_data = array( array( '<div style="color:black; font-size:1.1em">' . $block . '</div><div style="color:darkblue; font-size:1.2em">' . (int) $data['totalsForAllResults']["ga:sessions"] . '</div>', "" ) );
|
657 |
+
foreach ( $data->getRows() as $row ) {
|
658 |
+
$shrink = explode( " ", $row[0] );
|
659 |
+
$gadwp_data[] = array( '<div style="color:black; font-size:1.1em">' . esc_html( $shrink[0] ) . '</div><div style="color:darkblue; font-size:1.2em">' . (int) $row[1] . '</div>', '<div style="color:black; font-size:1.1em">' . $block . '</div><div style="color:darkblue; font-size:1.2em">' . (int) $data['totalsForAllResults']["ga:sessions"] . '</div>' );
|
660 |
+
}
|
661 |
+
return $gadwp_data;
|
662 |
+
}
|
663 |
+
|
664 |
+
/**
|
665 |
+
* Analytics data for Pie Charts (traffic mediums, serach engines, social networks, browsers, screen rsolutions, etc.)
|
666 |
+
*
|
667 |
+
* @param
|
668 |
+
* $projectId
|
669 |
+
* @param
|
670 |
+
* $from
|
671 |
+
* @param
|
672 |
+
* $to
|
673 |
+
* @param
|
674 |
+
* $query
|
675 |
+
* @param
|
676 |
+
* $filter
|
677 |
+
* @return array|int
|
678 |
+
*/
|
679 |
+
private function get_piechart_data( $projectId, $from, $to, $query, $filter = '' ) {
|
680 |
+
$metrics = 'ga:sessions';
|
681 |
+
$dimensions = 'ga:' . $query;
|
682 |
+
|
683 |
+
if ( $query == 'source' ) {
|
684 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
685 |
+
if ( $filter ) {
|
686 |
+
$options['filters'] = 'ga:medium==organic;ga:keyword!=(not set);ga:pagePath==' . $filter;
|
687 |
+
} else {
|
688 |
+
$options['filters'] = 'ga:medium==organic;ga:keyword!=(not set)';
|
689 |
+
}
|
690 |
+
} else {
|
691 |
+
$options = array( 'dimensions' => $dimensions, 'sort' => '-ga:sessions', 'quotaUser' => $this->managequota . 'p' . $projectId );
|
692 |
+
if ( $filter ) {
|
693 |
+
$options['filters'] = 'ga:' . $query . '!=(not set);ga:pagePath==' . $filter;
|
694 |
+
} else {
|
695 |
+
$options['filters'] = 'ga:' . $query . '!=(not set)';
|
696 |
+
}
|
697 |
+
}
|
698 |
+
$serial = 'qr10_' . $this->get_serial( $projectId . $from . $query . $filter );
|
699 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
700 |
+
if ( is_numeric( $data ) ) {
|
701 |
+
return $data;
|
702 |
+
}
|
703 |
+
$gadwp_data = array( array( __( "Type", 'google-analytics-dashboard-for-wp' ), __( "Sessions", 'google-analytics-dashboard-for-wp' ) ) );
|
704 |
+
$i = 0;
|
705 |
+
$included = 0;
|
706 |
+
foreach ( $data->getRows() as $row ) {
|
707 |
+
if ( $i < 20 ) {
|
708 |
+
$gadwp_data[] = array( str_replace( "(none)", "direct", esc_html( $row[0] ) ), (int) $row[1] );
|
709 |
+
$included += $row[1];
|
710 |
+
$i++;
|
711 |
+
} else {
|
712 |
+
break;
|
713 |
+
}
|
714 |
+
}
|
715 |
+
$totals = $data->getTotalsForAllResults();
|
716 |
+
$others = $totals['ga:sessions'] - $included;
|
717 |
+
if ( $others > 0 ) {
|
718 |
+
$gadwp_data[] = array( __( 'Other', 'google-analytics-dashboard-for-wp' ), $others );
|
719 |
+
}
|
720 |
+
|
721 |
+
return $gadwp_data;
|
722 |
+
}
|
723 |
+
|
724 |
+
/**
|
725 |
+
* Analytics data for Frontend Widget (chart data and totals)
|
726 |
+
*
|
727 |
+
* @param
|
728 |
+
* $projectId
|
729 |
+
* @param
|
730 |
+
* $period
|
731 |
+
* @param
|
732 |
+
* $anonim
|
733 |
+
* @return array|int
|
734 |
+
*/
|
735 |
+
public function frontend_widget_stats( $projectId, $from, $anonim ) {
|
736 |
+
$content = '';
|
737 |
+
$to = 'yesterday';
|
738 |
+
$metrics = 'ga:sessions';
|
739 |
+
$dimensions = 'ga:date,ga:dayOfWeekName';
|
740 |
+
$options = array( 'dimensions' => $dimensions, 'quotaUser' => $this->managequota . 'p' . $projectId );
|
741 |
+
$serial = 'qr2_' . $this->get_serial( $projectId . $from . $metrics );
|
742 |
+
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
|
743 |
+
if ( is_numeric( $data ) ) {
|
744 |
+
return $data;
|
745 |
+
}
|
746 |
+
$gadwp_data = array( array( __( "Date", 'google-analytics-dashboard-for-wp' ), __( "Sessions", 'google-analytics-dashboard-for-wp' ) ) );
|
747 |
+
if ( $anonim ) {
|
748 |
+
$max_array = array();
|
749 |
+
foreach ( $data->getRows() as $item ) {
|
750 |
+
$max_array[] = $item[2];
|
751 |
+
}
|
752 |
+
$max = max( $max_array ) ? max( $max_array ) : 1;
|
753 |
+
}
|
754 |
+
foreach ( $data->getRows() as $row ) {
|
755 |
+
$gadwp_data[] = array( date_i18n( __( 'l, F j, Y', 'google-analytics-dashboard-for-wp' ), strtotime( $row[0] ) ), ( $anonim ? round( $row[2] * 100 / $max, 2 ) : (int) $row[2] ) );
|
756 |
+
}
|
757 |
+
$totals = $data->getTotalsForAllResults();
|
758 |
+
return array( $gadwp_data, $anonim ? 0 : number_format_i18n( $totals['ga:sessions'] ) );
|
759 |
+
}
|
760 |
+
|
761 |
+
/**
|
762 |
+
* Analytics data for Realtime component (the real-time report)
|
763 |
+
*
|
764 |
+
* @param
|
765 |
+
* $projectId
|
766 |
+
* @return array|int
|
767 |
+
*/
|
768 |
+
private function get_realtime( $projectId ) {
|
769 |
+
$metrics = 'rt:activeUsers';
|
770 |
+
$dimensions = 'rt:pagePath,rt:source,rt:keyword,rt:trafficType,rt:visitorType,rt:pageTitle';
|
771 |
+
try {
|
772 |
+
$serial = 'qr_realtimecache_' . $this->get_serial( $projectId );
|
773 |
+
$transient = GADWP_Tools::get_cache( $serial );
|
774 |
+
if ( $transient === false ) {
|
775 |
+
if ( $this->gapi_errors_handler() ) {
|
776 |
+
return - 23;
|
777 |
+
}
|
778 |
+
$data = $this->service->data_realtime->get( 'ga:' . $projectId, $metrics, array( 'dimensions' => $dimensions, 'quotaUser' => $this->managequota . 'p' . $projectId ) );
|
779 |
+
GADWP_Tools::set_cache( $serial, $data, 55 );
|
780 |
+
$this->gadwp->config->options['api_backoff'] = 0;
|
781 |
+
$this->gadwp->config->set_plugin_options();
|
782 |
+
} else {
|
783 |
+
$data = $transient;
|
784 |
+
}
|
785 |
+
} catch ( Google_Service_Exception $e ) {
|
786 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( "(" . $e->getCode() . ") " . $e->getMessage() ), $this->error_timeout );
|
787 |
+
GADWP_Tools::set_cache( 'gapi_errors', array( $e->getCode(), (array) $e->getErrors() ), $this->error_timeout );
|
788 |
+
return $e->getCode();
|
789 |
+
} catch ( Exception $e ) {
|
790 |
+
GADWP_Tools::set_cache( 'last_error', date( 'Y-m-d H:i:s' ) . ': ' . esc_html( $e ), $this->error_timeout );
|
791 |
+
return $e->getCode();
|
792 |
+
}
|
793 |
+
if ( $data->getRows() < 1 ) {
|
794 |
+
return - 21;
|
795 |
+
}
|
796 |
+
$i = 0;
|
797 |
+
$gadwp_data = $data;
|
798 |
+
foreach ( $data->getRows() as $row ) {
|
799 |
+
$gadwp_data->rows[$i] = array_map( 'esc_html', $row );
|
800 |
+
$i++;
|
801 |
+
}
|
802 |
+
return array( $gadwp_data );
|
803 |
+
}
|
804 |
+
|
805 |
+
private function map( $map ) {
|
806 |
+
$map = explode( '.', $map );
|
807 |
+
if ( isset( $map[1] ) ) {
|
808 |
+
$map[0] += ord( 'map' );
|
809 |
+
return implode( '.', $map );
|
810 |
+
} else {
|
811 |
+
return str_ireplace( 'map', chr( 112 ), $map[0] );
|
812 |
+
}
|
813 |
+
}
|
814 |
+
|
815 |
+
/**
|
816 |
+
* Handles ajax requests and calls the needed methods
|
817 |
+
* @param
|
818 |
+
* $projectId
|
819 |
+
* @param
|
820 |
+
* $query
|
821 |
+
* @param
|
822 |
+
* $from
|
823 |
+
* @param
|
824 |
+
* $to
|
825 |
+
* @param
|
826 |
+
* $filter
|
827 |
+
* @return number|Google_Service_Analytics_GaData
|
828 |
+
*/
|
829 |
+
public function get( $projectId, $query, $from = false, $to = false, $filter = '' ) {
|
830 |
+
if ( empty( $projectId ) || ! is_numeric( $projectId ) ) {
|
831 |
+
wp_die( - 26 );
|
832 |
+
}
|
833 |
+
if ( in_array( $query, array( 'sessions', 'users', 'organicSearches', 'visitBounceRate', 'pageviews') ) ) {
|
834 |
+
return $this->get_areachart_data( $projectId, $from, $to, $query, $filter );
|
835 |
+
}
|
836 |
+
if ( $query == 'bottomstats' ) {
|
837 |
+
return $this->get_bottomstats( $projectId, $from, $to, $filter );
|
838 |
+
}
|
839 |
+
if ( $query == 'locations' ) {
|
840 |
+
return $this->get_locations( $projectId, $from, $to, $filter );
|
841 |
+
}
|
842 |
+
if ( $query == 'referrers' ) {
|
843 |
+
return $this->get_referrers( $projectId, $from, $to, $filter );
|
844 |
+
}
|
845 |
+
if ( $query == 'contentpages' ) {
|
846 |
+
return $this->get_contentpages( $projectId, $from, $to, $filter );
|
847 |
+
}
|
848 |
+
if ( $query == '404errors' ) {
|
849 |
+
$filter = $this->gadwp->config->options['pagetitle_404'];
|
850 |
+
return $this->get_404errors( $projectId, $from, $to, $filter );
|
851 |
+
}
|
852 |
+
if ( $query == 'searches' ) {
|
853 |
+
return $this->get_searches( $projectId, $from, $to, $filter );
|
854 |
+
}
|
855 |
+
if ( $query == 'realtime' ) {
|
856 |
+
return $this->get_realtime( $projectId );
|
857 |
+
}
|
858 |
+
if ( $query == 'channelGrouping' || $query == 'deviceCategory' ) {
|
859 |
+
return $this->get_orgchart_data( $projectId, $from, $to, $query, $filter );
|
860 |
+
}
|
861 |
+
if ( in_array( $query, array( 'medium', 'visitorType', 'socialNetwork', 'source', 'browser', 'operatingSystem', 'screenResolution', 'mobileDeviceBranding' ) ) ) {
|
862 |
+
return $this->get_piechart_data( $projectId, $from, $to, $query, $filter );
|
863 |
+
}
|
864 |
+
wp_die( - 27 );
|
865 |
+
}
|
866 |
+
}
|
867 |
+
}
|
tools/iso3166.php
CHANGED
@@ -1,255 +1,255 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Author: Alin Marcu
|
4 |
-
* Author URI: https://deconf.com
|
5 |
-
* Copyright 2013 Alin Marcu
|
6 |
-
* License: GPLv2 or later
|
7 |
-
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) )
|
12 |
-
exit();
|
13 |
-
|
14 |
-
/* @formatter:off */
|
15 |
-
$country_codes = array(
|
16 |
-
'AD' => 'Andorra',
|
17 |
-
'AE' => 'United Arab Emirates',
|
18 |
-
'AF' => 'Afghanistan',
|
19 |
-
'AG' => 'Antigua and Barbuda',
|
20 |
-
'AI' => 'Anguilla',
|
21 |
-
'AL' => 'Albania',
|
22 |
-
'AM' => 'Armenia',
|
23 |
-
'AN' => 'Netherlands Antilles',
|
24 |
-
'AO' => 'Angola',
|
25 |
-
'AQ' => 'Antarctica',
|
26 |
-
'AR' => 'Argentina',
|
27 |
-
'AS' => 'American Samoa',
|
28 |
-
'AT' => 'Austria',
|
29 |
-
'AU' => 'Australia',
|
30 |
-
'AW' => 'Aruba',
|
31 |
-
'AZ' => 'Azerbaijan',
|
32 |
-
'BA' => 'Bosnia and Herzegovina',
|
33 |
-
'BB' => 'Barbados',
|
34 |
-
'BD' => 'Bangladesh',
|
35 |
-
'BE' => 'Belgium',
|
36 |
-
'BF' => 'Burkina Faso',
|
37 |
-
'BG' => 'Bulgaria',
|
38 |
-
'BH' => 'Bahrain',
|
39 |
-
'BI' => 'Burundi',
|
40 |
-
'BJ' => 'Benin',
|
41 |
-
'BM' => 'Bermuda',
|
42 |
-
'BN' => 'Brunei',
|
43 |
-
'BO' => 'Bolivia',
|
44 |
-
'BR' => 'Brazil',
|
45 |
-
'BS' => 'Bahamas',
|
46 |
-
'BT' => 'Bhutan',
|
47 |
-
'BV' => 'Bouvet Island',
|
48 |
-
'BW' => 'Botswana',
|
49 |
-
'BY' => 'Belarus',
|
50 |
-
'BZ' => 'Belize',
|
51 |
-
'CA' => 'Canada',
|
52 |
-
'CC' => 'Cocos (Keeling) Islands',
|
53 |
-
'CD' => 'Congo, The Democratic Republic of the',
|
54 |
-
'CF' => 'Central African Republic',
|
55 |
-
'CG' => 'Congo',
|
56 |
-
'CH' => 'Switzerland',
|
57 |
-
'CI' => 'C�te d?Ivoire',
|
58 |
-
'CK' => 'Cook Islands',
|
59 |
-
'CL' => 'Chile',
|
60 |
-
'CM' => 'Cameroon',
|
61 |
-
'CN' => 'China',
|
62 |
-
'CO' => 'Colombia',
|
63 |
-
'CR' => 'Costa Rica',
|
64 |
-
'CU' => 'Cuba',
|
65 |
-
'CV' => 'Cape Verde',
|
66 |
-
'CX' => 'Christmas Island',
|
67 |
-
'CY' => 'Cyprus',
|
68 |
-
'CZ' => 'Czech Republic',
|
69 |
-
'DE' => 'Germany',
|
70 |
-
'DJ' => 'Djibouti',
|
71 |
-
'DK' => 'Denmark',
|
72 |
-
'DM' => 'Dominica',
|
73 |
-
'DO' => 'Dominican Republic',
|
74 |
-
'DZ' => 'Algeria',
|
75 |
-
'EC' => 'Ecuador',
|
76 |
-
'EE' => 'Estonia',
|
77 |
-
'EG' => 'Egypt',
|
78 |
-
'EH' => 'Western Sahara',
|
79 |
-
'ER' => 'Eritrea',
|
80 |
-
'ES' => 'Spain',
|
81 |
-
'ET' => 'Ethiopia',
|
82 |
-
'FI' => 'Finland',
|
83 |
-
'FJ' => 'Fiji Islands',
|
84 |
-
'FK' => 'Falkland Islands',
|
85 |
-
'FM' => 'Micronesia, Federated States of',
|
86 |
-
'FO' => 'Faroe Islands',
|
87 |
-
'FR' => 'France',
|
88 |
-
'GA' => 'Gabon',
|
89 |
-
'GB' => 'United Kingdom',
|
90 |
-
'GD' => 'Grenada',
|
91 |
-
'GE' => 'Georgia',
|
92 |
-
'GF' => 'French Guiana',
|
93 |
-
'GH' => 'Ghana',
|
94 |
-
'GI' => 'Gibraltar',
|
95 |
-
'GL' => 'Greenland',
|
96 |
-
'GM' => 'Gambia',
|
97 |
-
'GN' => 'Guinea',
|
98 |
-
'GP' => 'Guadeloupe',
|
99 |
-
'GQ' => 'Equatorial Guinea',
|
100 |
-
'GR' => 'Greece',
|
101 |
-
'GS' => 'South Georgia and the South Sandwich Islands',
|
102 |
-
'GT' => 'Guatemala',
|
103 |
-
'GU' => 'Guam',
|
104 |
-
'GW' => 'Guinea-Bissau',
|
105 |
-
'GY' => 'Guyana',
|
106 |
-
'HK' => 'Hong Kong',
|
107 |
-
'HM' => 'Heard Island and McDonald Islands',
|
108 |
-
'HN' => 'Honduras',
|
109 |
-
'HR' => 'Croatia',
|
110 |
-
'HT' => 'Haiti',
|
111 |
-
'HU' => 'Hungary',
|
112 |
-
'ID' => 'Indonesia',
|
113 |
-
'IE' => 'Ireland',
|
114 |
-
'IL' => 'Israel',
|
115 |
-
'IN' => 'India',
|
116 |
-
'IO' => 'British Indian Ocean Territory',
|
117 |
-
'IQ' => 'Iraq',
|
118 |
-
'IR' => 'Iran',
|
119 |
-
'IS' => 'Iceland',
|
120 |
-
'IT' => 'Italy',
|
121 |
-
'JM' => 'Jamaica',
|
122 |
-
'JO' => 'Jordan',
|
123 |
-
'JP' => 'Japan',
|
124 |
-
'KE' => 'Kenya',
|
125 |
-
'KG' => 'Kyrgyzstan',
|
126 |
-
'KH' => 'Cambodia',
|
127 |
-
'KI' => 'Kiribati',
|
128 |
-
'KM' => 'Comoros',
|
129 |
-
'KN' => 'Saint Kitts and Nevis',
|
130 |
-
'KP' => 'North Korea',
|
131 |
-
'KR' => 'South Korea',
|
132 |
-
'KW' => 'Kuwait',
|
133 |
-
'KY' => 'Cayman Islands',
|
134 |
-
'KZ' => 'Kazakstan',
|
135 |
-
'LA' => 'Laos',
|
136 |
-
'LB' => 'Lebanon',
|
137 |
-
'LC' => 'Saint Lucia',
|
138 |
-
'LI' => 'Liechtenstein',
|
139 |
-
'LK' => 'Sri Lanka',
|
140 |
-
'LR' => 'Liberia',
|
141 |
-
'LS' => 'Lesotho',
|
142 |
-
'LT' => 'Lithuania',
|
143 |
-
'LU' => 'Luxembourg',
|
144 |
-
'LV' => 'Latvia',
|
145 |
-
'LY' => 'Libyan Arab Jamahiriya',
|
146 |
-
'MA' => 'Morocco',
|
147 |
-
'MC' => 'Monaco',
|
148 |
-
'MD' => 'Moldova',
|
149 |
-
'MG' => 'Madagascar',
|
150 |
-
'MH' => 'Marshall Islands',
|
151 |
-
'MK' => 'Macedonia',
|
152 |
-
'ML' => 'Mali',
|
153 |
-
'MM' => 'Myanmar',
|
154 |
-
'MN' => 'Mongolia',
|
155 |
-
'MO' => 'Macao',
|
156 |
-
'MP' => 'Northern Mariana Islands',
|
157 |
-
'MQ' => 'Martinique',
|
158 |
-
'MR' => 'Mauritania',
|
159 |
-
'MS' => 'Montserrat',
|
160 |
-
'MT' => 'Malta',
|
161 |
-
'MU' => 'Mauritius',
|
162 |
-
'MV' => 'Maldives',
|
163 |
-
'MW' => 'Malawi',
|
164 |
-
'MX' => 'Mexico',
|
165 |
-
'MY' => 'Malaysia',
|
166 |
-
'MZ' => 'Mozambique',
|
167 |
-
'NA' => 'Namibia',
|
168 |
-
'NC' => 'New Caledonia',
|
169 |
-
'NE' => 'Niger',
|
170 |
-
'NF' => 'Norfolk Island',
|
171 |
-
'NG' => 'Nigeria',
|
172 |
-
'NI' => 'Nicaragua',
|
173 |
-
'NL' => 'Netherlands',
|
174 |
-
'NO' => 'Norway',
|
175 |
-
'NP' => 'Nepal',
|
176 |
-
'NR' => 'Nauru',
|
177 |
-
'NU' => 'Niue',
|
178 |
-
'NZ' => 'New Zealand',
|
179 |
-
'OM' => 'Oman',
|
180 |
-
'PA' => 'Panama',
|
181 |
-
'PE' => 'Peru',
|
182 |
-
'PF' => 'French Polynesia',
|
183 |
-
'PG' => 'Papua New Guinea',
|
184 |
-
'PH' => 'Philippines',
|
185 |
-
'PK' => 'Pakistan',
|
186 |
-
'PL' => 'Poland',
|
187 |
-
'PM' => 'Saint Pierre and Miquelon',
|
188 |
-
'PN' => 'Pitcairn',
|
189 |
-
'PR' => 'Puerto Rico',
|
190 |
-
'PS' => 'Palestine',
|
191 |
-
'PT' => 'Portugal',
|
192 |
-
'PW' => 'Palau',
|
193 |
-
'PY' => 'Paraguay',
|
194 |
-
'QA' => 'Qatar',
|
195 |
-
'RE' => 'Reunion',
|
196 |
-
'RO' => 'Romania',
|
197 |
-
'RU' => 'Russia',
|
198 |
-
'RW' => 'Rwanda',
|
199 |
-
'SA' => 'Saudi Arabia',
|
200 |
-
'SB' => 'Solomon Islands',
|
201 |
-
'SC' => 'Seychelles',
|
202 |
-
'SD' => 'Sudan',
|
203 |
-
'SE' => 'Sweden',
|
204 |
-
'SG' => 'Singapore',
|
205 |
-
'SH' => 'Saint Helena',
|
206 |
-
'SI' => 'Slovenia',
|
207 |
-
'SJ' => 'Svalbard and Jan Mayen',
|
208 |
-
'SK' => 'Slovakia',
|
209 |
-
'SL' => 'Sierra Leone',
|
210 |
-
'SM' => 'San Marino',
|
211 |
-
'SN' => 'Senegal',
|
212 |
-
'SO' => 'Somalia',
|
213 |
-
'SR' => 'Suriname',
|
214 |
-
'ST' => 'Sao Tome and Principe',
|
215 |
-
'SV' => 'El Salvador',
|
216 |
-
'SY' => 'Syria',
|
217 |
-
'SZ' => 'Swaziland',
|
218 |
-
'TC' => 'Turks and Caicos Islands',
|
219 |
-
'TD' => 'Chad',
|
220 |
-
'TF' => 'French Southern territories',
|
221 |
-
'TG' => 'Togo',
|
222 |
-
'TH' => 'Thailand',
|
223 |
-
'TJ' => 'Tajikistan',
|
224 |
-
'TK' => 'Tokelau',
|
225 |
-
'TM' => 'Turkmenistan',
|
226 |
-
'TN' => 'Tunisia',
|
227 |
-
'TO' => 'Tonga',
|
228 |
-
'TP' => 'East Timor',
|
229 |
-
'TR' => 'Turkey',
|
230 |
-
'TT' => 'Trinidad and Tobago',
|
231 |
-
'TV' => 'Tuvalu',
|
232 |
-
'TW' => 'Taiwan',
|
233 |
-
'TZ' => 'Tanzania',
|
234 |
-
'UA' => 'Ukraine',
|
235 |
-
'UG' => 'Uganda',
|
236 |
-
'UM' => 'United States Minor Outlying Islands',
|
237 |
-
'US' => 'United States',
|
238 |
-
'UY' => 'Uruguay',
|
239 |
-
'UZ' => 'Uzbekistan',
|
240 |
-
'VA' => 'Holy See (Vatican City State)',
|
241 |
-
'VC' => 'Saint Vincent and the Grenadines',
|
242 |
-
'VE' => 'Venezuela',
|
243 |
-
'VG' => 'Virgin Islands, British',
|
244 |
-
'VI' => 'Virgin Islands, U.S.',
|
245 |
-
'VN' => 'Vietnam',
|
246 |
-
'VU' => 'Vanuatu',
|
247 |
-
'WF' => 'Wallis and Futuna',
|
248 |
-
'WS' => 'Samoa',
|
249 |
-
'YE' => 'Yemen',
|
250 |
-
'YT' => 'Mayotte',
|
251 |
-
'YU' => 'Yugoslavia',
|
252 |
-
'ZA' => 'South Africa',
|
253 |
-
'ZM' => 'Zambia',
|
254 |
-
'ZW' => 'Zimbabwe' );
|
255 |
/* @formatter:on */
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Author: Alin Marcu
|
4 |
+
* Author URI: https://deconf.com
|
5 |
+
* Copyright 2013 Alin Marcu
|
6 |
+
* License: GPLv2 or later
|
7 |
+
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) )
|
12 |
+
exit();
|
13 |
+
|
14 |
+
/* @formatter:off */
|
15 |
+
$country_codes = array(
|
16 |
+
'AD' => 'Andorra',
|
17 |
+
'AE' => 'United Arab Emirates',
|
18 |
+
'AF' => 'Afghanistan',
|
19 |
+
'AG' => 'Antigua and Barbuda',
|
20 |
+
'AI' => 'Anguilla',
|
21 |
+
'AL' => 'Albania',
|
22 |
+
'AM' => 'Armenia',
|
23 |
+
'AN' => 'Netherlands Antilles',
|
24 |
+
'AO' => 'Angola',
|
25 |
+
'AQ' => 'Antarctica',
|
26 |
+
'AR' => 'Argentina',
|
27 |
+
'AS' => 'American Samoa',
|
28 |
+
'AT' => 'Austria',
|
29 |
+
'AU' => 'Australia',
|
30 |
+
'AW' => 'Aruba',
|
31 |
+
'AZ' => 'Azerbaijan',
|
32 |
+
'BA' => 'Bosnia and Herzegovina',
|
33 |
+
'BB' => 'Barbados',
|
34 |
+
'BD' => 'Bangladesh',
|
35 |
+
'BE' => 'Belgium',
|
36 |
+
'BF' => 'Burkina Faso',
|
37 |
+
'BG' => 'Bulgaria',
|
38 |
+
'BH' => 'Bahrain',
|
39 |
+
'BI' => 'Burundi',
|
40 |
+
'BJ' => 'Benin',
|
41 |
+
'BM' => 'Bermuda',
|
42 |
+
'BN' => 'Brunei',
|
43 |
+
'BO' => 'Bolivia',
|
44 |
+
'BR' => 'Brazil',
|
45 |
+
'BS' => 'Bahamas',
|
46 |
+
'BT' => 'Bhutan',
|
47 |
+
'BV' => 'Bouvet Island',
|
48 |
+
'BW' => 'Botswana',
|
49 |
+
'BY' => 'Belarus',
|
50 |
+
'BZ' => 'Belize',
|
51 |
+
'CA' => 'Canada',
|
52 |
+
'CC' => 'Cocos (Keeling) Islands',
|
53 |
+
'CD' => 'Congo, The Democratic Republic of the',
|
54 |
+
'CF' => 'Central African Republic',
|
55 |
+
'CG' => 'Congo',
|
56 |
+
'CH' => 'Switzerland',
|
57 |
+
'CI' => 'C�te d?Ivoire',
|
58 |
+
'CK' => 'Cook Islands',
|
59 |
+
'CL' => 'Chile',
|
60 |
+
'CM' => 'Cameroon',
|
61 |
+
'CN' => 'China',
|
62 |
+
'CO' => 'Colombia',
|
63 |
+
'CR' => 'Costa Rica',
|
64 |
+
'CU' => 'Cuba',
|
65 |
+
'CV' => 'Cape Verde',
|
66 |
+
'CX' => 'Christmas Island',
|
67 |
+
'CY' => 'Cyprus',
|
68 |
+
'CZ' => 'Czech Republic',
|
69 |
+
'DE' => 'Germany',
|
70 |
+
'DJ' => 'Djibouti',
|
71 |
+
'DK' => 'Denmark',
|
72 |
+
'DM' => 'Dominica',
|
73 |
+
'DO' => 'Dominican Republic',
|
74 |
+
'DZ' => 'Algeria',
|
75 |
+
'EC' => 'Ecuador',
|
76 |
+
'EE' => 'Estonia',
|
77 |
+
'EG' => 'Egypt',
|
78 |
+
'EH' => 'Western Sahara',
|
79 |
+
'ER' => 'Eritrea',
|
80 |
+
'ES' => 'Spain',
|
81 |
+
'ET' => 'Ethiopia',
|
82 |
+
'FI' => 'Finland',
|
83 |
+
'FJ' => 'Fiji Islands',
|
84 |
+
'FK' => 'Falkland Islands',
|
85 |
+
'FM' => 'Micronesia, Federated States of',
|
86 |
+
'FO' => 'Faroe Islands',
|
87 |
+
'FR' => 'France',
|
88 |
+
'GA' => 'Gabon',
|
89 |
+
'GB' => 'United Kingdom',
|
90 |
+
'GD' => 'Grenada',
|
91 |
+
'GE' => 'Georgia',
|
92 |
+
'GF' => 'French Guiana',
|
93 |
+
'GH' => 'Ghana',
|
94 |
+
'GI' => 'Gibraltar',
|
95 |
+
'GL' => 'Greenland',
|
96 |
+
'GM' => 'Gambia',
|
97 |
+
'GN' => 'Guinea',
|
98 |
+
'GP' => 'Guadeloupe',
|
99 |
+
'GQ' => 'Equatorial Guinea',
|
100 |
+
'GR' => 'Greece',
|
101 |
+
'GS' => 'South Georgia and the South Sandwich Islands',
|
102 |
+
'GT' => 'Guatemala',
|
103 |
+
'GU' => 'Guam',
|
104 |
+
'GW' => 'Guinea-Bissau',
|
105 |
+
'GY' => 'Guyana',
|
106 |
+
'HK' => 'Hong Kong',
|
107 |
+
'HM' => 'Heard Island and McDonald Islands',
|
108 |
+
'HN' => 'Honduras',
|
109 |
+
'HR' => 'Croatia',
|
110 |
+
'HT' => 'Haiti',
|
111 |
+
'HU' => 'Hungary',
|
112 |
+
'ID' => 'Indonesia',
|
113 |
+
'IE' => 'Ireland',
|
114 |
+
'IL' => 'Israel',
|
115 |
+
'IN' => 'India',
|
116 |
+
'IO' => 'British Indian Ocean Territory',
|
117 |
+
'IQ' => 'Iraq',
|
118 |
+
'IR' => 'Iran',
|
119 |
+
'IS' => 'Iceland',
|
120 |
+
'IT' => 'Italy',
|
121 |
+
'JM' => 'Jamaica',
|
122 |
+
'JO' => 'Jordan',
|
123 |
+
'JP' => 'Japan',
|
124 |
+
'KE' => 'Kenya',
|
125 |
+
'KG' => 'Kyrgyzstan',
|
126 |
+
'KH' => 'Cambodia',
|
127 |
+
'KI' => 'Kiribati',
|
128 |
+
'KM' => 'Comoros',
|
129 |
+
'KN' => 'Saint Kitts and Nevis',
|
130 |
+
'KP' => 'North Korea',
|
131 |
+
'KR' => 'South Korea',
|
132 |
+
'KW' => 'Kuwait',
|
133 |
+
'KY' => 'Cayman Islands',
|
134 |
+
'KZ' => 'Kazakstan',
|
135 |
+
'LA' => 'Laos',
|
136 |
+
'LB' => 'Lebanon',
|
137 |
+
'LC' => 'Saint Lucia',
|
138 |
+
'LI' => 'Liechtenstein',
|
139 |
+
'LK' => 'Sri Lanka',
|
140 |
+
'LR' => 'Liberia',
|
141 |
+
'LS' => 'Lesotho',
|
142 |
+
'LT' => 'Lithuania',
|
143 |
+
'LU' => 'Luxembourg',
|
144 |
+
'LV' => 'Latvia',
|
145 |
+
'LY' => 'Libyan Arab Jamahiriya',
|
146 |
+
'MA' => 'Morocco',
|
147 |
+
'MC' => 'Monaco',
|
148 |
+
'MD' => 'Moldova',
|
149 |
+
'MG' => 'Madagascar',
|
150 |
+
'MH' => 'Marshall Islands',
|
151 |
+
'MK' => 'Macedonia',
|
152 |
+
'ML' => 'Mali',
|
153 |
+
'MM' => 'Myanmar',
|
154 |
+
'MN' => 'Mongolia',
|
155 |
+
'MO' => 'Macao',
|
156 |
+
'MP' => 'Northern Mariana Islands',
|
157 |
+
'MQ' => 'Martinique',
|
158 |
+
'MR' => 'Mauritania',
|
159 |
+
'MS' => 'Montserrat',
|
160 |
+
'MT' => 'Malta',
|
161 |
+
'MU' => 'Mauritius',
|
162 |
+
'MV' => 'Maldives',
|
163 |
+
'MW' => 'Malawi',
|
164 |
+
'MX' => 'Mexico',
|
165 |
+
'MY' => 'Malaysia',
|
166 |
+
'MZ' => 'Mozambique',
|
167 |
+
'NA' => 'Namibia',
|
168 |
+
'NC' => 'New Caledonia',
|
169 |
+
'NE' => 'Niger',
|
170 |
+
'NF' => 'Norfolk Island',
|
171 |
+
'NG' => 'Nigeria',
|
172 |
+
'NI' => 'Nicaragua',
|
173 |
+
'NL' => 'Netherlands',
|
174 |
+
'NO' => 'Norway',
|
175 |
+
'NP' => 'Nepal',
|
176 |
+
'NR' => 'Nauru',
|
177 |
+
'NU' => 'Niue',
|
178 |
+
'NZ' => 'New Zealand',
|
179 |
+
'OM' => 'Oman',
|
180 |
+
'PA' => 'Panama',
|
181 |
+
'PE' => 'Peru',
|
182 |
+
'PF' => 'French Polynesia',
|
183 |
+
'PG' => 'Papua New Guinea',
|
184 |
+
'PH' => 'Philippines',
|
185 |
+
'PK' => 'Pakistan',
|
186 |
+
'PL' => 'Poland',
|
187 |
+
'PM' => 'Saint Pierre and Miquelon',
|
188 |
+
'PN' => 'Pitcairn',
|
189 |
+
'PR' => 'Puerto Rico',
|
190 |
+
'PS' => 'Palestine',
|
191 |
+
'PT' => 'Portugal',
|
192 |
+
'PW' => 'Palau',
|
193 |
+
'PY' => 'Paraguay',
|
194 |
+
'QA' => 'Qatar',
|
195 |
+
'RE' => 'Reunion',
|
196 |
+
'RO' => 'Romania',
|
197 |
+
'RU' => 'Russia',
|
198 |
+
'RW' => 'Rwanda',
|
199 |
+
'SA' => 'Saudi Arabia',
|
200 |
+
'SB' => 'Solomon Islands',
|
201 |
+
'SC' => 'Seychelles',
|
202 |
+
'SD' => 'Sudan',
|
203 |
+
'SE' => 'Sweden',
|
204 |
+
'SG' => 'Singapore',
|
205 |
+
'SH' => 'Saint Helena',
|
206 |
+
'SI' => 'Slovenia',
|
207 |
+
'SJ' => 'Svalbard and Jan Mayen',
|
208 |
+
'SK' => 'Slovakia',
|
209 |
+
'SL' => 'Sierra Leone',
|
210 |
+
'SM' => 'San Marino',
|
211 |
+
'SN' => 'Senegal',
|
212 |
+
'SO' => 'Somalia',
|
213 |
+
'SR' => 'Suriname',
|
214 |
+
'ST' => 'Sao Tome and Principe',
|
215 |
+
'SV' => 'El Salvador',
|
216 |
+
'SY' => 'Syria',
|
217 |
+
'SZ' => 'Swaziland',
|
218 |
+
'TC' => 'Turks and Caicos Islands',
|
219 |
+
'TD' => 'Chad',
|
220 |
+
'TF' => 'French Southern territories',
|
221 |
+
'TG' => 'Togo',
|
222 |
+
'TH' => 'Thailand',
|
223 |
+
'TJ' => 'Tajikistan',
|
224 |
+
'TK' => 'Tokelau',
|
225 |
+
'TM' => 'Turkmenistan',
|
226 |
+
'TN' => 'Tunisia',
|
227 |
+
'TO' => 'Tonga',
|
228 |
+
'TP' => 'East Timor',
|
229 |
+
'TR' => 'Turkey',
|
230 |
+
'TT' => 'Trinidad and Tobago',
|
231 |
+
'TV' => 'Tuvalu',
|
232 |
+
'TW' => 'Taiwan',
|
233 |
+
'TZ' => 'Tanzania',
|
234 |
+
'UA' => 'Ukraine',
|
235 |
+
'UG' => 'Uganda',
|
236 |
+
'UM' => 'United States Minor Outlying Islands',
|
237 |
+
'US' => 'United States',
|
238 |
+
'UY' => 'Uruguay',
|
239 |
+
'UZ' => 'Uzbekistan',
|
240 |
+
'VA' => 'Holy See (Vatican City State)',
|
241 |
+
'VC' => 'Saint Vincent and the Grenadines',
|
242 |
+
'VE' => 'Venezuela',
|
243 |
+
'VG' => 'Virgin Islands, British',
|
244 |
+
'VI' => 'Virgin Islands, U.S.',
|
245 |
+
'VN' => 'Vietnam',
|
246 |
+
'VU' => 'Vanuatu',
|
247 |
+
'WF' => 'Wallis and Futuna',
|
248 |
+
'WS' => 'Samoa',
|
249 |
+
'YE' => 'Yemen',
|
250 |
+
'YT' => 'Mayotte',
|
251 |
+
'YU' => 'Yugoslavia',
|
252 |
+
'ZA' => 'South Africa',
|
253 |
+
'ZM' => 'Zambia',
|
254 |
+
'ZW' => 'Zimbabwe' );
|
255 |
/* @formatter:on */
|
tools/src/Google/Auth/Abstract.php
CHANGED
@@ -1,40 +1,40 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Abstract class for the Authentication in the API client
|
21 |
-
*
|
22 |
-
* @author Chris Chabot <chabotc@google.com>
|
23 |
-
*
|
24 |
-
*/
|
25 |
-
abstract class Google_Auth_Abstract
|
26 |
-
{
|
27 |
-
|
28 |
-
/**
|
29 |
-
* An utility function that first calls $this->auth->sign($request) and then
|
30 |
-
* executes makeRequest() on that signed request.
|
31 |
-
* Used for when a request
|
32 |
-
* should be authenticated
|
33 |
-
*
|
34 |
-
* @param Google_Http_Request $request
|
35 |
-
* @return Google_Http_Request $request
|
36 |
-
*/
|
37 |
-
abstract public function authenticatedRequest(Google_Http_Request $request);
|
38 |
-
|
39 |
-
abstract public function sign(Google_Http_Request $request);
|
40 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Abstract class for the Authentication in the API client
|
21 |
+
*
|
22 |
+
* @author Chris Chabot <chabotc@google.com>
|
23 |
+
*
|
24 |
+
*/
|
25 |
+
abstract class Google_Auth_Abstract
|
26 |
+
{
|
27 |
+
|
28 |
+
/**
|
29 |
+
* An utility function that first calls $this->auth->sign($request) and then
|
30 |
+
* executes makeRequest() on that signed request.
|
31 |
+
* Used for when a request
|
32 |
+
* should be authenticated
|
33 |
+
*
|
34 |
+
* @param Google_Http_Request $request
|
35 |
+
* @return Google_Http_Request $request
|
36 |
+
*/
|
37 |
+
abstract public function authenticatedRequest(Google_Http_Request $request);
|
38 |
+
|
39 |
+
abstract public function sign(Google_Http_Request $request);
|
40 |
}
|
tools/src/Google/Auth/AppIdentity.php
CHANGED
@@ -1,101 +1,101 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
/*
|
18 |
-
* WARNING - this class depends on the Google App Engine PHP library
|
19 |
-
* which is 5.3 and above only, so if you include this in a PHP 5.2
|
20 |
-
* setup or one without 5.3 things will blow up.
|
21 |
-
*/
|
22 |
-
use google\appengine\api\app_identity\AppIdentityService;
|
23 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
24 |
-
|
25 |
-
/**
|
26 |
-
* Authentication via the Google App Engine App Identity service.
|
27 |
-
*/
|
28 |
-
class Google_Auth_AppIdentity extends Google_Auth_Abstract
|
29 |
-
{
|
30 |
-
|
31 |
-
const CACHE_PREFIX = "Google_Auth_AppIdentity::";
|
32 |
-
|
33 |
-
private $key = null;
|
34 |
-
|
35 |
-
private $client;
|
36 |
-
|
37 |
-
private $token = false;
|
38 |
-
|
39 |
-
private $tokenScopes = false;
|
40 |
-
|
41 |
-
public function __construct(Google_Client $client, $config = null)
|
42 |
-
{
|
43 |
-
$this->client = $client;
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Retrieve an access token for the scopes supplied.
|
48 |
-
*/
|
49 |
-
public function authenticateForScope($scopes)
|
50 |
-
{
|
51 |
-
if ($this->token && $this->tokenScopes == $scopes) {
|
52 |
-
return $this->token;
|
53 |
-
}
|
54 |
-
$cacheKey = self::CACHE_PREFIX;
|
55 |
-
if (is_string($scopes)) {
|
56 |
-
$cacheKey .= $scopes;
|
57 |
-
} else
|
58 |
-
if (is_array($scopes)) {
|
59 |
-
$cacheKey .= implode(":", $scopes);
|
60 |
-
}
|
61 |
-
$this->token = $this->client->getCache()->get($cacheKey);
|
62 |
-
if (! $this->token) {
|
63 |
-
$this->token = AppIdentityService::getAccessToken($scopes);
|
64 |
-
if ($this->token) {
|
65 |
-
$this->client->getCache()->set($cacheKey, $this->token);
|
66 |
-
}
|
67 |
-
}
|
68 |
-
$this->tokenScopes = $scopes;
|
69 |
-
return $this->token;
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
* Perform an authenticated / signed apiHttpRequest.
|
74 |
-
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
75 |
-
* (which can modify the request in what ever way fits the auth mechanism)
|
76 |
-
* and then calls apiCurlIO::makeRequest on the signed request
|
77 |
-
*
|
78 |
-
* @param Google_Http_Request $request
|
79 |
-
* @return Google_Http_Request The resulting HTTP response including the
|
80 |
-
* responseHttpCode, responseHeaders and responseBody.
|
81 |
-
*/
|
82 |
-
public function authenticatedRequest(Google_Http_Request $request)
|
83 |
-
{
|
84 |
-
$request = $this->sign($request);
|
85 |
-
return $this->client->getIo()->makeRequest($request);
|
86 |
-
}
|
87 |
-
|
88 |
-
public function sign(Google_Http_Request $request)
|
89 |
-
{
|
90 |
-
if (! $this->token) {
|
91 |
-
// No token, so nothing to do.
|
92 |
-
return $request;
|
93 |
-
}
|
94 |
-
$this->client->getLogger()->debug('App Identity authentication');
|
95 |
-
// Add the OAuth2 header to the request
|
96 |
-
$request->setRequestHeaders(array(
|
97 |
-
'Authorization' => 'Bearer ' . $this->token['access_token']
|
98 |
-
));
|
99 |
-
return $request;
|
100 |
-
}
|
101 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
/*
|
18 |
+
* WARNING - this class depends on the Google App Engine PHP library
|
19 |
+
* which is 5.3 and above only, so if you include this in a PHP 5.2
|
20 |
+
* setup or one without 5.3 things will blow up.
|
21 |
+
*/
|
22 |
+
use google\appengine\api\app_identity\AppIdentityService;
|
23 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Authentication via the Google App Engine App Identity service.
|
27 |
+
*/
|
28 |
+
class Google_Auth_AppIdentity extends Google_Auth_Abstract
|
29 |
+
{
|
30 |
+
|
31 |
+
const CACHE_PREFIX = "Google_Auth_AppIdentity::";
|
32 |
+
|
33 |
+
private $key = null;
|
34 |
+
|
35 |
+
private $client;
|
36 |
+
|
37 |
+
private $token = false;
|
38 |
+
|
39 |
+
private $tokenScopes = false;
|
40 |
+
|
41 |
+
public function __construct(Google_Client $client, $config = null)
|
42 |
+
{
|
43 |
+
$this->client = $client;
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Retrieve an access token for the scopes supplied.
|
48 |
+
*/
|
49 |
+
public function authenticateForScope($scopes)
|
50 |
+
{
|
51 |
+
if ($this->token && $this->tokenScopes == $scopes) {
|
52 |
+
return $this->token;
|
53 |
+
}
|
54 |
+
$cacheKey = self::CACHE_PREFIX;
|
55 |
+
if (is_string($scopes)) {
|
56 |
+
$cacheKey .= $scopes;
|
57 |
+
} else
|
58 |
+
if (is_array($scopes)) {
|
59 |
+
$cacheKey .= implode(":", $scopes);
|
60 |
+
}
|
61 |
+
$this->token = $this->client->getCache()->get($cacheKey);
|
62 |
+
if (! $this->token) {
|
63 |
+
$this->token = AppIdentityService::getAccessToken($scopes);
|
64 |
+
if ($this->token) {
|
65 |
+
$this->client->getCache()->set($cacheKey, $this->token);
|
66 |
+
}
|
67 |
+
}
|
68 |
+
$this->tokenScopes = $scopes;
|
69 |
+
return $this->token;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Perform an authenticated / signed apiHttpRequest.
|
74 |
+
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
75 |
+
* (which can modify the request in what ever way fits the auth mechanism)
|
76 |
+
* and then calls apiCurlIO::makeRequest on the signed request
|
77 |
+
*
|
78 |
+
* @param Google_Http_Request $request
|
79 |
+
* @return Google_Http_Request The resulting HTTP response including the
|
80 |
+
* responseHttpCode, responseHeaders and responseBody.
|
81 |
+
*/
|
82 |
+
public function authenticatedRequest(Google_Http_Request $request)
|
83 |
+
{
|
84 |
+
$request = $this->sign($request);
|
85 |
+
return $this->client->getIo()->makeRequest($request);
|
86 |
+
}
|
87 |
+
|
88 |
+
public function sign(Google_Http_Request $request)
|
89 |
+
{
|
90 |
+
if (! $this->token) {
|
91 |
+
// No token, so nothing to do.
|
92 |
+
return $request;
|
93 |
+
}
|
94 |
+
$this->client->getLogger()->debug('App Identity authentication');
|
95 |
+
// Add the OAuth2 header to the request
|
96 |
+
$request->setRequestHeaders(array(
|
97 |
+
'Authorization' => 'Bearer ' . $this->token['access_token']
|
98 |
+
));
|
99 |
+
return $request;
|
100 |
+
}
|
101 |
}
|
tools/src/Google/Auth/AssertionCredentials.php
CHANGED
@@ -1,143 +1,143 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Credentials object used for OAuth 2.0 Signed JWT assertion grants.
|
21 |
-
*
|
22 |
-
* @author Chirag Shah <chirags@google.com>
|
23 |
-
*/
|
24 |
-
class Google_Auth_AssertionCredentials
|
25 |
-
{
|
26 |
-
|
27 |
-
const MAX_TOKEN_LIFETIME_SECS = 3600;
|
28 |
-
|
29 |
-
public $serviceAccountName;
|
30 |
-
|
31 |
-
public $scopes;
|
32 |
-
|
33 |
-
public $privateKey;
|
34 |
-
|
35 |
-
public $privateKeyPassword;
|
36 |
-
|
37 |
-
public $assertionType;
|
38 |
-
|
39 |
-
public $sub;
|
40 |
-
|
41 |
-
/**
|
42 |
-
*
|
43 |
-
* @deprecated
|
44 |
-
*
|
45 |
-
* @link http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
|
46 |
-
*/
|
47 |
-
public $prn;
|
48 |
-
|
49 |
-
private $useCache;
|
50 |
-
|
51 |
-
/**
|
52 |
-
*
|
53 |
-
* @param
|
54 |
-
* $serviceAccountName
|
55 |
-
* @param $scopes array
|
56 |
-
* List of scopes
|
57 |
-
* @param
|
58 |
-
* $privateKey
|
59 |
-
* @param string $privateKeyPassword
|
60 |
-
* @param string $assertionType
|
61 |
-
* @param bool|string $sub
|
62 |
-
* The email address of the user for which the
|
63 |
-
* application is requesting delegated access.
|
64 |
-
* @param
|
65 |
-
* bool useCache Whether to generate a cache key and allow
|
66 |
-
* automatic caching of the generated token.
|
67 |
-
*/
|
68 |
-
public function __construct($serviceAccountName, $scopes, $privateKey, $privateKeyPassword = 'notasecret', $assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer', $sub = false, $useCache = true)
|
69 |
-
{
|
70 |
-
$this->serviceAccountName = $serviceAccountName;
|
71 |
-
$this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes);
|
72 |
-
$this->privateKey = $privateKey;
|
73 |
-
$this->privateKeyPassword = $privateKeyPassword;
|
74 |
-
$this->assertionType = $assertionType;
|
75 |
-
$this->sub = $sub;
|
76 |
-
$this->prn = $sub;
|
77 |
-
$this->useCache = $useCache;
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* Generate a unique key to represent this credential.
|
82 |
-
*
|
83 |
-
* @return string
|
84 |
-
*/
|
85 |
-
public function getCacheKey()
|
86 |
-
{
|
87 |
-
if (! $this->useCache) {
|
88 |
-
return false;
|
89 |
-
}
|
90 |
-
$h = $this->sub;
|
91 |
-
$h .= $this->assertionType;
|
92 |
-
$h .= $this->privateKey;
|
93 |
-
$h .= $this->scopes;
|
94 |
-
$h .= $this->serviceAccountName;
|
95 |
-
return md5($h);
|
96 |
-
}
|
97 |
-
|
98 |
-
public function generateAssertion()
|
99 |
-
{
|
100 |
-
$now = time();
|
101 |
-
$jwtParams = array(
|
102 |
-
'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI,
|
103 |
-
'scope' => $this->scopes,
|
104 |
-
'iat' => $now,
|
105 |
-
'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS,
|
106 |
-
'iss' => $this->serviceAccountName
|
107 |
-
);
|
108 |
-
if ($this->sub !== false) {
|
109 |
-
$jwtParams['sub'] = $this->sub;
|
110 |
-
} else
|
111 |
-
if ($this->prn !== false) {
|
112 |
-
$jwtParams['prn'] = $this->prn;
|
113 |
-
}
|
114 |
-
return $this->makeSignedJwt($jwtParams);
|
115 |
-
}
|
116 |
-
|
117 |
-
/**
|
118 |
-
* Creates a signed JWT.
|
119 |
-
*
|
120 |
-
* @param array $payload
|
121 |
-
* @return string The signed JWT.
|
122 |
-
*/
|
123 |
-
private function makeSignedJwt($payload)
|
124 |
-
{
|
125 |
-
$header = array(
|
126 |
-
'typ' => 'JWT',
|
127 |
-
'alg' => 'RS256'
|
128 |
-
);
|
129 |
-
$payload = json_encode($payload);
|
130 |
-
// Handle some overzealous escaping in PHP json that seemed to cause some errors
|
131 |
-
// with claimsets.
|
132 |
-
$payload = str_replace('\/', '/', $payload);
|
133 |
-
$segments = array(
|
134 |
-
Google_Utils::urlSafeB64Encode(json_encode($header)),
|
135 |
-
Google_Utils::urlSafeB64Encode($payload)
|
136 |
-
);
|
137 |
-
$signingInput = implode('.', $segments);
|
138 |
-
$signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword);
|
139 |
-
$signature = $signer->sign($signingInput);
|
140 |
-
$segments[] = Google_Utils::urlSafeB64Encode($signature);
|
141 |
-
return implode(".", $segments);
|
142 |
-
}
|
143 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Credentials object used for OAuth 2.0 Signed JWT assertion grants.
|
21 |
+
*
|
22 |
+
* @author Chirag Shah <chirags@google.com>
|
23 |
+
*/
|
24 |
+
class Google_Auth_AssertionCredentials
|
25 |
+
{
|
26 |
+
|
27 |
+
const MAX_TOKEN_LIFETIME_SECS = 3600;
|
28 |
+
|
29 |
+
public $serviceAccountName;
|
30 |
+
|
31 |
+
public $scopes;
|
32 |
+
|
33 |
+
public $privateKey;
|
34 |
+
|
35 |
+
public $privateKeyPassword;
|
36 |
+
|
37 |
+
public $assertionType;
|
38 |
+
|
39 |
+
public $sub;
|
40 |
+
|
41 |
+
/**
|
42 |
+
*
|
43 |
+
* @deprecated
|
44 |
+
*
|
45 |
+
* @link http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
|
46 |
+
*/
|
47 |
+
public $prn;
|
48 |
+
|
49 |
+
private $useCache;
|
50 |
+
|
51 |
+
/**
|
52 |
+
*
|
53 |
+
* @param
|
54 |
+
* $serviceAccountName
|
55 |
+
* @param $scopes array
|
56 |
+
* List of scopes
|
57 |
+
* @param
|
58 |
+
* $privateKey
|
59 |
+
* @param string $privateKeyPassword
|
60 |
+
* @param string $assertionType
|
61 |
+
* @param bool|string $sub
|
62 |
+
* The email address of the user for which the
|
63 |
+
* application is requesting delegated access.
|
64 |
+
* @param
|
65 |
+
* bool useCache Whether to generate a cache key and allow
|
66 |
+
* automatic caching of the generated token.
|
67 |
+
*/
|
68 |
+
public function __construct($serviceAccountName, $scopes, $privateKey, $privateKeyPassword = 'notasecret', $assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer', $sub = false, $useCache = true)
|
69 |
+
{
|
70 |
+
$this->serviceAccountName = $serviceAccountName;
|
71 |
+
$this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes);
|
72 |
+
$this->privateKey = $privateKey;
|
73 |
+
$this->privateKeyPassword = $privateKeyPassword;
|
74 |
+
$this->assertionType = $assertionType;
|
75 |
+
$this->sub = $sub;
|
76 |
+
$this->prn = $sub;
|
77 |
+
$this->useCache = $useCache;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Generate a unique key to represent this credential.
|
82 |
+
*
|
83 |
+
* @return string
|
84 |
+
*/
|
85 |
+
public function getCacheKey()
|
86 |
+
{
|
87 |
+
if (! $this->useCache) {
|
88 |
+
return false;
|
89 |
+
}
|
90 |
+
$h = $this->sub;
|
91 |
+
$h .= $this->assertionType;
|
92 |
+
$h .= $this->privateKey;
|
93 |
+
$h .= $this->scopes;
|
94 |
+
$h .= $this->serviceAccountName;
|
95 |
+
return md5($h);
|
96 |
+
}
|
97 |
+
|
98 |
+
public function generateAssertion()
|
99 |
+
{
|
100 |
+
$now = time();
|
101 |
+
$jwtParams = array(
|
102 |
+
'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI,
|
103 |
+
'scope' => $this->scopes,
|
104 |
+
'iat' => $now,
|
105 |
+
'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS,
|
106 |
+
'iss' => $this->serviceAccountName
|
107 |
+
);
|
108 |
+
if ($this->sub !== false) {
|
109 |
+
$jwtParams['sub'] = $this->sub;
|
110 |
+
} else
|
111 |
+
if ($this->prn !== false) {
|
112 |
+
$jwtParams['prn'] = $this->prn;
|
113 |
+
}
|
114 |
+
return $this->makeSignedJwt($jwtParams);
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* Creates a signed JWT.
|
119 |
+
*
|
120 |
+
* @param array $payload
|
121 |
+
* @return string The signed JWT.
|
122 |
+
*/
|
123 |
+
private function makeSignedJwt($payload)
|
124 |
+
{
|
125 |
+
$header = array(
|
126 |
+
'typ' => 'JWT',
|
127 |
+
'alg' => 'RS256'
|
128 |
+
);
|
129 |
+
$payload = json_encode($payload);
|
130 |
+
// Handle some overzealous escaping in PHP json that seemed to cause some errors
|
131 |
+
// with claimsets.
|
132 |
+
$payload = str_replace('\/', '/', $payload);
|
133 |
+
$segments = array(
|
134 |
+
Google_Utils::urlSafeB64Encode(json_encode($header)),
|
135 |
+
Google_Utils::urlSafeB64Encode($payload)
|
136 |
+
);
|
137 |
+
$signingInput = implode('.', $segments);
|
138 |
+
$signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword);
|
139 |
+
$signature = $signer->sign($signingInput);
|
140 |
+
$segments[] = Google_Utils::urlSafeB64Encode($signature);
|
141 |
+
return implode(".", $segments);
|
142 |
+
}
|
143 |
}
|
tools/src/Google/Auth/Exception.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
class Google_Auth_Exception extends Google_Exception
|
20 |
-
{
|
21 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
class Google_Auth_Exception extends Google_Exception
|
20 |
+
{
|
21 |
}
|
tools/src/Google/Auth/LoginTicket.php
CHANGED
@@ -1,76 +1,76 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Class to hold information about an authenticated login.
|
21 |
-
*
|
22 |
-
* @author Brian Eaton <beaton@google.com>
|
23 |
-
*/
|
24 |
-
class Google_Auth_LoginTicket
|
25 |
-
{
|
26 |
-
|
27 |
-
const USER_ATTR = "sub";
|
28 |
-
// Information from id token envelope.
|
29 |
-
private $envelope;
|
30 |
-
// Information from id token payload.
|
31 |
-
private $payload;
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Creates a user based on the supplied token.
|
35 |
-
*
|
36 |
-
* @param string $envelope
|
37 |
-
* Header from a verified authentication token.
|
38 |
-
* @param string $payload
|
39 |
-
* Information from a verified authentication token.
|
40 |
-
*/
|
41 |
-
public function __construct($envelope, $payload)
|
42 |
-
{
|
43 |
-
$this->envelope = $envelope;
|
44 |
-
$this->payload = $payload;
|
45 |
-
}
|
46 |
-
|
47 |
-
/**
|
48 |
-
* Returns the numeric identifier for the user.
|
49 |
-
*
|
50 |
-
* @throws Google_Auth_Exception
|
51 |
-
* @return
|
52 |
-
*
|
53 |
-
*/
|
54 |
-
public function getUserId()
|
55 |
-
{
|
56 |
-
if (array_key_exists(self::USER_ATTR, $this->payload)) {
|
57 |
-
return $this->payload[self::USER_ATTR];
|
58 |
-
}
|
59 |
-
throw new Google_Auth_Exception("No user_id in token");
|
60 |
-
}
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Returns attributes from the login ticket.
|
64 |
-
* This can contain
|
65 |
-
* various information about the user session.
|
66 |
-
*
|
67 |
-
* @return array
|
68 |
-
*/
|
69 |
-
public function getAttributes()
|
70 |
-
{
|
71 |
-
return array(
|
72 |
-
"envelope" => $this->envelope,
|
73 |
-
"payload" => $this->payload
|
74 |
-
);
|
75 |
-
}
|
76 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Class to hold information about an authenticated login.
|
21 |
+
*
|
22 |
+
* @author Brian Eaton <beaton@google.com>
|
23 |
+
*/
|
24 |
+
class Google_Auth_LoginTicket
|
25 |
+
{
|
26 |
+
|
27 |
+
const USER_ATTR = "sub";
|
28 |
+
// Information from id token envelope.
|
29 |
+
private $envelope;
|
30 |
+
// Information from id token payload.
|
31 |
+
private $payload;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Creates a user based on the supplied token.
|
35 |
+
*
|
36 |
+
* @param string $envelope
|
37 |
+
* Header from a verified authentication token.
|
38 |
+
* @param string $payload
|
39 |
+
* Information from a verified authentication token.
|
40 |
+
*/
|
41 |
+
public function __construct($envelope, $payload)
|
42 |
+
{
|
43 |
+
$this->envelope = $envelope;
|
44 |
+
$this->payload = $payload;
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Returns the numeric identifier for the user.
|
49 |
+
*
|
50 |
+
* @throws Google_Auth_Exception
|
51 |
+
* @return
|
52 |
+
*
|
53 |
+
*/
|
54 |
+
public function getUserId()
|
55 |
+
{
|
56 |
+
if (array_key_exists(self::USER_ATTR, $this->payload)) {
|
57 |
+
return $this->payload[self::USER_ATTR];
|
58 |
+
}
|
59 |
+
throw new Google_Auth_Exception("No user_id in token");
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Returns attributes from the login ticket.
|
64 |
+
* This can contain
|
65 |
+
* various information about the user session.
|
66 |
+
*
|
67 |
+
* @return array
|
68 |
+
*/
|
69 |
+
public function getAttributes()
|
70 |
+
{
|
71 |
+
return array(
|
72 |
+
"envelope" => $this->envelope,
|
73 |
+
"payload" => $this->payload
|
74 |
+
);
|
75 |
+
}
|
76 |
}
|
tools/src/Google/Auth/OAuth2.php
CHANGED
@@ -1,547 +1,547 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2008 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Authentication class that deals with the OAuth 2 web-server authentication flow
|
21 |
-
*
|
22 |
-
* @author Chris Chabot <chabotc@google.com>
|
23 |
-
* @author Chirag Shah <chirags@google.com>
|
24 |
-
*
|
25 |
-
*/
|
26 |
-
class Google_Auth_OAuth2 extends Google_Auth_Abstract
|
27 |
-
{
|
28 |
-
|
29 |
-
const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke';
|
30 |
-
|
31 |
-
const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token';
|
32 |
-
|
33 |
-
const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
|
34 |
-
|
35 |
-
const CLOCK_SKEW_SECS = 300;
|
36 |
-
// five minutes in seconds
|
37 |
-
const AUTH_TOKEN_LIFETIME_SECS = 300;
|
38 |
-
// five minutes in seconds
|
39 |
-
const MAX_TOKEN_LIFETIME_SECS = 86400;
|
40 |
-
// one day in seconds
|
41 |
-
const OAUTH2_ISSUER = 'accounts.google.com';
|
42 |
-
|
43 |
-
/**
|
44 |
-
*
|
45 |
-
* @var Google_Auth_AssertionCredentials $assertionCredentials
|
46 |
-
*/
|
47 |
-
private $assertionCredentials;
|
48 |
-
|
49 |
-
/**
|
50 |
-
*
|
51 |
-
* @var string The state parameters for CSRF and other forgery protection.
|
52 |
-
*/
|
53 |
-
private $state;
|
54 |
-
|
55 |
-
/**
|
56 |
-
*
|
57 |
-
* @var array The token bundle.
|
58 |
-
*/
|
59 |
-
private $token = array();
|
60 |
-
|
61 |
-
/**
|
62 |
-
*
|
63 |
-
* @var Google_Client the base client
|
64 |
-
*/
|
65 |
-
private $client;
|
66 |
-
|
67 |
-
/**
|
68 |
-
* Instantiates the class, but does not initiate the login flow, leaving it
|
69 |
-
* to the discretion of the caller.
|
70 |
-
*/
|
71 |
-
public function __construct(Google_Client $client)
|
72 |
-
{
|
73 |
-
$this->client = $client;
|
74 |
-
}
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Perform an authenticated / signed apiHttpRequest.
|
78 |
-
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
79 |
-
* (which can modify the request in what ever way fits the auth mechanism)
|
80 |
-
* and then calls apiCurlIO::makeRequest on the signed request
|
81 |
-
*
|
82 |
-
* @param Google_Http_Request $request
|
83 |
-
* @return Google_Http_Request The resulting HTTP response including the
|
84 |
-
* responseHttpCode, responseHeaders and responseBody.
|
85 |
-
*/
|
86 |
-
public function authenticatedRequest(Google_Http_Request $request)
|
87 |
-
{
|
88 |
-
$request = $this->sign($request);
|
89 |
-
return $this->client->getIo()->makeRequest($request);
|
90 |
-
}
|
91 |
-
|
92 |
-
/**
|
93 |
-
*
|
94 |
-
* @param string $code
|
95 |
-
* @throws Google_Auth_Exception
|
96 |
-
* @return string
|
97 |
-
*/
|
98 |
-
public function authenticate($code)
|
99 |
-
{
|
100 |
-
if (strlen($code) == 0) {
|
101 |
-
throw new Google_Auth_Exception("Invalid code");
|
102 |
-
}
|
103 |
-
// We got here from the redirect from a successful authorization grant,
|
104 |
-
// fetch the access token
|
105 |
-
$request = new Google_Http_Request(self::OAUTH2_TOKEN_URI, 'POST', array(), array(
|
106 |
-
'code' => $code,
|
107 |
-
'grant_type' => 'authorization_code',
|
108 |
-
'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'),
|
109 |
-
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
110 |
-
'client_secret' => $this->client->getClassConfig($this, 'client_secret')
|
111 |
-
));
|
112 |
-
$request->disableGzip();
|
113 |
-
$response = $this->client->getIo()->makeRequest($request);
|
114 |
-
if ($response->getResponseHttpCode() == 200) {
|
115 |
-
$this->setAccessToken($response->getResponseBody());
|
116 |
-
$this->token['created'] = time();
|
117 |
-
return $this->getAccessToken();
|
118 |
-
} else {
|
119 |
-
$decodedResponse = json_decode($response->getResponseBody(), true);
|
120 |
-
if ($decodedResponse != null && $decodedResponse['error']) {
|
121 |
-
$errorText = $decodedResponse['error'];
|
122 |
-
if (isset($decodedResponse['error_description'])) {
|
123 |
-
$errorText .= ": " . $decodedResponse['error_description'];
|
124 |
-
}
|
125 |
-
}
|
126 |
-
throw new Google_Auth_Exception(sprintf("Error fetching OAuth2 access token, message: '%s'", $errorText), $response->getResponseHttpCode());
|
127 |
-
}
|
128 |
-
}
|
129 |
-
|
130 |
-
/**
|
131 |
-
* Create a URL to obtain user authorization.
|
132 |
-
* The authorization endpoint allows the user to first
|
133 |
-
* authenticate, and then grant/deny the access request.
|
134 |
-
*
|
135 |
-
* @param string $scope
|
136 |
-
* The scope is expressed as a list of space-delimited strings.
|
137 |
-
* @return string
|
138 |
-
*/
|
139 |
-
public function createAuthUrl($scope)
|
140 |
-
{
|
141 |
-
$params = array(
|
142 |
-
'response_type' => 'code',
|
143 |
-
'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'),
|
144 |
-
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
145 |
-
'scope' => $scope,
|
146 |
-
'access_type' => $this->client->getClassConfig($this, 'access_type')
|
147 |
-
);
|
148 |
-
// Prefer prompt to approval prompt.
|
149 |
-
if ($this->client->getClassConfig($this, 'prompt')) {
|
150 |
-
$params = $this->maybeAddParam($params, 'prompt');
|
151 |
-
} else {
|
152 |
-
$params = $this->maybeAddParam($params, 'approval_prompt');
|
153 |
-
}
|
154 |
-
$params = $this->maybeAddParam($params, 'login_hint');
|
155 |
-
$params = $this->maybeAddParam($params, 'hd');
|
156 |
-
$params = $this->maybeAddParam($params, 'openid.realm');
|
157 |
-
$params = $this->maybeAddParam($params, 'include_granted_scopes');
|
158 |
-
// If the list of scopes contains plus.login, add request_visible_actions
|
159 |
-
// to auth URL.
|
160 |
-
$rva = $this->client->getClassConfig($this, 'request_visible_actions');
|
161 |
-
if (strpos($scope, 'plus.login') && strlen($rva) > 0) {
|
162 |
-
$params['request_visible_actions'] = $rva;
|
163 |
-
}
|
164 |
-
if (isset($this->state)) {
|
165 |
-
$params['state'] = $this->state;
|
166 |
-
}
|
167 |
-
return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&');
|
168 |
-
}
|
169 |
-
|
170 |
-
/**
|
171 |
-
*
|
172 |
-
* @param string $token
|
173 |
-
* @throws Google_Auth_Exception
|
174 |
-
*/
|
175 |
-
public function setAccessToken($token)
|
176 |
-
{
|
177 |
-
$token = json_decode($token, true);
|
178 |
-
if ($token == null) {
|
179 |
-
throw new Google_Auth_Exception('Could not json decode the token');
|
180 |
-
}
|
181 |
-
if (! isset($token['access_token'])) {
|
182 |
-
throw new Google_Auth_Exception("Invalid token format");
|
183 |
-
}
|
184 |
-
$this->token = $token;
|
185 |
-
}
|
186 |
-
|
187 |
-
public function getAccessToken()
|
188 |
-
{
|
189 |
-
return json_encode($this->token);
|
190 |
-
}
|
191 |
-
|
192 |
-
public function getRefreshToken()
|
193 |
-
{
|
194 |
-
if (array_key_exists('refresh_token', $this->token)) {
|
195 |
-
return $this->token['refresh_token'];
|
196 |
-
} else {
|
197 |
-
return null;
|
198 |
-
}
|
199 |
-
}
|
200 |
-
|
201 |
-
public function setState($state)
|
202 |
-
{
|
203 |
-
$this->state = $state;
|
204 |
-
}
|
205 |
-
|
206 |
-
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
207 |
-
{
|
208 |
-
$this->assertionCredentials = $creds;
|
209 |
-
}
|
210 |
-
|
211 |
-
/**
|
212 |
-
* Include an accessToken in a given apiHttpRequest.
|
213 |
-
*
|
214 |
-
* @param Google_Http_Request $request
|
215 |
-
* @return Google_Http_Request
|
216 |
-
* @throws Google_Auth_Exception
|
217 |
-
*/
|
218 |
-
public function sign(Google_Http_Request $request)
|
219 |
-
{
|
220 |
-
// add the developer key to the request before signing it
|
221 |
-
if ($this->client->getClassConfig($this, 'developer_key')) {
|
222 |
-
$request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key'));
|
223 |
-
}
|
224 |
-
// Cannot sign the request without an OAuth access token.
|
225 |
-
if (null == $this->token && null == $this->assertionCredentials) {
|
226 |
-
return $request;
|
227 |
-
}
|
228 |
-
// Check if the token is set to expire in the next 30 seconds
|
229 |
-
// (or has already expired).
|
230 |
-
if ($this->isAccessTokenExpired()) {
|
231 |
-
if ($this->assertionCredentials) {
|
232 |
-
$this->refreshTokenWithAssertion();
|
233 |
-
} else {
|
234 |
-
$this->client->getLogger()->debug('OAuth2 access token expired');
|
235 |
-
if (! array_key_exists('refresh_token', $this->token)) {
|
236 |
-
$error = "The OAuth 2.0 access token has expired," . " and a refresh token is not available. Refresh tokens" . " are not returned for responses that were auto-approved.";
|
237 |
-
$this->client->getLogger()->error($error);
|
238 |
-
throw new Google_Auth_Exception($error);
|
239 |
-
}
|
240 |
-
$this->refreshToken($this->token['refresh_token']);
|
241 |
-
}
|
242 |
-
}
|
243 |
-
$this->client->getLogger()->debug('OAuth2 authentication');
|
244 |
-
// Add the OAuth2 header to the request
|
245 |
-
$request->setRequestHeaders(array(
|
246 |
-
'Authorization' => 'Bearer ' . $this->token['access_token']
|
247 |
-
));
|
248 |
-
return $request;
|
249 |
-
}
|
250 |
-
|
251 |
-
/**
|
252 |
-
* Fetches a fresh access token with the given refresh token.
|
253 |
-
*
|
254 |
-
* @param string $refreshToken
|
255 |
-
* @return void
|
256 |
-
*/
|
257 |
-
public function refreshToken($refreshToken)
|
258 |
-
{
|
259 |
-
$this->refreshTokenRequest(array(
|
260 |
-
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
261 |
-
'client_secret' => $this->client->getClassConfig($this, 'client_secret'),
|
262 |
-
'refresh_token' => $refreshToken,
|
263 |
-
'grant_type' => 'refresh_token'
|
264 |
-
));
|
265 |
-
}
|
266 |
-
|
267 |
-
/**
|
268 |
-
* Fetches a fresh access token with a given assertion token.
|
269 |
-
*
|
270 |
-
* @param Google_Auth_AssertionCredentials $assertionCredentials
|
271 |
-
* optional.
|
272 |
-
* @return void
|
273 |
-
*/
|
274 |
-
public function refreshTokenWithAssertion($assertionCredentials = null)
|
275 |
-
{
|
276 |
-
if (! $assertionCredentials) {
|
277 |
-
$assertionCredentials = $this->assertionCredentials;
|
278 |
-
}
|
279 |
-
$cacheKey = $assertionCredentials->getCacheKey();
|
280 |
-
if ($cacheKey) {
|
281 |
-
// We can check whether we have a token available in the
|
282 |
-
// cache. If it is expired, we can retrieve a new one from
|
283 |
-
// the assertion.
|
284 |
-
$token = $this->client->getCache()->get($cacheKey);
|
285 |
-
if ($token) {
|
286 |
-
$this->setAccessToken($token);
|
287 |
-
}
|
288 |
-
if (! $this->isAccessTokenExpired()) {
|
289 |
-
return;
|
290 |
-
}
|
291 |
-
}
|
292 |
-
$this->client->getLogger()->debug('OAuth2 access token expired');
|
293 |
-
$this->refreshTokenRequest(array(
|
294 |
-
'grant_type' => 'assertion',
|
295 |
-
'assertion_type' => $assertionCredentials->assertionType,
|
296 |
-
'assertion' => $assertionCredentials->generateAssertion()
|
297 |
-
));
|
298 |
-
if ($cacheKey) {
|
299 |
-
// Attempt to cache the token.
|
300 |
-
$this->client->getCache()->set($cacheKey, $this->getAccessToken());
|
301 |
-
}
|
302 |
-
}
|
303 |
-
|
304 |
-
private function refreshTokenRequest($params)
|
305 |
-
{
|
306 |
-
if (isset($params['assertion'])) {
|
307 |
-
$this->client->getLogger()->info('OAuth2 access token refresh with Signed JWT assertion grants.');
|
308 |
-
} else {
|
309 |
-
$this->client->getLogger()->info('OAuth2 access token refresh');
|
310 |
-
}
|
311 |
-
$http = new Google_Http_Request(self::OAUTH2_TOKEN_URI, 'POST', array(), $params);
|
312 |
-
$http->disableGzip();
|
313 |
-
$request = $this->client->getIo()->makeRequest($http);
|
314 |
-
$code = $request->getResponseHttpCode();
|
315 |
-
$body = $request->getResponseBody();
|
316 |
-
if (200 == $code) {
|
317 |
-
$token = json_decode($body, true);
|
318 |
-
if ($token == null) {
|
319 |
-
throw new Google_Auth_Exception("Could not json decode the access token");
|
320 |
-
}
|
321 |
-
if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
|
322 |
-
throw new Google_Auth_Exception("Invalid token format");
|
323 |
-
}
|
324 |
-
if (isset($token['id_token'])) {
|
325 |
-
$this->token['id_token'] = $token['id_token'];
|
326 |
-
}
|
327 |
-
$this->token['access_token'] = $token['access_token'];
|
328 |
-
$this->token['expires_in'] = $token['expires_in'];
|
329 |
-
$this->token['created'] = time();
|
330 |
-
} else {
|
331 |
-
throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code);
|
332 |
-
}
|
333 |
-
}
|
334 |
-
|
335 |
-
/**
|
336 |
-
* Revoke an OAuth2 access token or refresh token.
|
337 |
-
* This method will revoke the current access
|
338 |
-
* token, if a token isn't provided.
|
339 |
-
*
|
340 |
-
* @throws Google_Auth_Exception
|
341 |
-
* @param string|null $token
|
342 |
-
* The token (access token or a refresh token) that should be revoked.
|
343 |
-
* @return boolean Returns True if the revocation was successful, otherwise False.
|
344 |
-
*/
|
345 |
-
public function revokeToken($token = null)
|
346 |
-
{
|
347 |
-
if (! $token) {
|
348 |
-
if (! $this->token) {
|
349 |
-
// Not initialized, no token to actually revoke
|
350 |
-
return false;
|
351 |
-
} elseif (array_key_exists('refresh_token', $this->token)) {
|
352 |
-
$token = $this->token['refresh_token'];
|
353 |
-
} else {
|
354 |
-
$token = $this->token['access_token'];
|
355 |
-
}
|
356 |
-
}
|
357 |
-
$request = new Google_Http_Request(self::OAUTH2_REVOKE_URI, 'POST', array(), "token=$token");
|
358 |
-
$request->disableGzip();
|
359 |
-
$response = $this->client->getIo()->makeRequest($request);
|
360 |
-
$code = $response->getResponseHttpCode();
|
361 |
-
if ($code == 200) {
|
362 |
-
$this->token = null;
|
363 |
-
return true;
|
364 |
-
}
|
365 |
-
return false;
|
366 |
-
}
|
367 |
-
|
368 |
-
/**
|
369 |
-
* Returns if the access_token is expired.
|
370 |
-
*
|
371 |
-
* @return bool Returns True if the access_token is expired.
|
372 |
-
*/
|
373 |
-
public function isAccessTokenExpired()
|
374 |
-
{
|
375 |
-
if (! $this->token || ! isset($this->token['created'])) {
|
376 |
-
return true;
|
377 |
-
}
|
378 |
-
// If the token is set to expire in the next 30 seconds.
|
379 |
-
$expired = ($this->token['created'] + ($this->token['expires_in'] - 30)) < time();
|
380 |
-
return $expired;
|
381 |
-
}
|
382 |
-
// Gets federated sign-on certificates to use for verifying identity tokens.
|
383 |
-
// Returns certs as array structure, where keys are key ids, and values
|
384 |
-
// are PEM encoded certificates.
|
385 |
-
private function getFederatedSignOnCerts()
|
386 |
-
{
|
387 |
-
return $this->retrieveCertsFromLocation($this->client->getClassConfig($this, 'federated_signon_certs_url'));
|
388 |
-
}
|
389 |
-
|
390 |
-
/**
|
391 |
-
* Retrieve and cache a certificates file.
|
392 |
-
*
|
393 |
-
* @param $url string
|
394 |
-
* location
|
395 |
-
* @throws Google_Auth_Exception
|
396 |
-
* @return array certificates
|
397 |
-
*/
|
398 |
-
public function retrieveCertsFromLocation($url)
|
399 |
-
{
|
400 |
-
// If we're retrieving a local file, just grab it.
|
401 |
-
if ("http" != substr($url, 0, 4)) {
|
402 |
-
$file = file_get_contents($url);
|
403 |
-
if ($file) {
|
404 |
-
return json_decode($file, true);
|
405 |
-
} else {
|
406 |
-
throw new Google_Auth_Exception("Failed to retrieve verification certificates: '" . $url . "'.");
|
407 |
-
}
|
408 |
-
}
|
409 |
-
// This relies on makeRequest caching certificate responses.
|
410 |
-
$request = $this->client->getIo()->makeRequest(new Google_Http_Request($url));
|
411 |
-
if ($request->getResponseHttpCode() == 200) {
|
412 |
-
$certs = json_decode($request->getResponseBody(), true);
|
413 |
-
if ($certs) {
|
414 |
-
return $certs;
|
415 |
-
}
|
416 |
-
}
|
417 |
-
throw new Google_Auth_Exception("Failed to retrieve verification certificates: '" . $request->getResponseBody() . "'.", $request->getResponseHttpCode());
|
418 |
-
}
|
419 |
-
|
420 |
-
/**
|
421 |
-
* Verifies an id token and returns the authenticated apiLoginTicket.
|
422 |
-
* Throws an exception if the id token is not valid.
|
423 |
-
* The audience parameter can be used to control which id tokens are
|
424 |
-
* accepted. By default, the id token must have been issued to this OAuth2 client.
|
425 |
-
*
|
426 |
-
* @param
|
427 |
-
* $id_token
|
428 |
-
* @param
|
429 |
-
* $audience
|
430 |
-
* @return Google_Auth_LoginTicket
|
431 |
-
*/
|
432 |
-
public function verifyIdToken($id_token = null, $audience = null)
|
433 |
-
{
|
434 |
-
if (! $id_token) {
|
435 |
-
$id_token = $this->token['id_token'];
|
436 |
-
}
|
437 |
-
$certs = $this->getFederatedSignonCerts();
|
438 |
-
if (! $audience) {
|
439 |
-
$audience = $this->client->getClassConfig($this, 'client_id');
|
440 |
-
}
|
441 |
-
return $this->verifySignedJwtWithCerts($id_token, $certs, $audience, self::OAUTH2_ISSUER);
|
442 |
-
}
|
443 |
-
|
444 |
-
/**
|
445 |
-
* Verifies the id token, returns the verified token contents.
|
446 |
-
*
|
447 |
-
* @param $jwt string
|
448 |
-
* the token
|
449 |
-
* @param $certs array
|
450 |
-
* of certificates
|
451 |
-
* @param $required_audience string
|
452 |
-
* the expected consumer of the token
|
453 |
-
* @param
|
454 |
-
* [$issuer] the expected issues, defaults to Google
|
455 |
-
* @param
|
456 |
-
* [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
457 |
-
* @throws Google_Auth_Exception
|
458 |
-
* @return mixed token information if valid, false if not
|
459 |
-
*/
|
460 |
-
public function verifySignedJwtWithCerts($jwt, $certs, $required_audience, $issuer = null, $max_expiry = null)
|
461 |
-
{
|
462 |
-
if (! $max_expiry) {
|
463 |
-
// Set the maximum time we will accept a token for.
|
464 |
-
$max_expiry = self::MAX_TOKEN_LIFETIME_SECS;
|
465 |
-
}
|
466 |
-
$segments = explode(".", $jwt);
|
467 |
-
if (count($segments) != 3) {
|
468 |
-
throw new Google_Auth_Exception("Wrong number of segments in token: $jwt");
|
469 |
-
}
|
470 |
-
$signed = $segments[0] . "." . $segments[1];
|
471 |
-
$signature = Google_Utils::urlSafeB64Decode($segments[2]);
|
472 |
-
// Parse envelope.
|
473 |
-
$envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true);
|
474 |
-
if (! $envelope) {
|
475 |
-
throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]);
|
476 |
-
}
|
477 |
-
// Parse token
|
478 |
-
$json_body = Google_Utils::urlSafeB64Decode($segments[1]);
|
479 |
-
$payload = json_decode($json_body, true);
|
480 |
-
if (! $payload) {
|
481 |
-
throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]);
|
482 |
-
}
|
483 |
-
// Check signature
|
484 |
-
$verified = false;
|
485 |
-
foreach ($certs as $keyName => $pem) {
|
486 |
-
$public_key = new Google_Verifier_Pem($pem);
|
487 |
-
if ($public_key->verify($signed, $signature)) {
|
488 |
-
$verified = true;
|
489 |
-
break;
|
490 |
-
}
|
491 |
-
}
|
492 |
-
if (! $verified) {
|
493 |
-
throw new Google_Auth_Exception("Invalid token signature: $jwt");
|
494 |
-
}
|
495 |
-
// Check issued-at timestamp
|
496 |
-
$iat = 0;
|
497 |
-
if (array_key_exists("iat", $payload)) {
|
498 |
-
$iat = $payload["iat"];
|
499 |
-
}
|
500 |
-
if (! $iat) {
|
501 |
-
throw new Google_Auth_Exception("No issue time in token: $json_body");
|
502 |
-
}
|
503 |
-
$earliest = $iat - self::CLOCK_SKEW_SECS;
|
504 |
-
// Check expiration timestamp
|
505 |
-
$now = time();
|
506 |
-
$exp = 0;
|
507 |
-
if (array_key_exists("exp", $payload)) {
|
508 |
-
$exp = $payload["exp"];
|
509 |
-
}
|
510 |
-
if (! $exp) {
|
511 |
-
throw new Google_Auth_Exception("No expiration time in token: $json_body");
|
512 |
-
}
|
513 |
-
if ($exp >= $now + $max_expiry) {
|
514 |
-
throw new Google_Auth_Exception(sprintf("Expiration time too far in future: %s", $json_body));
|
515 |
-
}
|
516 |
-
$latest = $exp + self::CLOCK_SKEW_SECS;
|
517 |
-
if ($now < $earliest) {
|
518 |
-
throw new Google_Auth_Exception(sprintf("Token used too early, %s < %s: %s", $now, $earliest, $json_body));
|
519 |
-
}
|
520 |
-
if ($now > $latest) {
|
521 |
-
throw new Google_Auth_Exception(sprintf("Token used too late, %s > %s: %s", $now, $latest, $json_body));
|
522 |
-
}
|
523 |
-
$iss = $payload['iss'];
|
524 |
-
if ($issuer && $iss != $issuer) {
|
525 |
-
throw new Google_Auth_Exception(sprintf("Invalid issuer, %s != %s: %s", $iss, $issuer, $json_body));
|
526 |
-
}
|
527 |
-
// Check audience
|
528 |
-
$aud = $payload["aud"];
|
529 |
-
if ($aud != $required_audience) {
|
530 |
-
throw new Google_Auth_Exception(sprintf("Wrong recipient, %s != %s:", $aud, $required_audience, $json_body));
|
531 |
-
}
|
532 |
-
// All good.
|
533 |
-
return new Google_Auth_LoginTicket($envelope, $payload);
|
534 |
-
}
|
535 |
-
|
536 |
-
/**
|
537 |
-
* Add a parameter to the auth params if not empty string.
|
538 |
-
*/
|
539 |
-
private function maybeAddParam($params, $name)
|
540 |
-
{
|
541 |
-
$param = $this->client->getClassConfig($this, $name);
|
542 |
-
if ($param != '') {
|
543 |
-
$params[$name] = $param;
|
544 |
-
}
|
545 |
-
return $params;
|
546 |
-
}
|
547 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2008 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Authentication class that deals with the OAuth 2 web-server authentication flow
|
21 |
+
*
|
22 |
+
* @author Chris Chabot <chabotc@google.com>
|
23 |
+
* @author Chirag Shah <chirags@google.com>
|
24 |
+
*
|
25 |
+
*/
|
26 |
+
class Google_Auth_OAuth2 extends Google_Auth_Abstract
|
27 |
+
{
|
28 |
+
|
29 |
+
const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke';
|
30 |
+
|
31 |
+
const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token';
|
32 |
+
|
33 |
+
const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
|
34 |
+
|
35 |
+
const CLOCK_SKEW_SECS = 300;
|
36 |
+
// five minutes in seconds
|
37 |
+
const AUTH_TOKEN_LIFETIME_SECS = 300;
|
38 |
+
// five minutes in seconds
|
39 |
+
const MAX_TOKEN_LIFETIME_SECS = 86400;
|
40 |
+
// one day in seconds
|
41 |
+
const OAUTH2_ISSUER = 'accounts.google.com';
|
42 |
+
|
43 |
+
/**
|
44 |
+
*
|
45 |
+
* @var Google_Auth_AssertionCredentials $assertionCredentials
|
46 |
+
*/
|
47 |
+
private $assertionCredentials;
|
48 |
+
|
49 |
+
/**
|
50 |
+
*
|
51 |
+
* @var string The state parameters for CSRF and other forgery protection.
|
52 |
+
*/
|
53 |
+
private $state;
|
54 |
+
|
55 |
+
/**
|
56 |
+
*
|
57 |
+
* @var array The token bundle.
|
58 |
+
*/
|
59 |
+
private $token = array();
|
60 |
+
|
61 |
+
/**
|
62 |
+
*
|
63 |
+
* @var Google_Client the base client
|
64 |
+
*/
|
65 |
+
private $client;
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Instantiates the class, but does not initiate the login flow, leaving it
|
69 |
+
* to the discretion of the caller.
|
70 |
+
*/
|
71 |
+
public function __construct(Google_Client $client)
|
72 |
+
{
|
73 |
+
$this->client = $client;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Perform an authenticated / signed apiHttpRequest.
|
78 |
+
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
79 |
+
* (which can modify the request in what ever way fits the auth mechanism)
|
80 |
+
* and then calls apiCurlIO::makeRequest on the signed request
|
81 |
+
*
|
82 |
+
* @param Google_Http_Request $request
|
83 |
+
* @return Google_Http_Request The resulting HTTP response including the
|
84 |
+
* responseHttpCode, responseHeaders and responseBody.
|
85 |
+
*/
|
86 |
+
public function authenticatedRequest(Google_Http_Request $request)
|
87 |
+
{
|
88 |
+
$request = $this->sign($request);
|
89 |
+
return $this->client->getIo()->makeRequest($request);
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
*
|
94 |
+
* @param string $code
|
95 |
+
* @throws Google_Auth_Exception
|
96 |
+
* @return string
|
97 |
+
*/
|
98 |
+
public function authenticate($code)
|
99 |
+
{
|
100 |
+
if (strlen($code) == 0) {
|
101 |
+
throw new Google_Auth_Exception("Invalid code");
|
102 |
+
}
|
103 |
+
// We got here from the redirect from a successful authorization grant,
|
104 |
+
// fetch the access token
|
105 |
+
$request = new Google_Http_Request(self::OAUTH2_TOKEN_URI, 'POST', array(), array(
|
106 |
+
'code' => $code,
|
107 |
+
'grant_type' => 'authorization_code',
|
108 |
+
'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'),
|
109 |
+
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
110 |
+
'client_secret' => $this->client->getClassConfig($this, 'client_secret')
|
111 |
+
));
|
112 |
+
$request->disableGzip();
|
113 |
+
$response = $this->client->getIo()->makeRequest($request);
|
114 |
+
if ($response->getResponseHttpCode() == 200) {
|
115 |
+
$this->setAccessToken($response->getResponseBody());
|
116 |
+
$this->token['created'] = time();
|
117 |
+
return $this->getAccessToken();
|
118 |
+
} else {
|
119 |
+
$decodedResponse = json_decode($response->getResponseBody(), true);
|
120 |
+
if ($decodedResponse != null && $decodedResponse['error']) {
|
121 |
+
$errorText = $decodedResponse['error'];
|
122 |
+
if (isset($decodedResponse['error_description'])) {
|
123 |
+
$errorText .= ": " . $decodedResponse['error_description'];
|
124 |
+
}
|
125 |
+
}
|
126 |
+
throw new Google_Auth_Exception(sprintf("Error fetching OAuth2 access token, message: '%s'", $errorText), $response->getResponseHttpCode());
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Create a URL to obtain user authorization.
|
132 |
+
* The authorization endpoint allows the user to first
|
133 |
+
* authenticate, and then grant/deny the access request.
|
134 |
+
*
|
135 |
+
* @param string $scope
|
136 |
+
* The scope is expressed as a list of space-delimited strings.
|
137 |
+
* @return string
|
138 |
+
*/
|
139 |
+
public function createAuthUrl($scope)
|
140 |
+
{
|
141 |
+
$params = array(
|
142 |
+
'response_type' => 'code',
|
143 |
+
'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'),
|
144 |
+
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
145 |
+
'scope' => $scope,
|
146 |
+
'access_type' => $this->client->getClassConfig($this, 'access_type')
|
147 |
+
);
|
148 |
+
// Prefer prompt to approval prompt.
|
149 |
+
if ($this->client->getClassConfig($this, 'prompt')) {
|
150 |
+
$params = $this->maybeAddParam($params, 'prompt');
|
151 |
+
} else {
|
152 |
+
$params = $this->maybeAddParam($params, 'approval_prompt');
|
153 |
+
}
|
154 |
+
$params = $this->maybeAddParam($params, 'login_hint');
|
155 |
+
$params = $this->maybeAddParam($params, 'hd');
|
156 |
+
$params = $this->maybeAddParam($params, 'openid.realm');
|
157 |
+
$params = $this->maybeAddParam($params, 'include_granted_scopes');
|
158 |
+
// If the list of scopes contains plus.login, add request_visible_actions
|
159 |
+
// to auth URL.
|
160 |
+
$rva = $this->client->getClassConfig($this, 'request_visible_actions');
|
161 |
+
if (strpos($scope, 'plus.login') && strlen($rva) > 0) {
|
162 |
+
$params['request_visible_actions'] = $rva;
|
163 |
+
}
|
164 |
+
if (isset($this->state)) {
|
165 |
+
$params['state'] = $this->state;
|
166 |
+
}
|
167 |
+
return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&');
|
168 |
+
}
|
169 |
+
|
170 |
+
/**
|
171 |
+
*
|
172 |
+
* @param string $token
|
173 |
+
* @throws Google_Auth_Exception
|
174 |
+
*/
|
175 |
+
public function setAccessToken($token)
|
176 |
+
{
|
177 |
+
$token = json_decode($token, true);
|
178 |
+
if ($token == null) {
|
179 |
+
throw new Google_Auth_Exception('Could not json decode the token');
|
180 |
+
}
|
181 |
+
if (! isset($token['access_token'])) {
|
182 |
+
throw new Google_Auth_Exception("Invalid token format");
|
183 |
+
}
|
184 |
+
$this->token = $token;
|
185 |
+
}
|
186 |
+
|
187 |
+
public function getAccessToken()
|
188 |
+
{
|
189 |
+
return json_encode($this->token);
|
190 |
+
}
|
191 |
+
|
192 |
+
public function getRefreshToken()
|
193 |
+
{
|
194 |
+
if (array_key_exists('refresh_token', $this->token)) {
|
195 |
+
return $this->token['refresh_token'];
|
196 |
+
} else {
|
197 |
+
return null;
|
198 |
+
}
|
199 |
+
}
|
200 |
+
|
201 |
+
public function setState($state)
|
202 |
+
{
|
203 |
+
$this->state = $state;
|
204 |
+
}
|
205 |
+
|
206 |
+
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
207 |
+
{
|
208 |
+
$this->assertionCredentials = $creds;
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Include an accessToken in a given apiHttpRequest.
|
213 |
+
*
|
214 |
+
* @param Google_Http_Request $request
|
215 |
+
* @return Google_Http_Request
|
216 |
+
* @throws Google_Auth_Exception
|
217 |
+
*/
|
218 |
+
public function sign(Google_Http_Request $request)
|
219 |
+
{
|
220 |
+
// add the developer key to the request before signing it
|
221 |
+
if ($this->client->getClassConfig($this, 'developer_key')) {
|
222 |
+
$request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key'));
|
223 |
+
}
|
224 |
+
// Cannot sign the request without an OAuth access token.
|
225 |
+
if (null == $this->token && null == $this->assertionCredentials) {
|
226 |
+
return $request;
|
227 |
+
}
|
228 |
+
// Check if the token is set to expire in the next 30 seconds
|
229 |
+
// (or has already expired).
|
230 |
+
if ($this->isAccessTokenExpired()) {
|
231 |
+
if ($this->assertionCredentials) {
|
232 |
+
$this->refreshTokenWithAssertion();
|
233 |
+
} else {
|
234 |
+
$this->client->getLogger()->debug('OAuth2 access token expired');
|
235 |
+
if (! array_key_exists('refresh_token', $this->token)) {
|
236 |
+
$error = "The OAuth 2.0 access token has expired," . " and a refresh token is not available. Refresh tokens" . " are not returned for responses that were auto-approved.";
|
237 |
+
$this->client->getLogger()->error($error);
|
238 |
+
throw new Google_Auth_Exception($error);
|
239 |
+
}
|
240 |
+
$this->refreshToken($this->token['refresh_token']);
|
241 |
+
}
|
242 |
+
}
|
243 |
+
$this->client->getLogger()->debug('OAuth2 authentication');
|
244 |
+
// Add the OAuth2 header to the request
|
245 |
+
$request->setRequestHeaders(array(
|
246 |
+
'Authorization' => 'Bearer ' . $this->token['access_token']
|
247 |
+
));
|
248 |
+
return $request;
|
249 |
+
}
|
250 |
+
|
251 |
+
/**
|
252 |
+
* Fetches a fresh access token with the given refresh token.
|
253 |
+
*
|
254 |
+
* @param string $refreshToken
|
255 |
+
* @return void
|
256 |
+
*/
|
257 |
+
public function refreshToken($refreshToken)
|
258 |
+
{
|
259 |
+
$this->refreshTokenRequest(array(
|
260 |
+
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
261 |
+
'client_secret' => $this->client->getClassConfig($this, 'client_secret'),
|
262 |
+
'refresh_token' => $refreshToken,
|
263 |
+
'grant_type' => 'refresh_token'
|
264 |
+
));
|
265 |
+
}
|
266 |
+
|
267 |
+
/**
|
268 |
+
* Fetches a fresh access token with a given assertion token.
|
269 |
+
*
|
270 |
+
* @param Google_Auth_AssertionCredentials $assertionCredentials
|
271 |
+
* optional.
|
272 |
+
* @return void
|
273 |
+
*/
|
274 |
+
public function refreshTokenWithAssertion($assertionCredentials = null)
|
275 |
+
{
|
276 |
+
if (! $assertionCredentials) {
|
277 |
+
$assertionCredentials = $this->assertionCredentials;
|
278 |
+
}
|
279 |
+
$cacheKey = $assertionCredentials->getCacheKey();
|
280 |
+
if ($cacheKey) {
|
281 |
+
// We can check whether we have a token available in the
|
282 |
+
// cache. If it is expired, we can retrieve a new one from
|
283 |
+
// the assertion.
|
284 |
+
$token = $this->client->getCache()->get($cacheKey);
|
285 |
+
if ($token) {
|
286 |
+
$this->setAccessToken($token);
|
287 |
+
}
|
288 |
+
if (! $this->isAccessTokenExpired()) {
|
289 |
+
return;
|
290 |
+
}
|
291 |
+
}
|
292 |
+
$this->client->getLogger()->debug('OAuth2 access token expired');
|
293 |
+
$this->refreshTokenRequest(array(
|
294 |
+
'grant_type' => 'assertion',
|
295 |
+
'assertion_type' => $assertionCredentials->assertionType,
|
296 |
+
'assertion' => $assertionCredentials->generateAssertion()
|
297 |
+
));
|
298 |
+
if ($cacheKey) {
|
299 |
+
// Attempt to cache the token.
|
300 |
+
$this->client->getCache()->set($cacheKey, $this->getAccessToken());
|
301 |
+
}
|
302 |
+
}
|
303 |
+
|
304 |
+
private function refreshTokenRequest($params)
|
305 |
+
{
|
306 |
+
if (isset($params['assertion'])) {
|
307 |
+
$this->client->getLogger()->info('OAuth2 access token refresh with Signed JWT assertion grants.');
|
308 |
+
} else {
|
309 |
+
$this->client->getLogger()->info('OAuth2 access token refresh');
|
310 |
+
}
|
311 |
+
$http = new Google_Http_Request(self::OAUTH2_TOKEN_URI, 'POST', array(), $params);
|
312 |
+
$http->disableGzip();
|
313 |
+
$request = $this->client->getIo()->makeRequest($http);
|
314 |
+
$code = $request->getResponseHttpCode();
|
315 |
+
$body = $request->getResponseBody();
|
316 |
+
if (200 == $code) {
|
317 |
+
$token = json_decode($body, true);
|
318 |
+
if ($token == null) {
|
319 |
+
throw new Google_Auth_Exception("Could not json decode the access token");
|
320 |
+
}
|
321 |
+
if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
|
322 |
+
throw new Google_Auth_Exception("Invalid token format");
|
323 |
+
}
|
324 |
+
if (isset($token['id_token'])) {
|
325 |
+
$this->token['id_token'] = $token['id_token'];
|
326 |
+
}
|
327 |
+
$this->token['access_token'] = $token['access_token'];
|
328 |
+
$this->token['expires_in'] = $token['expires_in'];
|
329 |
+
$this->token['created'] = time();
|
330 |
+
} else {
|
331 |
+
throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code);
|
332 |
+
}
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Revoke an OAuth2 access token or refresh token.
|
337 |
+
* This method will revoke the current access
|
338 |
+
* token, if a token isn't provided.
|
339 |
+
*
|
340 |
+
* @throws Google_Auth_Exception
|
341 |
+
* @param string|null $token
|
342 |
+
* The token (access token or a refresh token) that should be revoked.
|
343 |
+
* @return boolean Returns True if the revocation was successful, otherwise False.
|
344 |
+
*/
|
345 |
+
public function revokeToken($token = null)
|
346 |
+
{
|
347 |
+
if (! $token) {
|
348 |
+
if (! $this->token) {
|
349 |
+
// Not initialized, no token to actually revoke
|
350 |
+
return false;
|
351 |
+
} elseif (array_key_exists('refresh_token', $this->token)) {
|
352 |
+
$token = $this->token['refresh_token'];
|
353 |
+
} else {
|
354 |
+
$token = $this->token['access_token'];
|
355 |
+
}
|
356 |
+
}
|
357 |
+
$request = new Google_Http_Request(self::OAUTH2_REVOKE_URI, 'POST', array(), "token=$token");
|
358 |
+
$request->disableGzip();
|
359 |
+
$response = $this->client->getIo()->makeRequest($request);
|
360 |
+
$code = $response->getResponseHttpCode();
|
361 |
+
if ($code == 200) {
|
362 |
+
$this->token = null;
|
363 |
+
return true;
|
364 |
+
}
|
365 |
+
return false;
|
366 |
+
}
|
367 |
+
|
368 |
+
/**
|
369 |
+
* Returns if the access_token is expired.
|
370 |
+
*
|
371 |
+
* @return bool Returns True if the access_token is expired.
|
372 |
+
*/
|
373 |
+
public function isAccessTokenExpired()
|
374 |
+
{
|
375 |
+
if (! $this->token || ! isset($this->token['created'])) {
|
376 |
+
return true;
|
377 |
+
}
|
378 |
+
// If the token is set to expire in the next 30 seconds.
|
379 |
+
$expired = ($this->token['created'] + ($this->token['expires_in'] - 30)) < time();
|
380 |
+
return $expired;
|
381 |
+
}
|
382 |
+
// Gets federated sign-on certificates to use for verifying identity tokens.
|
383 |
+
// Returns certs as array structure, where keys are key ids, and values
|
384 |
+
// are PEM encoded certificates.
|
385 |
+
private function getFederatedSignOnCerts()
|
386 |
+
{
|
387 |
+
return $this->retrieveCertsFromLocation($this->client->getClassConfig($this, 'federated_signon_certs_url'));
|
388 |
+
}
|
389 |
+
|
390 |
+
/**
|
391 |
+
* Retrieve and cache a certificates file.
|
392 |
+
*
|
393 |
+
* @param $url string
|
394 |
+
* location
|
395 |
+
* @throws Google_Auth_Exception
|
396 |
+
* @return array certificates
|
397 |
+
*/
|
398 |
+
public function retrieveCertsFromLocation($url)
|
399 |
+
{
|
400 |
+
// If we're retrieving a local file, just grab it.
|
401 |
+
if ("http" != substr($url, 0, 4)) {
|
402 |
+
$file = file_get_contents($url);
|
403 |
+
if ($file) {
|
404 |
+
return json_decode($file, true);
|
405 |
+
} else {
|
406 |
+
throw new Google_Auth_Exception("Failed to retrieve verification certificates: '" . $url . "'.");
|
407 |
+
}
|
408 |
+
}
|
409 |
+
// This relies on makeRequest caching certificate responses.
|
410 |
+
$request = $this->client->getIo()->makeRequest(new Google_Http_Request($url));
|
411 |
+
if ($request->getResponseHttpCode() == 200) {
|
412 |
+
$certs = json_decode($request->getResponseBody(), true);
|
413 |
+
if ($certs) {
|
414 |
+
return $certs;
|
415 |
+
}
|
416 |
+
}
|
417 |
+
throw new Google_Auth_Exception("Failed to retrieve verification certificates: '" . $request->getResponseBody() . "'.", $request->getResponseHttpCode());
|
418 |
+
}
|
419 |
+
|
420 |
+
/**
|
421 |
+
* Verifies an id token and returns the authenticated apiLoginTicket.
|
422 |
+
* Throws an exception if the id token is not valid.
|
423 |
+
* The audience parameter can be used to control which id tokens are
|
424 |
+
* accepted. By default, the id token must have been issued to this OAuth2 client.
|
425 |
+
*
|
426 |
+
* @param
|
427 |
+
* $id_token
|
428 |
+
* @param
|
429 |
+
* $audience
|
430 |
+
* @return Google_Auth_LoginTicket
|
431 |
+
*/
|
432 |
+
public function verifyIdToken($id_token = null, $audience = null)
|
433 |
+
{
|
434 |
+
if (! $id_token) {
|
435 |
+
$id_token = $this->token['id_token'];
|
436 |
+
}
|
437 |
+
$certs = $this->getFederatedSignonCerts();
|
438 |
+
if (! $audience) {
|
439 |
+
$audience = $this->client->getClassConfig($this, 'client_id');
|
440 |
+
}
|
441 |
+
return $this->verifySignedJwtWithCerts($id_token, $certs, $audience, self::OAUTH2_ISSUER);
|
442 |
+
}
|
443 |
+
|
444 |
+
/**
|
445 |
+
* Verifies the id token, returns the verified token contents.
|
446 |
+
*
|
447 |
+
* @param $jwt string
|
448 |
+
* the token
|
449 |
+
* @param $certs array
|
450 |
+
* of certificates
|
451 |
+
* @param $required_audience string
|
452 |
+
* the expected consumer of the token
|
453 |
+
* @param
|
454 |
+
* [$issuer] the expected issues, defaults to Google
|
455 |
+
* @param
|
456 |
+
* [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
457 |
+
* @throws Google_Auth_Exception
|
458 |
+
* @return mixed token information if valid, false if not
|
459 |
+
*/
|
460 |
+
public function verifySignedJwtWithCerts($jwt, $certs, $required_audience, $issuer = null, $max_expiry = null)
|
461 |
+
{
|
462 |
+
if (! $max_expiry) {
|
463 |
+
// Set the maximum time we will accept a token for.
|
464 |
+
$max_expiry = self::MAX_TOKEN_LIFETIME_SECS;
|
465 |
+
}
|
466 |
+
$segments = explode(".", $jwt);
|
467 |
+
if (count($segments) != 3) {
|
468 |
+
throw new Google_Auth_Exception("Wrong number of segments in token: $jwt");
|
469 |
+
}
|
470 |
+
$signed = $segments[0] . "." . $segments[1];
|
471 |
+
$signature = Google_Utils::urlSafeB64Decode($segments[2]);
|
472 |
+
// Parse envelope.
|
473 |
+
$envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true);
|
474 |
+
if (! $envelope) {
|
475 |
+
throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]);
|
476 |
+
}
|
477 |
+
// Parse token
|
478 |
+
$json_body = Google_Utils::urlSafeB64Decode($segments[1]);
|
479 |
+
$payload = json_decode($json_body, true);
|
480 |
+
if (! $payload) {
|
481 |
+
throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]);
|
482 |
+
}
|
483 |
+
// Check signature
|
484 |
+
$verified = false;
|
485 |
+
foreach ($certs as $keyName => $pem) {
|
486 |
+
$public_key = new Google_Verifier_Pem($pem);
|
487 |
+
if ($public_key->verify($signed, $signature)) {
|
488 |
+
$verified = true;
|
489 |
+
break;
|
490 |
+
}
|
491 |
+
}
|
492 |
+
if (! $verified) {
|
493 |
+
throw new Google_Auth_Exception("Invalid token signature: $jwt");
|
494 |
+
}
|
495 |
+
// Check issued-at timestamp
|
496 |
+
$iat = 0;
|
497 |
+
if (array_key_exists("iat", $payload)) {
|
498 |
+
$iat = $payload["iat"];
|
499 |
+
}
|
500 |
+
if (! $iat) {
|
501 |
+
throw new Google_Auth_Exception("No issue time in token: $json_body");
|
502 |
+
}
|
503 |
+
$earliest = $iat - self::CLOCK_SKEW_SECS;
|
504 |
+
// Check expiration timestamp
|
505 |
+
$now = time();
|
506 |
+
$exp = 0;
|
507 |
+
if (array_key_exists("exp", $payload)) {
|
508 |
+
$exp = $payload["exp"];
|
509 |
+
}
|
510 |
+
if (! $exp) {
|
511 |
+
throw new Google_Auth_Exception("No expiration time in token: $json_body");
|
512 |
+
}
|
513 |
+
if ($exp >= $now + $max_expiry) {
|
514 |
+
throw new Google_Auth_Exception(sprintf("Expiration time too far in future: %s", $json_body));
|
515 |
+
}
|
516 |
+
$latest = $exp + self::CLOCK_SKEW_SECS;
|
517 |
+
if ($now < $earliest) {
|
518 |
+
throw new Google_Auth_Exception(sprintf("Token used too early, %s < %s: %s", $now, $earliest, $json_body));
|
519 |
+
}
|
520 |
+
if ($now > $latest) {
|
521 |
+
throw new Google_Auth_Exception(sprintf("Token used too late, %s > %s: %s", $now, $latest, $json_body));
|
522 |
+
}
|
523 |
+
$iss = $payload['iss'];
|
524 |
+
if ($issuer && $iss != $issuer) {
|
525 |
+
throw new Google_Auth_Exception(sprintf("Invalid issuer, %s != %s: %s", $iss, $issuer, $json_body));
|
526 |
+
}
|
527 |
+
// Check audience
|
528 |
+
$aud = $payload["aud"];
|
529 |
+
if ($aud != $required_audience) {
|
530 |
+
throw new Google_Auth_Exception(sprintf("Wrong recipient, %s != %s:", $aud, $required_audience, $json_body));
|
531 |
+
}
|
532 |
+
// All good.
|
533 |
+
return new Google_Auth_LoginTicket($envelope, $payload);
|
534 |
+
}
|
535 |
+
|
536 |
+
/**
|
537 |
+
* Add a parameter to the auth params if not empty string.
|
538 |
+
*/
|
539 |
+
private function maybeAddParam($params, $name)
|
540 |
+
{
|
541 |
+
$param = $this->client->getClassConfig($this, $name);
|
542 |
+
if ($param != '') {
|
543 |
+
$params[$name] = $param;
|
544 |
+
}
|
545 |
+
return $params;
|
546 |
+
}
|
547 |
}
|
tools/src/Google/Auth/Simple.php
CHANGED
@@ -1,65 +1,65 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Simple API access implementation.
|
21 |
-
* Can either be used to make requests
|
22 |
-
* completely unauthenticated, or by using a Simple API Access developer
|
23 |
-
* key.
|
24 |
-
*
|
25 |
-
* @author Chris Chabot <chabotc@google.com>
|
26 |
-
* @author Chirag Shah <chirags@google.com>
|
27 |
-
*/
|
28 |
-
class Google_Auth_Simple extends Google_Auth_Abstract
|
29 |
-
{
|
30 |
-
|
31 |
-
private $key = null;
|
32 |
-
|
33 |
-
private $client;
|
34 |
-
|
35 |
-
public function __construct(Google_Client $client, $config = null)
|
36 |
-
{
|
37 |
-
$this->client = $client;
|
38 |
-
}
|
39 |
-
|
40 |
-
/**
|
41 |
-
* Perform an authenticated / signed apiHttpRequest.
|
42 |
-
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
43 |
-
* (which can modify the request in what ever way fits the auth mechanism)
|
44 |
-
* and then calls apiCurlIO::makeRequest on the signed request
|
45 |
-
*
|
46 |
-
* @param Google_Http_Request $request
|
47 |
-
* @return Google_Http_Request The resulting HTTP response including the
|
48 |
-
* responseHttpCode, responseHeaders and responseBody.
|
49 |
-
*/
|
50 |
-
public function authenticatedRequest(Google_Http_Request $request)
|
51 |
-
{
|
52 |
-
$request = $this->sign($request);
|
53 |
-
return $this->io->makeRequest($request);
|
54 |
-
}
|
55 |
-
|
56 |
-
public function sign(Google_Http_Request $request)
|
57 |
-
{
|
58 |
-
$key = $this->client->getClassConfig($this, 'developer_key');
|
59 |
-
if ($key) {
|
60 |
-
$this->client->getLogger()->debug('Simple API Access developer key authentication');
|
61 |
-
$request->setQueryParam('key', $key);
|
62 |
-
}
|
63 |
-
return $request;
|
64 |
-
}
|
65 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Simple API access implementation.
|
21 |
+
* Can either be used to make requests
|
22 |
+
* completely unauthenticated, or by using a Simple API Access developer
|
23 |
+
* key.
|
24 |
+
*
|
25 |
+
* @author Chris Chabot <chabotc@google.com>
|
26 |
+
* @author Chirag Shah <chirags@google.com>
|
27 |
+
*/
|
28 |
+
class Google_Auth_Simple extends Google_Auth_Abstract
|
29 |
+
{
|
30 |
+
|
31 |
+
private $key = null;
|
32 |
+
|
33 |
+
private $client;
|
34 |
+
|
35 |
+
public function __construct(Google_Client $client, $config = null)
|
36 |
+
{
|
37 |
+
$this->client = $client;
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Perform an authenticated / signed apiHttpRequest.
|
42 |
+
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
43 |
+
* (which can modify the request in what ever way fits the auth mechanism)
|
44 |
+
* and then calls apiCurlIO::makeRequest on the signed request
|
45 |
+
*
|
46 |
+
* @param Google_Http_Request $request
|
47 |
+
* @return Google_Http_Request The resulting HTTP response including the
|
48 |
+
* responseHttpCode, responseHeaders and responseBody.
|
49 |
+
*/
|
50 |
+
public function authenticatedRequest(Google_Http_Request $request)
|
51 |
+
{
|
52 |
+
$request = $this->sign($request);
|
53 |
+
return $this->io->makeRequest($request);
|
54 |
+
}
|
55 |
+
|
56 |
+
public function sign(Google_Http_Request $request)
|
57 |
+
{
|
58 |
+
$key = $this->client->getClassConfig($this, 'developer_key');
|
59 |
+
if ($key) {
|
60 |
+
$this->client->getLogger()->debug('Simple API Access developer key authentication');
|
61 |
+
$request->setQueryParam('key', $key);
|
62 |
+
}
|
63 |
+
return $request;
|
64 |
+
}
|
65 |
}
|
tools/src/Google/Cache/Abstract.php
CHANGED
@@ -1,58 +1,58 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
* Copyright 2008 Google Inc.
|
5 |
-
*
|
6 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
-
* you may not use this file except in compliance with the License.
|
8 |
-
* You may obtain a copy of the License at
|
9 |
-
*
|
10 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
-
*
|
12 |
-
* Unless required by applicable law or agreed to in writing, software
|
13 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
-
* See the License for the specific language governing permissions and
|
16 |
-
* limitations under the License.
|
17 |
-
*/
|
18 |
-
/**
|
19 |
-
* Abstract storage class
|
20 |
-
*
|
21 |
-
* @author Chris Chabot <chabotc@google.com>
|
22 |
-
*/
|
23 |
-
abstract class Google_Cache_Abstract
|
24 |
-
{
|
25 |
-
|
26 |
-
abstract public function __construct(Google_Client $client);
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Retrieves the data for the given key, or false if they
|
30 |
-
* key is unknown or expired
|
31 |
-
*
|
32 |
-
* @param String $key
|
33 |
-
* The key who's data to retrieve
|
34 |
-
* @param boolean|int $expiration
|
35 |
-
* Expiration time in seconds
|
36 |
-
*
|
37 |
-
*/
|
38 |
-
abstract public function get($key, $expiration = false);
|
39 |
-
|
40 |
-
/**
|
41 |
-
* Store the key => $value set.
|
42 |
-
* The $value is serialized
|
43 |
-
* by this function so can be of any type
|
44 |
-
*
|
45 |
-
* @param string $key
|
46 |
-
* Key of the data
|
47 |
-
* @param string $value
|
48 |
-
* data
|
49 |
-
*/
|
50 |
-
abstract public function set($key, $value);
|
51 |
-
|
52 |
-
/**
|
53 |
-
* Removes the key/data pair for the given $key
|
54 |
-
*
|
55 |
-
* @param String $key
|
56 |
-
*/
|
57 |
-
abstract public function delete($key);
|
58 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright 2008 Google Inc.
|
5 |
+
*
|
6 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
+
* you may not use this file except in compliance with the License.
|
8 |
+
* You may obtain a copy of the License at
|
9 |
+
*
|
10 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
+
*
|
12 |
+
* Unless required by applicable law or agreed to in writing, software
|
13 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
+
* See the License for the specific language governing permissions and
|
16 |
+
* limitations under the License.
|
17 |
+
*/
|
18 |
+
/**
|
19 |
+
* Abstract storage class
|
20 |
+
*
|
21 |
+
* @author Chris Chabot <chabotc@google.com>
|
22 |
+
*/
|
23 |
+
abstract class Google_Cache_Abstract
|
24 |
+
{
|
25 |
+
|
26 |
+
abstract public function __construct(Google_Client $client);
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Retrieves the data for the given key, or false if they
|
30 |
+
* key is unknown or expired
|
31 |
+
*
|
32 |
+
* @param String $key
|
33 |
+
* The key who's data to retrieve
|
34 |
+
* @param boolean|int $expiration
|
35 |
+
* Expiration time in seconds
|
36 |
+
*
|
37 |
+
*/
|
38 |
+
abstract public function get($key, $expiration = false);
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Store the key => $value set.
|
42 |
+
* The $value is serialized
|
43 |
+
* by this function so can be of any type
|
44 |
+
*
|
45 |
+
* @param string $key
|
46 |
+
* Key of the data
|
47 |
+
* @param string $value
|
48 |
+
* data
|
49 |
+
*/
|
50 |
+
abstract public function set($key, $value);
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Removes the key/data pair for the given $key
|
54 |
+
*
|
55 |
+
* @param String $key
|
56 |
+
*/
|
57 |
+
abstract public function delete($key);
|
58 |
}
|
tools/src/Google/Cache/Apc.php
CHANGED
@@ -1,108 +1,108 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* A persistent storage class based on the APC cache, which is not
|
21 |
-
* really very persistent, as soon as you restart your web server
|
22 |
-
* the storage will be wiped, however for debugging and/or speed
|
23 |
-
* it can be useful, and cache is a lot cheaper then storage.
|
24 |
-
*
|
25 |
-
* @author Chris Chabot <chabotc@google.com>
|
26 |
-
*/
|
27 |
-
class Google_Cache_Apc extends Google_Cache_Abstract
|
28 |
-
{
|
29 |
-
|
30 |
-
/**
|
31 |
-
*
|
32 |
-
* @var Google_Client the current client
|
33 |
-
*/
|
34 |
-
private $client;
|
35 |
-
|
36 |
-
public function __construct(Google_Client $client)
|
37 |
-
{
|
38 |
-
if (! function_exists('apc_add')) {
|
39 |
-
$error = "Apc functions not available";
|
40 |
-
$client->getLogger()->error($error);
|
41 |
-
throw new Google_Cache_Exception($error);
|
42 |
-
}
|
43 |
-
$this->client = $client;
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* @inheritDoc
|
48 |
-
*/
|
49 |
-
public function get($key, $expiration = false)
|
50 |
-
{
|
51 |
-
$ret = apc_fetch($key);
|
52 |
-
if ($ret === false) {
|
53 |
-
$this->client->getLogger()->debug('APC cache miss', array(
|
54 |
-
'key' => $key
|
55 |
-
));
|
56 |
-
return false;
|
57 |
-
}
|
58 |
-
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
59 |
-
$this->client->getLogger()->debug('APC cache miss (expired)', array(
|
60 |
-
'key' => $key,
|
61 |
-
'var' => $ret
|
62 |
-
));
|
63 |
-
$this->delete($key);
|
64 |
-
return false;
|
65 |
-
}
|
66 |
-
$this->client->getLogger()->debug('APC cache hit', array(
|
67 |
-
'key' => $key,
|
68 |
-
'var' => $ret
|
69 |
-
));
|
70 |
-
return $ret['data'];
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* @inheritDoc
|
75 |
-
*/
|
76 |
-
public function set($key, $value)
|
77 |
-
{
|
78 |
-
$var = array(
|
79 |
-
'time' => time(),
|
80 |
-
'data' => $value
|
81 |
-
);
|
82 |
-
$rc = apc_store($key, $var);
|
83 |
-
if ($rc == false) {
|
84 |
-
$this->client->getLogger()->error('APC cache set failed', array(
|
85 |
-
'key' => $key,
|
86 |
-
'var' => $var
|
87 |
-
));
|
88 |
-
throw new Google_Cache_Exception("Couldn't store data");
|
89 |
-
}
|
90 |
-
$this->client->getLogger()->debug('APC cache set', array(
|
91 |
-
'key' => $key,
|
92 |
-
'var' => $var
|
93 |
-
));
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* @inheritDoc
|
98 |
-
*
|
99 |
-
* @param String $key
|
100 |
-
*/
|
101 |
-
public function delete($key)
|
102 |
-
{
|
103 |
-
$this->client->getLogger()->debug('APC cache delete', array(
|
104 |
-
'key' => $key
|
105 |
-
));
|
106 |
-
apc_delete($key);
|
107 |
-
}
|
108 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* A persistent storage class based on the APC cache, which is not
|
21 |
+
* really very persistent, as soon as you restart your web server
|
22 |
+
* the storage will be wiped, however for debugging and/or speed
|
23 |
+
* it can be useful, and cache is a lot cheaper then storage.
|
24 |
+
*
|
25 |
+
* @author Chris Chabot <chabotc@google.com>
|
26 |
+
*/
|
27 |
+
class Google_Cache_Apc extends Google_Cache_Abstract
|
28 |
+
{
|
29 |
+
|
30 |
+
/**
|
31 |
+
*
|
32 |
+
* @var Google_Client the current client
|
33 |
+
*/
|
34 |
+
private $client;
|
35 |
+
|
36 |
+
public function __construct(Google_Client $client)
|
37 |
+
{
|
38 |
+
if (! function_exists('apc_add')) {
|
39 |
+
$error = "Apc functions not available";
|
40 |
+
$client->getLogger()->error($error);
|
41 |
+
throw new Google_Cache_Exception($error);
|
42 |
+
}
|
43 |
+
$this->client = $client;
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @inheritDoc
|
48 |
+
*/
|
49 |
+
public function get($key, $expiration = false)
|
50 |
+
{
|
51 |
+
$ret = apc_fetch($key);
|
52 |
+
if ($ret === false) {
|
53 |
+
$this->client->getLogger()->debug('APC cache miss', array(
|
54 |
+
'key' => $key
|
55 |
+
));
|
56 |
+
return false;
|
57 |
+
}
|
58 |
+
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
59 |
+
$this->client->getLogger()->debug('APC cache miss (expired)', array(
|
60 |
+
'key' => $key,
|
61 |
+
'var' => $ret
|
62 |
+
));
|
63 |
+
$this->delete($key);
|
64 |
+
return false;
|
65 |
+
}
|
66 |
+
$this->client->getLogger()->debug('APC cache hit', array(
|
67 |
+
'key' => $key,
|
68 |
+
'var' => $ret
|
69 |
+
));
|
70 |
+
return $ret['data'];
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* @inheritDoc
|
75 |
+
*/
|
76 |
+
public function set($key, $value)
|
77 |
+
{
|
78 |
+
$var = array(
|
79 |
+
'time' => time(),
|
80 |
+
'data' => $value
|
81 |
+
);
|
82 |
+
$rc = apc_store($key, $var);
|
83 |
+
if ($rc == false) {
|
84 |
+
$this->client->getLogger()->error('APC cache set failed', array(
|
85 |
+
'key' => $key,
|
86 |
+
'var' => $var
|
87 |
+
));
|
88 |
+
throw new Google_Cache_Exception("Couldn't store data");
|
89 |
+
}
|
90 |
+
$this->client->getLogger()->debug('APC cache set', array(
|
91 |
+
'key' => $key,
|
92 |
+
'var' => $var
|
93 |
+
));
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* @inheritDoc
|
98 |
+
*
|
99 |
+
* @param String $key
|
100 |
+
*/
|
101 |
+
public function delete($key)
|
102 |
+
{
|
103 |
+
$this->client->getLogger()->debug('APC cache delete', array(
|
104 |
+
'key' => $key
|
105 |
+
));
|
106 |
+
apc_delete($key);
|
107 |
+
}
|
108 |
}
|
tools/src/Google/Cache/Exception.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
class Google_Cache_Exception extends Google_Exception
|
20 |
-
{
|
21 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
class Google_Cache_Exception extends Google_Exception
|
20 |
+
{
|
21 |
}
|
tools/src/Google/Cache/File.php
CHANGED
@@ -1,186 +1,186 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2008 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/*
|
20 |
-
* This class implements a basic on disk storage. While that does
|
21 |
-
* work quite well it's not the most elegant and scalable solution.
|
22 |
-
* It will also get you into a heap of trouble when you try to run
|
23 |
-
* this in a clustered environment.
|
24 |
-
*
|
25 |
-
* @author Chris Chabot <chabotc@google.com>
|
26 |
-
*/
|
27 |
-
class Google_Cache_File extends Google_Cache_Abstract
|
28 |
-
{
|
29 |
-
|
30 |
-
const MAX_LOCK_RETRIES = 10;
|
31 |
-
|
32 |
-
private $path;
|
33 |
-
|
34 |
-
private $fh;
|
35 |
-
|
36 |
-
/**
|
37 |
-
*
|
38 |
-
* @var Google_Client the current client
|
39 |
-
*/
|
40 |
-
private $client;
|
41 |
-
|
42 |
-
public function __construct(Google_Client $client)
|
43 |
-
{
|
44 |
-
$this->client = $client;
|
45 |
-
$this->path = $this->client->getClassConfig($this, 'directory');
|
46 |
-
}
|
47 |
-
|
48 |
-
public function get($key, $expiration = false)
|
49 |
-
{
|
50 |
-
$storageFile = $this->getCacheFile($key);
|
51 |
-
$data = false;
|
52 |
-
if (! file_exists($storageFile)) {
|
53 |
-
$this->client->getLogger()->debug('File cache miss', array(
|
54 |
-
'key' => $key,
|
55 |
-
'file' => $storageFile
|
56 |
-
));
|
57 |
-
return false;
|
58 |
-
}
|
59 |
-
if ($expiration) {
|
60 |
-
$mtime = filemtime($storageFile);
|
61 |
-
if ((time() - $mtime) >= $expiration) {
|
62 |
-
$this->client->getLogger()->debug('File cache miss (expired)', array(
|
63 |
-
'key' => $key,
|
64 |
-
'file' => $storageFile
|
65 |
-
));
|
66 |
-
$this->delete($key);
|
67 |
-
return false;
|
68 |
-
}
|
69 |
-
}
|
70 |
-
if ($this->acquireReadLock($storageFile)) {
|
71 |
-
$data = fread($this->fh, filesize($storageFile));
|
72 |
-
$data = unserialize($data);
|
73 |
-
$this->unlock($storageFile);
|
74 |
-
}
|
75 |
-
$this->client->getLogger()->debug('File cache hit', array(
|
76 |
-
'key' => $key,
|
77 |
-
'file' => $storageFile,
|
78 |
-
'var' => $data
|
79 |
-
));
|
80 |
-
return $data;
|
81 |
-
}
|
82 |
-
|
83 |
-
public function set($key, $value)
|
84 |
-
{
|
85 |
-
$storageFile = $this->getWriteableCacheFile($key);
|
86 |
-
if ($this->acquireWriteLock($storageFile)) {
|
87 |
-
// We serialize the whole request object, since we don't only want the
|
88 |
-
// responseContent but also the postBody used, headers, size, etc.
|
89 |
-
$data = serialize($value);
|
90 |
-
$result = fwrite($this->fh, $data);
|
91 |
-
$this->unlock($storageFile);
|
92 |
-
$this->client->getLogger()->debug('File cache set', array(
|
93 |
-
'key' => $key,
|
94 |
-
'file' => $storageFile,
|
95 |
-
'var' => $value
|
96 |
-
));
|
97 |
-
} else {
|
98 |
-
$this->client->getLogger()->notice('File cache set failed', array(
|
99 |
-
'key' => $key,
|
100 |
-
'file' => $storageFile
|
101 |
-
));
|
102 |
-
}
|
103 |
-
}
|
104 |
-
|
105 |
-
public function delete($key)
|
106 |
-
{
|
107 |
-
$file = $this->getCacheFile($key);
|
108 |
-
if (file_exists($file) && ! unlink($file)) {
|
109 |
-
$this->client->getLogger()->error('File cache delete failed', array(
|
110 |
-
'key' => $key,
|
111 |
-
'file' => $file
|
112 |
-
));
|
113 |
-
throw new Google_Cache_Exception("Cache file could not be deleted");
|
114 |
-
}
|
115 |
-
$this->client->getLogger()->debug('File cache delete', array(
|
116 |
-
'key' => $key,
|
117 |
-
'file' => $file
|
118 |
-
));
|
119 |
-
}
|
120 |
-
|
121 |
-
private function getWriteableCacheFile($file)
|
122 |
-
{
|
123 |
-
return $this->getCacheFile($file, true);
|
124 |
-
}
|
125 |
-
|
126 |
-
private function getCacheFile($file, $forWrite = false)
|
127 |
-
{
|
128 |
-
return $this->getCacheDir($file, $forWrite) . '/' . md5($file);
|
129 |
-
}
|
130 |
-
|
131 |
-
private function getCacheDir($file, $forWrite)
|
132 |
-
{
|
133 |
-
// use the first 2 characters of the hash as a directory prefix
|
134 |
-
// this should prevent slowdowns due to huge directory listings
|
135 |
-
// and thus give some basic amount of scalability
|
136 |
-
$storageDir = $this->path . '/' . substr(md5($file), 0, 2);
|
137 |
-
if ($forWrite && ! is_dir($storageDir)) {
|
138 |
-
if (! mkdir($storageDir, 0755, true)) {
|
139 |
-
$this->client->getLogger()->error('File cache creation failed', array(
|
140 |
-
'dir' => $storageDir
|
141 |
-
));
|
142 |
-
throw new Google_Cache_Exception("Could not create storage directory: $storageDir");
|
143 |
-
}
|
144 |
-
}
|
145 |
-
return $storageDir;
|
146 |
-
}
|
147 |
-
|
148 |
-
private function acquireReadLock($storageFile)
|
149 |
-
{
|
150 |
-
return $this->acquireLock(LOCK_SH, $storageFile);
|
151 |
-
}
|
152 |
-
|
153 |
-
private function acquireWriteLock($storageFile)
|
154 |
-
{
|
155 |
-
$rc = $this->acquireLock(LOCK_EX, $storageFile);
|
156 |
-
if (! $rc) {
|
157 |
-
$this->client->getLogger()->notice('File cache write lock failed', array(
|
158 |
-
'file' => $storageFile
|
159 |
-
));
|
160 |
-
$this->delete($storageFile);
|
161 |
-
}
|
162 |
-
return $rc;
|
163 |
-
}
|
164 |
-
|
165 |
-
private function acquireLock($type, $storageFile)
|
166 |
-
{
|
167 |
-
$mode = $type == LOCK_EX ? "w" : "r";
|
168 |
-
$this->fh = fopen($storageFile, $mode);
|
169 |
-
$count = 0;
|
170 |
-
while (! flock($this->fh, $type | LOCK_NB)) {
|
171 |
-
// Sleep for 10ms.
|
172 |
-
usleep(10000);
|
173 |
-
if (++ $count < self::MAX_LOCK_RETRIES) {
|
174 |
-
return false;
|
175 |
-
}
|
176 |
-
}
|
177 |
-
return true;
|
178 |
-
}
|
179 |
-
|
180 |
-
public function unlock($storageFile)
|
181 |
-
{
|
182 |
-
if ($this->fh) {
|
183 |
-
flock($this->fh, LOCK_UN);
|
184 |
-
}
|
185 |
-
}
|
186 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2008 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/*
|
20 |
+
* This class implements a basic on disk storage. While that does
|
21 |
+
* work quite well it's not the most elegant and scalable solution.
|
22 |
+
* It will also get you into a heap of trouble when you try to run
|
23 |
+
* this in a clustered environment.
|
24 |
+
*
|
25 |
+
* @author Chris Chabot <chabotc@google.com>
|
26 |
+
*/
|
27 |
+
class Google_Cache_File extends Google_Cache_Abstract
|
28 |
+
{
|
29 |
+
|
30 |
+
const MAX_LOCK_RETRIES = 10;
|
31 |
+
|
32 |
+
private $path;
|
33 |
+
|
34 |
+
private $fh;
|
35 |
+
|
36 |
+
/**
|
37 |
+
*
|
38 |
+
* @var Google_Client the current client
|
39 |
+
*/
|
40 |
+
private $client;
|
41 |
+
|
42 |
+
public function __construct(Google_Client $client)
|
43 |
+
{
|
44 |
+
$this->client = $client;
|
45 |
+
$this->path = $this->client->getClassConfig($this, 'directory');
|
46 |
+
}
|
47 |
+
|
48 |
+
public function get($key, $expiration = false)
|
49 |
+
{
|
50 |
+
$storageFile = $this->getCacheFile($key);
|
51 |
+
$data = false;
|
52 |
+
if (! file_exists($storageFile)) {
|
53 |
+
$this->client->getLogger()->debug('File cache miss', array(
|
54 |
+
'key' => $key,
|
55 |
+
'file' => $storageFile
|
56 |
+
));
|
57 |
+
return false;
|
58 |
+
}
|
59 |
+
if ($expiration) {
|
60 |
+
$mtime = filemtime($storageFile);
|
61 |
+
if ((time() - $mtime) >= $expiration) {
|
62 |
+
$this->client->getLogger()->debug('File cache miss (expired)', array(
|
63 |
+
'key' => $key,
|
64 |
+
'file' => $storageFile
|
65 |
+
));
|
66 |
+
$this->delete($key);
|
67 |
+
return false;
|
68 |
+
}
|
69 |
+
}
|
70 |
+
if ($this->acquireReadLock($storageFile)) {
|
71 |
+
$data = fread($this->fh, filesize($storageFile));
|
72 |
+
$data = unserialize($data);
|
73 |
+
$this->unlock($storageFile);
|
74 |
+
}
|
75 |
+
$this->client->getLogger()->debug('File cache hit', array(
|
76 |
+
'key' => $key,
|
77 |
+
'file' => $storageFile,
|
78 |
+
'var' => $data
|
79 |
+
));
|
80 |
+
return $data;
|
81 |
+
}
|
82 |
+
|
83 |
+
public function set($key, $value)
|
84 |
+
{
|
85 |
+
$storageFile = $this->getWriteableCacheFile($key);
|
86 |
+
if ($this->acquireWriteLock($storageFile)) {
|
87 |
+
// We serialize the whole request object, since we don't only want the
|
88 |
+
// responseContent but also the postBody used, headers, size, etc.
|
89 |
+
$data = serialize($value);
|
90 |
+
$result = fwrite($this->fh, $data);
|
91 |
+
$this->unlock($storageFile);
|
92 |
+
$this->client->getLogger()->debug('File cache set', array(
|
93 |
+
'key' => $key,
|
94 |
+
'file' => $storageFile,
|
95 |
+
'var' => $value
|
96 |
+
));
|
97 |
+
} else {
|
98 |
+
$this->client->getLogger()->notice('File cache set failed', array(
|
99 |
+
'key' => $key,
|
100 |
+
'file' => $storageFile
|
101 |
+
));
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
public function delete($key)
|
106 |
+
{
|
107 |
+
$file = $this->getCacheFile($key);
|
108 |
+
if (file_exists($file) && ! unlink($file)) {
|
109 |
+
$this->client->getLogger()->error('File cache delete failed', array(
|
110 |
+
'key' => $key,
|
111 |
+
'file' => $file
|
112 |
+
));
|
113 |
+
throw new Google_Cache_Exception("Cache file could not be deleted");
|
114 |
+
}
|
115 |
+
$this->client->getLogger()->debug('File cache delete', array(
|
116 |
+
'key' => $key,
|
117 |
+
'file' => $file
|
118 |
+
));
|
119 |
+
}
|
120 |
+
|
121 |
+
private function getWriteableCacheFile($file)
|
122 |
+
{
|
123 |
+
return $this->getCacheFile($file, true);
|
124 |
+
}
|
125 |
+
|
126 |
+
private function getCacheFile($file, $forWrite = false)
|
127 |
+
{
|
128 |
+
return $this->getCacheDir($file, $forWrite) . '/' . md5($file);
|
129 |
+
}
|
130 |
+
|
131 |
+
private function getCacheDir($file, $forWrite)
|
132 |
+
{
|
133 |
+
// use the first 2 characters of the hash as a directory prefix
|
134 |
+
// this should prevent slowdowns due to huge directory listings
|
135 |
+
// and thus give some basic amount of scalability
|
136 |
+
$storageDir = $this->path . '/' . substr(md5($file), 0, 2);
|
137 |
+
if ($forWrite && ! is_dir($storageDir)) {
|
138 |
+
if (! mkdir($storageDir, 0755, true)) {
|
139 |
+
$this->client->getLogger()->error('File cache creation failed', array(
|
140 |
+
'dir' => $storageDir
|
141 |
+
));
|
142 |
+
throw new Google_Cache_Exception("Could not create storage directory: $storageDir");
|
143 |
+
}
|
144 |
+
}
|
145 |
+
return $storageDir;
|
146 |
+
}
|
147 |
+
|
148 |
+
private function acquireReadLock($storageFile)
|
149 |
+
{
|
150 |
+
return $this->acquireLock(LOCK_SH, $storageFile);
|
151 |
+
}
|
152 |
+
|
153 |
+
private function acquireWriteLock($storageFile)
|
154 |
+
{
|
155 |
+
$rc = $this->acquireLock(LOCK_EX, $storageFile);
|
156 |
+
if (! $rc) {
|
157 |
+
$this->client->getLogger()->notice('File cache write lock failed', array(
|
158 |
+
'file' => $storageFile
|
159 |
+
));
|
160 |
+
$this->delete($storageFile);
|
161 |
+
}
|
162 |
+
return $rc;
|
163 |
+
}
|
164 |
+
|
165 |
+
private function acquireLock($type, $storageFile)
|
166 |
+
{
|
167 |
+
$mode = $type == LOCK_EX ? "w" : "r";
|
168 |
+
$this->fh = fopen($storageFile, $mode);
|
169 |
+
$count = 0;
|
170 |
+
while (! flock($this->fh, $type | LOCK_NB)) {
|
171 |
+
// Sleep for 10ms.
|
172 |
+
usleep(10000);
|
173 |
+
if (++ $count < self::MAX_LOCK_RETRIES) {
|
174 |
+
return false;
|
175 |
+
}
|
176 |
+
}
|
177 |
+
return true;
|
178 |
+
}
|
179 |
+
|
180 |
+
public function unlock($storageFile)
|
181 |
+
{
|
182 |
+
if ($this->fh) {
|
183 |
+
flock($this->fh, LOCK_UN);
|
184 |
+
}
|
185 |
+
}
|
186 |
}
|
tools/src/Google/Cache/Memcache.php
CHANGED
@@ -1,178 +1,178 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2008 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* A persistent storage class based on the memcache, which is not
|
21 |
-
* really very persistent, as soon as you restart your memcache daemon
|
22 |
-
* the storage will be wiped.
|
23 |
-
*
|
24 |
-
* Will use either the memcache or memcached extensions, preferring
|
25 |
-
* memcached.
|
26 |
-
*
|
27 |
-
* @author Chris Chabot <chabotc@google.com>
|
28 |
-
*/
|
29 |
-
class Google_Cache_Memcache extends Google_Cache_Abstract
|
30 |
-
{
|
31 |
-
|
32 |
-
private $connection = false;
|
33 |
-
|
34 |
-
private $mc = false;
|
35 |
-
|
36 |
-
private $host;
|
37 |
-
|
38 |
-
private $port;
|
39 |
-
|
40 |
-
/**
|
41 |
-
*
|
42 |
-
* @var Google_Client the current client
|
43 |
-
*/
|
44 |
-
private $client;
|
45 |
-
|
46 |
-
public function __construct(Google_Client $client)
|
47 |
-
{
|
48 |
-
if (! function_exists('memcache_connect') && ! class_exists("Memcached")) {
|
49 |
-
$error = "Memcache functions not available";
|
50 |
-
$client->getLogger()->error($error);
|
51 |
-
throw new Google_Cache_Exception($error);
|
52 |
-
}
|
53 |
-
$this->client = $client;
|
54 |
-
if ($client->isAppEngine()) {
|
55 |
-
// No credentials needed for GAE.
|
56 |
-
$this->mc = new Memcached();
|
57 |
-
$this->connection = true;
|
58 |
-
} else {
|
59 |
-
$this->host = $client->getClassConfig($this, 'host');
|
60 |
-
$this->port = $client->getClassConfig($this, 'port');
|
61 |
-
if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) {
|
62 |
-
$error = "You need to supply a valid memcache host and port";
|
63 |
-
$client->getLogger()->error($error);
|
64 |
-
throw new Google_Cache_Exception($error);
|
65 |
-
}
|
66 |
-
}
|
67 |
-
}
|
68 |
-
|
69 |
-
/**
|
70 |
-
* @inheritDoc
|
71 |
-
*/
|
72 |
-
public function get($key, $expiration = false)
|
73 |
-
{
|
74 |
-
$this->connect();
|
75 |
-
$ret = false;
|
76 |
-
if ($this->mc) {
|
77 |
-
$ret = $this->mc->get($key);
|
78 |
-
} else {
|
79 |
-
$ret = memcache_get($this->connection, $key);
|
80 |
-
}
|
81 |
-
if ($ret === false) {
|
82 |
-
$this->client->getLogger()->debug('Memcache cache miss', array(
|
83 |
-
'key' => $key
|
84 |
-
));
|
85 |
-
return false;
|
86 |
-
}
|
87 |
-
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
88 |
-
$this->client->getLogger()->debug('Memcache cache miss (expired)', array(
|
89 |
-
'key' => $key,
|
90 |
-
'var' => $ret
|
91 |
-
));
|
92 |
-
$this->delete($key);
|
93 |
-
return false;
|
94 |
-
}
|
95 |
-
$this->client->getLogger()->debug('Memcache cache hit', array(
|
96 |
-
'key' => $key,
|
97 |
-
'var' => $ret
|
98 |
-
));
|
99 |
-
return $ret['data'];
|
100 |
-
}
|
101 |
-
|
102 |
-
/**
|
103 |
-
* @inheritDoc
|
104 |
-
*
|
105 |
-
* @param string $key
|
106 |
-
* @param string $value
|
107 |
-
* @throws Google_Cache_Exception
|
108 |
-
*/
|
109 |
-
public function set($key, $value)
|
110 |
-
{
|
111 |
-
$this->connect();
|
112 |
-
// we store it with the cache_time default expiration so objects will at
|
113 |
-
// least get cleaned eventually.
|
114 |
-
$data = array(
|
115 |
-
'time' => time(),
|
116 |
-
'data' => $value
|
117 |
-
);
|
118 |
-
$rc = false;
|
119 |
-
if ($this->mc) {
|
120 |
-
$rc = $this->mc->set($key, $data);
|
121 |
-
} else {
|
122 |
-
$rc = memcache_set($this->connection, $key, $data, false);
|
123 |
-
}
|
124 |
-
if ($rc == false) {
|
125 |
-
$this->client->getLogger()->error('Memcache cache set failed', array(
|
126 |
-
'key' => $key,
|
127 |
-
'var' => $data
|
128 |
-
));
|
129 |
-
throw new Google_Cache_Exception("Couldn't store data in cache");
|
130 |
-
}
|
131 |
-
$this->client->getLogger()->debug('Memcache cache set', array(
|
132 |
-
'key' => $key,
|
133 |
-
'var' => $data
|
134 |
-
));
|
135 |
-
}
|
136 |
-
|
137 |
-
/**
|
138 |
-
* @inheritDoc
|
139 |
-
*
|
140 |
-
* @param String $key
|
141 |
-
*/
|
142 |
-
public function delete($key)
|
143 |
-
{
|
144 |
-
$this->connect();
|
145 |
-
if ($this->mc) {
|
146 |
-
$this->mc->delete($key, 0);
|
147 |
-
} else {
|
148 |
-
memcache_delete($this->connection, $key, 0);
|
149 |
-
}
|
150 |
-
$this->client->getLogger()->debug('Memcache cache delete', array(
|
151 |
-
'key' => $key
|
152 |
-
));
|
153 |
-
}
|
154 |
-
|
155 |
-
/**
|
156 |
-
* Lazy initialiser for memcache connection.
|
157 |
-
* Uses pconnect for to take
|
158 |
-
* advantage of the persistence pool where possible.
|
159 |
-
*/
|
160 |
-
private function connect()
|
161 |
-
{
|
162 |
-
if ($this->connection) {
|
163 |
-
return;
|
164 |
-
}
|
165 |
-
if (class_exists("Memcached")) {
|
166 |
-
$this->mc = new Memcached();
|
167 |
-
$this->mc->addServer($this->host, $this->port);
|
168 |
-
$this->connection = true;
|
169 |
-
} else {
|
170 |
-
$this->connection = memcache_pconnect($this->host, $this->port);
|
171 |
-
}
|
172 |
-
if (! $this->connection) {
|
173 |
-
$error = "Couldn't connect to memcache server";
|
174 |
-
$this->client->getLogger()->error($error);
|
175 |
-
throw new Google_Cache_Exception($error);
|
176 |
-
}
|
177 |
-
}
|
178 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2008 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* A persistent storage class based on the memcache, which is not
|
21 |
+
* really very persistent, as soon as you restart your memcache daemon
|
22 |
+
* the storage will be wiped.
|
23 |
+
*
|
24 |
+
* Will use either the memcache or memcached extensions, preferring
|
25 |
+
* memcached.
|
26 |
+
*
|
27 |
+
* @author Chris Chabot <chabotc@google.com>
|
28 |
+
*/
|
29 |
+
class Google_Cache_Memcache extends Google_Cache_Abstract
|
30 |
+
{
|
31 |
+
|
32 |
+
private $connection = false;
|
33 |
+
|
34 |
+
private $mc = false;
|
35 |
+
|
36 |
+
private $host;
|
37 |
+
|
38 |
+
private $port;
|
39 |
+
|
40 |
+
/**
|
41 |
+
*
|
42 |
+
* @var Google_Client the current client
|
43 |
+
*/
|
44 |
+
private $client;
|
45 |
+
|
46 |
+
public function __construct(Google_Client $client)
|
47 |
+
{
|
48 |
+
if (! function_exists('memcache_connect') && ! class_exists("Memcached")) {
|
49 |
+
$error = "Memcache functions not available";
|
50 |
+
$client->getLogger()->error($error);
|
51 |
+
throw new Google_Cache_Exception($error);
|
52 |
+
}
|
53 |
+
$this->client = $client;
|
54 |
+
if ($client->isAppEngine()) {
|
55 |
+
// No credentials needed for GAE.
|
56 |
+
$this->mc = new Memcached();
|
57 |
+
$this->connection = true;
|
58 |
+
} else {
|
59 |
+
$this->host = $client->getClassConfig($this, 'host');
|
60 |
+
$this->port = $client->getClassConfig($this, 'port');
|
61 |
+
if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) {
|
62 |
+
$error = "You need to supply a valid memcache host and port";
|
63 |
+
$client->getLogger()->error($error);
|
64 |
+
throw new Google_Cache_Exception($error);
|
65 |
+
}
|
66 |
+
}
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @inheritDoc
|
71 |
+
*/
|
72 |
+
public function get($key, $expiration = false)
|
73 |
+
{
|
74 |
+
$this->connect();
|
75 |
+
$ret = false;
|
76 |
+
if ($this->mc) {
|
77 |
+
$ret = $this->mc->get($key);
|
78 |
+
} else {
|
79 |
+
$ret = memcache_get($this->connection, $key);
|
80 |
+
}
|
81 |
+
if ($ret === false) {
|
82 |
+
$this->client->getLogger()->debug('Memcache cache miss', array(
|
83 |
+
'key' => $key
|
84 |
+
));
|
85 |
+
return false;
|
86 |
+
}
|
87 |
+
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
88 |
+
$this->client->getLogger()->debug('Memcache cache miss (expired)', array(
|
89 |
+
'key' => $key,
|
90 |
+
'var' => $ret
|
91 |
+
));
|
92 |
+
$this->delete($key);
|
93 |
+
return false;
|
94 |
+
}
|
95 |
+
$this->client->getLogger()->debug('Memcache cache hit', array(
|
96 |
+
'key' => $key,
|
97 |
+
'var' => $ret
|
98 |
+
));
|
99 |
+
return $ret['data'];
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* @inheritDoc
|
104 |
+
*
|
105 |
+
* @param string $key
|
106 |
+
* @param string $value
|
107 |
+
* @throws Google_Cache_Exception
|
108 |
+
*/
|
109 |
+
public function set($key, $value)
|
110 |
+
{
|
111 |
+
$this->connect();
|
112 |
+
// we store it with the cache_time default expiration so objects will at
|
113 |
+
// least get cleaned eventually.
|
114 |
+
$data = array(
|
115 |
+
'time' => time(),
|
116 |
+
'data' => $value
|
117 |
+
);
|
118 |
+
$rc = false;
|
119 |
+
if ($this->mc) {
|
120 |
+
$rc = $this->mc->set($key, $data);
|
121 |
+
} else {
|
122 |
+
$rc = memcache_set($this->connection, $key, $data, false);
|
123 |
+
}
|
124 |
+
if ($rc == false) {
|
125 |
+
$this->client->getLogger()->error('Memcache cache set failed', array(
|
126 |
+
'key' => $key,
|
127 |
+
'var' => $data
|
128 |
+
));
|
129 |
+
throw new Google_Cache_Exception("Couldn't store data in cache");
|
130 |
+
}
|
131 |
+
$this->client->getLogger()->debug('Memcache cache set', array(
|
132 |
+
'key' => $key,
|
133 |
+
'var' => $data
|
134 |
+
));
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* @inheritDoc
|
139 |
+
*
|
140 |
+
* @param String $key
|
141 |
+
*/
|
142 |
+
public function delete($key)
|
143 |
+
{
|
144 |
+
$this->connect();
|
145 |
+
if ($this->mc) {
|
146 |
+
$this->mc->delete($key, 0);
|
147 |
+
} else {
|
148 |
+
memcache_delete($this->connection, $key, 0);
|
149 |
+
}
|
150 |
+
$this->client->getLogger()->debug('Memcache cache delete', array(
|
151 |
+
'key' => $key
|
152 |
+
));
|
153 |
+
}
|
154 |
+
|
155 |
+
/**
|
156 |
+
* Lazy initialiser for memcache connection.
|
157 |
+
* Uses pconnect for to take
|
158 |
+
* advantage of the persistence pool where possible.
|
159 |
+
*/
|
160 |
+
private function connect()
|
161 |
+
{
|
162 |
+
if ($this->connection) {
|
163 |
+
return;
|
164 |
+
}
|
165 |
+
if (class_exists("Memcached")) {
|
166 |
+
$this->mc = new Memcached();
|
167 |
+
$this->mc->addServer($this->host, $this->port);
|
168 |
+
$this->connection = true;
|
169 |
+
} else {
|
170 |
+
$this->connection = memcache_pconnect($this->host, $this->port);
|
171 |
+
}
|
172 |
+
if (! $this->connection) {
|
173 |
+
$error = "Couldn't connect to memcache server";
|
174 |
+
$this->client->getLogger()->error($error);
|
175 |
+
throw new Google_Cache_Exception($error);
|
176 |
+
}
|
177 |
+
}
|
178 |
}
|
tools/src/Google/Cache/Null.php
CHANGED
@@ -1,54 +1,54 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* A blank storage class, for cases where caching is not
|
21 |
-
* required.
|
22 |
-
*/
|
23 |
-
class Google_Cache_Null extends Google_Cache_Abstract
|
24 |
-
{
|
25 |
-
|
26 |
-
public function __construct(Google_Client $client)
|
27 |
-
{}
|
28 |
-
|
29 |
-
/**
|
30 |
-
* @inheritDoc
|
31 |
-
*/
|
32 |
-
public function get($key, $expiration = false)
|
33 |
-
{
|
34 |
-
return false;
|
35 |
-
}
|
36 |
-
|
37 |
-
/**
|
38 |
-
* @inheritDoc
|
39 |
-
*/
|
40 |
-
public function set($key, $value)
|
41 |
-
{
|
42 |
-
// Nop.
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* @inheritDoc
|
47 |
-
*
|
48 |
-
* @param String $key
|
49 |
-
*/
|
50 |
-
public function delete($key)
|
51 |
-
{
|
52 |
-
// Nop.
|
53 |
-
}
|
54 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* A blank storage class, for cases where caching is not
|
21 |
+
* required.
|
22 |
+
*/
|
23 |
+
class Google_Cache_Null extends Google_Cache_Abstract
|
24 |
+
{
|
25 |
+
|
26 |
+
public function __construct(Google_Client $client)
|
27 |
+
{}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @inheritDoc
|
31 |
+
*/
|
32 |
+
public function get($key, $expiration = false)
|
33 |
+
{
|
34 |
+
return false;
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @inheritDoc
|
39 |
+
*/
|
40 |
+
public function set($key, $value)
|
41 |
+
{
|
42 |
+
// Nop.
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @inheritDoc
|
47 |
+
*
|
48 |
+
* @param String $key
|
49 |
+
*/
|
50 |
+
public function delete($key)
|
51 |
+
{
|
52 |
+
// Nop.
|
53 |
+
}
|
54 |
}
|
tools/src/Google/Client.php
CHANGED
@@ -1,761 +1,761 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* The Google API Client
|
21 |
-
* http://code.google.com/p/google-api-php-client/
|
22 |
-
*
|
23 |
-
* @author Chris Chabot <chabotc@google.com>
|
24 |
-
* @author Chirag Shah <chirags@google.com>
|
25 |
-
*/
|
26 |
-
class Google_Client
|
27 |
-
{
|
28 |
-
|
29 |
-
const LIBVER = "1.1.2";
|
30 |
-
|
31 |
-
const USER_AGENT_SUFFIX = "google-api-php-client/";
|
32 |
-
|
33 |
-
/**
|
34 |
-
*
|
35 |
-
* @var Google_Auth_Abstract $auth
|
36 |
-
*/
|
37 |
-
private $auth;
|
38 |
-
|
39 |
-
/**
|
40 |
-
*
|
41 |
-
* @var Google_IO_Abstract $io
|
42 |
-
*/
|
43 |
-
private $io;
|
44 |
-
|
45 |
-
/**
|
46 |
-
*
|
47 |
-
* @var Google_Cache_Abstract $cache
|
48 |
-
*/
|
49 |
-
private $cache;
|
50 |
-
|
51 |
-
/**
|
52 |
-
*
|
53 |
-
* @var Google_Config $config
|
54 |
-
*/
|
55 |
-
private $config;
|
56 |
-
|
57 |
-
/**
|
58 |
-
*
|
59 |
-
* @var Google_Logger_Abstract $logger
|
60 |
-
*/
|
61 |
-
private $logger;
|
62 |
-
|
63 |
-
/**
|
64 |
-
*
|
65 |
-
* @var boolean $deferExecution
|
66 |
-
*/
|
67 |
-
private $deferExecution = false;
|
68 |
-
|
69 |
-
/**
|
70 |
-
*
|
71 |
-
* @var array $scopes
|
72 |
-
*/
|
73 |
-
// Scopes requested by the client
|
74 |
-
protected $requestedScopes = array();
|
75 |
-
// definitions of services that are discovered.
|
76 |
-
protected $services = array();
|
77 |
-
// Used to track authenticated state, can't discover services after doing authenticate()
|
78 |
-
private $authenticated = false;
|
79 |
-
|
80 |
-
/**
|
81 |
-
* Construct the Google Client.
|
82 |
-
*
|
83 |
-
* @param $config Google_Config
|
84 |
-
* or string for the ini file to load
|
85 |
-
*/
|
86 |
-
public function __construct($config = null)
|
87 |
-
{
|
88 |
-
if (is_string($config) && strlen($config)) {
|
89 |
-
$config = new Google_Config($config);
|
90 |
-
} else
|
91 |
-
if (! ($config instanceof Google_Config)) {
|
92 |
-
$config = new Google_Config();
|
93 |
-
if ($this->isAppEngine()) {
|
94 |
-
// Automatically use Memcache if we're in AppEngine.
|
95 |
-
$config->setCacheClass('Google_Cache_Memcache');
|
96 |
-
}
|
97 |
-
if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) {
|
98 |
-
// Automatically disable compress.zlib, as currently unsupported.
|
99 |
-
$config->setClassConfig('Google_Http_Request', 'disable_gzip', true);
|
100 |
-
}
|
101 |
-
}
|
102 |
-
if ($config->getIoClass() == Google_Config::USE_AUTO_IO_SELECTION) {
|
103 |
-
if (function_exists('curl_version') && function_exists('curl_exec') && ! $this->isAppEngine()) {
|
104 |
-
$config->setIoClass("Google_IO_Curl");
|
105 |
-
} else {
|
106 |
-
$config->setIoClass("Google_IO_Stream");
|
107 |
-
}
|
108 |
-
}
|
109 |
-
$this->config = $config;
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* Get a string containing the version of the library.
|
114 |
-
*
|
115 |
-
* @return string
|
116 |
-
*/
|
117 |
-
public function getLibraryVersion()
|
118 |
-
{
|
119 |
-
return self::LIBVER;
|
120 |
-
}
|
121 |
-
|
122 |
-
/**
|
123 |
-
* Attempt to exchange a code for an valid authentication token.
|
124 |
-
* Helper wrapped around the OAuth 2.0 implementation.
|
125 |
-
*
|
126 |
-
* @param $code string
|
127 |
-
* code from accounts.google.com
|
128 |
-
* @return string token
|
129 |
-
*/
|
130 |
-
public function authenticate($code)
|
131 |
-
{
|
132 |
-
$this->authenticated = true;
|
133 |
-
return $this->getAuth()->authenticate($code);
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* Set the auth config from the JSON string provided.
|
138 |
-
* This structure should match the file downloaded from
|
139 |
-
* the "Download JSON" button on in the Google Developer
|
140 |
-
* Console.
|
141 |
-
*
|
142 |
-
* @param string $json
|
143 |
-
* the configuration json
|
144 |
-
* @throws Google_Exception
|
145 |
-
*/
|
146 |
-
public function setAuthConfig($json)
|
147 |
-
{
|
148 |
-
$data = json_decode($json);
|
149 |
-
$key = isset($data->installed) ? 'installed' : 'web';
|
150 |
-
if (! isset($data->$key)) {
|
151 |
-
throw new Google_Exception("Invalid client secret JSON file.");
|
152 |
-
}
|
153 |
-
$this->setClientId($data->$key->client_id);
|
154 |
-
$this->setClientSecret($data->$key->client_secret);
|
155 |
-
if (isset($data->$key->redirect_uris)) {
|
156 |
-
$this->setRedirectUri($data->$key->redirect_uris[0]);
|
157 |
-
}
|
158 |
-
}
|
159 |
-
|
160 |
-
/**
|
161 |
-
* Set the auth config from the JSON file in the path
|
162 |
-
* provided.
|
163 |
-
* This should match the file downloaded from
|
164 |
-
* the "Download JSON" button on in the Google Developer
|
165 |
-
* Console.
|
166 |
-
*
|
167 |
-
* @param string $file
|
168 |
-
* the file location of the client json
|
169 |
-
*/
|
170 |
-
public function setAuthConfigFile($file)
|
171 |
-
{
|
172 |
-
$this->setAuthConfig(file_get_contents($file));
|
173 |
-
}
|
174 |
-
|
175 |
-
/**
|
176 |
-
*
|
177 |
-
* @throws Google_Auth_Exception
|
178 |
-
* @return array @visible For Testing
|
179 |
-
*/
|
180 |
-
public function prepareScopes()
|
181 |
-
{
|
182 |
-
if (empty($this->requestedScopes)) {
|
183 |
-
throw new Google_Auth_Exception("No scopes specified");
|
184 |
-
}
|
185 |
-
$scopes = implode(' ', $this->requestedScopes);
|
186 |
-
return $scopes;
|
187 |
-
}
|
188 |
-
|
189 |
-
/**
|
190 |
-
* Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl()
|
191 |
-
* or Google_Client#getAccessToken().
|
192 |
-
*
|
193 |
-
* @param string $accessToken
|
194 |
-
* JSON encoded string containing in the following format:
|
195 |
-
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
196 |
-
* "expires_in":3600, "id_token":"TOKEN", "created":1320790426}
|
197 |
-
*/
|
198 |
-
public function setAccessToken($accessToken)
|
199 |
-
{
|
200 |
-
if ($accessToken == 'null') {
|
201 |
-
$accessToken = null;
|
202 |
-
}
|
203 |
-
$this->getAuth()->setAccessToken($accessToken);
|
204 |
-
}
|
205 |
-
|
206 |
-
/**
|
207 |
-
* Set the authenticator object
|
208 |
-
*
|
209 |
-
* @param Google_Auth_Abstract $auth
|
210 |
-
*/
|
211 |
-
public function setAuth(Google_Auth_Abstract $auth)
|
212 |
-
{
|
213 |
-
$this->config->setAuthClass(get_class($auth));
|
214 |
-
$this->auth = $auth;
|
215 |
-
}
|
216 |
-
|
217 |
-
/**
|
218 |
-
* Set the IO object
|
219 |
-
*
|
220 |
-
* @param Google_IO_Abstract $io
|
221 |
-
*/
|
222 |
-
public function setIo(Google_IO_Abstract $io)
|
223 |
-
{
|
224 |
-
$this->config->setIoClass(get_class($io));
|
225 |
-
$this->io = $io;
|
226 |
-
}
|
227 |
-
|
228 |
-
/**
|
229 |
-
* Set the Cache object
|
230 |
-
*
|
231 |
-
* @param Google_Cache_Abstract $cache
|
232 |
-
*/
|
233 |
-
public function setCache(Google_Cache_Abstract $cache)
|
234 |
-
{
|
235 |
-
$this->config->setCacheClass(get_class($cache));
|
236 |
-
$this->cache = $cache;
|
237 |
-
}
|
238 |
-
|
239 |
-
/**
|
240 |
-
* Set the Logger object
|
241 |
-
*
|
242 |
-
* @param Google_Logger_Abstract $logger
|
243 |
-
*/
|
244 |
-
public function setLogger(Google_Logger_Abstract $logger)
|
245 |
-
{
|
246 |
-
$this->config->setLoggerClass(get_class($logger));
|
247 |
-
$this->logger = $logger;
|
248 |
-
}
|
249 |
-
|
250 |
-
/**
|
251 |
-
* Construct the OAuth 2.0 authorization request URI.
|
252 |
-
*
|
253 |
-
* @return string
|
254 |
-
*/
|
255 |
-
public function createAuthUrl()
|
256 |
-
{
|
257 |
-
$scopes = $this->prepareScopes();
|
258 |
-
return $this->getAuth()->createAuthUrl($scopes);
|
259 |
-
}
|
260 |
-
|
261 |
-
/**
|
262 |
-
* Get the OAuth 2.0 access token.
|
263 |
-
*
|
264 |
-
* @return string $accessToken JSON encoded string in the following format:
|
265 |
-
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
266 |
-
* "expires_in":3600,"id_token":"TOKEN", "created":1320790426}
|
267 |
-
*/
|
268 |
-
public function getAccessToken()
|
269 |
-
{
|
270 |
-
$token = $this->getAuth()->getAccessToken();
|
271 |
-
// The response is json encoded, so could be the string null.
|
272 |
-
// It is arguable whether this check should be here or lower
|
273 |
-
// in the library.
|
274 |
-
return (null == $token || 'null' == $token || '[]' == $token) ? null : $token;
|
275 |
-
}
|
276 |
-
|
277 |
-
/**
|
278 |
-
* Get the OAuth 2.0 refresh token.
|
279 |
-
*
|
280 |
-
* @return string $refreshToken refresh token or null if not available
|
281 |
-
*/
|
282 |
-
public function getRefreshToken()
|
283 |
-
{
|
284 |
-
return $this->getAuth()->getRefreshToken();
|
285 |
-
}
|
286 |
-
|
287 |
-
/**
|
288 |
-
* Returns if the access_token is expired.
|
289 |
-
*
|
290 |
-
* @return bool Returns True if the access_token is expired.
|
291 |
-
*/
|
292 |
-
public function isAccessTokenExpired()
|
293 |
-
{
|
294 |
-
return $this->getAuth()->isAccessTokenExpired();
|
295 |
-
}
|
296 |
-
|
297 |
-
/**
|
298 |
-
* Set OAuth 2.0 "state" parameter to achieve per-request customization.
|
299 |
-
*
|
300 |
-
* @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2
|
301 |
-
* @param string $state
|
302 |
-
*/
|
303 |
-
public function setState($state)
|
304 |
-
{
|
305 |
-
$this->getAuth()->setState($state);
|
306 |
-
}
|
307 |
-
|
308 |
-
/**
|
309 |
-
*
|
310 |
-
* @param string $accessType
|
311 |
-
* Possible values for access_type include:
|
312 |
-
* {@code "offline"} to request offline access from the user.
|
313 |
-
* {@code "online"} to request online access from the user.
|
314 |
-
*/
|
315 |
-
public function setAccessType($accessType)
|
316 |
-
{
|
317 |
-
$this->config->setAccessType($accessType);
|
318 |
-
}
|
319 |
-
|
320 |
-
/**
|
321 |
-
*
|
322 |
-
* @param string $approvalPrompt
|
323 |
-
* Possible values for approval_prompt include:
|
324 |
-
* {@code "force"} to force the approval UI to appear. (This is the default value)
|
325 |
-
* {@code "auto"} to request auto-approval when possible.
|
326 |
-
*/
|
327 |
-
public function setApprovalPrompt($approvalPrompt)
|
328 |
-
{
|
329 |
-
$this->config->setApprovalPrompt($approvalPrompt);
|
330 |
-
}
|
331 |
-
|
332 |
-
/**
|
333 |
-
* Set the login hint, email address or sub id.
|
334 |
-
*
|
335 |
-
* @param string $loginHint
|
336 |
-
*/
|
337 |
-
public function setLoginHint($loginHint)
|
338 |
-
{
|
339 |
-
$this->config->setLoginHint($loginHint);
|
340 |
-
}
|
341 |
-
|
342 |
-
/**
|
343 |
-
* Set the application name, this is included in the User-Agent HTTP header.
|
344 |
-
*
|
345 |
-
* @param string $applicationName
|
346 |
-
*/
|
347 |
-
public function setApplicationName($applicationName)
|
348 |
-
{
|
349 |
-
$this->config->setApplicationName($applicationName);
|
350 |
-
}
|
351 |
-
|
352 |
-
/**
|
353 |
-
* Set the OAuth 2.0 Client ID.
|
354 |
-
*
|
355 |
-
* @param string $clientId
|
356 |
-
*/
|
357 |
-
public function setClientId($clientId)
|
358 |
-
{
|
359 |
-
$this->config->setClientId($clientId);
|
360 |
-
}
|
361 |
-
|
362 |
-
/**
|
363 |
-
* Set the OAuth 2.0 Client Secret.
|
364 |
-
*
|
365 |
-
* @param string $clientSecret
|
366 |
-
*/
|
367 |
-
public function setClientSecret($clientSecret)
|
368 |
-
{
|
369 |
-
$this->config->setClientSecret($clientSecret);
|
370 |
-
}
|
371 |
-
|
372 |
-
/**
|
373 |
-
* Set the OAuth 2.0 Redirect URI.
|
374 |
-
*
|
375 |
-
* @param string $redirectUri
|
376 |
-
*/
|
377 |
-
public function setRedirectUri($redirectUri)
|
378 |
-
{
|
379 |
-
$this->config->setRedirectUri($redirectUri);
|
380 |
-
}
|
381 |
-
|
382 |
-
/**
|
383 |
-
* If 'plus.login' is included in the list of requested scopes, you can use
|
384 |
-
* this method to define types of app activities that your app will write.
|
385 |
-
* You can find a list of available types here:
|
386 |
-
*
|
387 |
-
* @link https://developers.google.com/+/api/moment-types
|
388 |
-
*
|
389 |
-
* @param array $requestVisibleActions
|
390 |
-
* Array of app activity types
|
391 |
-
*/
|
392 |
-
public function setRequestVisibleActions($requestVisibleActions)
|
393 |
-
{
|
394 |
-
if (is_array($requestVisibleActions)) {
|
395 |
-
$requestVisibleActions = join(" ", $requestVisibleActions);
|
396 |
-
}
|
397 |
-
$this->config->setRequestVisibleActions($requestVisibleActions);
|
398 |
-
}
|
399 |
-
|
400 |
-
/**
|
401 |
-
* Set the developer key to use, these are obtained through the API Console.
|
402 |
-
*
|
403 |
-
* @see http://code.google.com/apis/console-help/#generatingdevkeys
|
404 |
-
* @param string $developerKey
|
405 |
-
*/
|
406 |
-
public function setDeveloperKey($developerKey)
|
407 |
-
{
|
408 |
-
$this->config->setDeveloperKey($developerKey);
|
409 |
-
}
|
410 |
-
|
411 |
-
/**
|
412 |
-
* Set the hd (hosted domain) parameter streamlines the login process for
|
413 |
-
* Google Apps hosted accounts.
|
414 |
-
* By including the domain of the user, you
|
415 |
-
* restrict sign-in to accounts at that domain.
|
416 |
-
*
|
417 |
-
* @param $hd string
|
418 |
-
* - the domain to use.
|
419 |
-
*/
|
420 |
-
public function setHostedDomain($hd)
|
421 |
-
{
|
422 |
-
$this->config->setHostedDomain($hd);
|
423 |
-
}
|
424 |
-
|
425 |
-
/**
|
426 |
-
* Set the prompt hint.
|
427 |
-
* Valid values are none, consent and select_account.
|
428 |
-
* If no value is specified and the user has not previously authorized
|
429 |
-
* access, then the user is shown a consent screen.
|
430 |
-
*
|
431 |
-
* @param $prompt string
|
432 |
-
*/
|
433 |
-
public function setPrompt($prompt)
|
434 |
-
{
|
435 |
-
$this->config->setPrompt($prompt);
|
436 |
-
}
|
437 |
-
|
438 |
-
/**
|
439 |
-
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
440 |
-
* 2.0.
|
441 |
-
* It is used in OpenID 2.0 requests to signify the URL-space for which
|
442 |
-
* an authentication request is valid.
|
443 |
-
*
|
444 |
-
* @param $realm string
|
445 |
-
* - the URL-space to use.
|
446 |
-
*/
|
447 |
-
public function setOpenidRealm($realm)
|
448 |
-
{
|
449 |
-
$this->config->setOpenidRealm($realm);
|
450 |
-
}
|
451 |
-
|
452 |
-
/**
|
453 |
-
* If this is provided with the value true, and the authorization request is
|
454 |
-
* granted, the authorization will include any previous authorizations
|
455 |
-
* granted to this user/application combination for other scopes.
|
456 |
-
*
|
457 |
-
* @param $include boolean
|
458 |
-
* - the URL-space to use.
|
459 |
-
*/
|
460 |
-
public function setIncludeGrantedScopes($include)
|
461 |
-
{
|
462 |
-
$this->config->setIncludeGrantedScopes($include);
|
463 |
-
}
|
464 |
-
|
465 |
-
/**
|
466 |
-
* Fetches a fresh OAuth 2.0 access token with the given refresh token.
|
467 |
-
*
|
468 |
-
* @param string $refreshToken
|
469 |
-
*/
|
470 |
-
public function refreshToken($refreshToken)
|
471 |
-
{
|
472 |
-
$this->getAuth()->refreshToken($refreshToken);
|
473 |
-
}
|
474 |
-
|
475 |
-
/**
|
476 |
-
* Revoke an OAuth2 access token or refresh token.
|
477 |
-
* This method will revoke the current access
|
478 |
-
* token, if a token isn't provided.
|
479 |
-
*
|
480 |
-
* @throws Google_Auth_Exception
|
481 |
-
* @param string|null $token
|
482 |
-
* The token (access token or a refresh token) that should be revoked.
|
483 |
-
* @return boolean Returns True if the revocation was successful, otherwise False.
|
484 |
-
*/
|
485 |
-
public function revokeToken($token = null)
|
486 |
-
{
|
487 |
-
return $this->getAuth()->revokeToken($token);
|
488 |
-
}
|
489 |
-
|
490 |
-
/**
|
491 |
-
* Verify an id_token.
|
492 |
-
* This method will verify the current id_token, if one
|
493 |
-
* isn't provided.
|
494 |
-
*
|
495 |
-
* @throws Google_Auth_Exception
|
496 |
-
* @param string|null $token
|
497 |
-
* The token (id_token) that should be verified.
|
498 |
-
* @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was
|
499 |
-
* successful.
|
500 |
-
*/
|
501 |
-
public function verifyIdToken($token = null)
|
502 |
-
{
|
503 |
-
return $this->getAuth()->verifyIdToken($token);
|
504 |
-
}
|
505 |
-
|
506 |
-
/**
|
507 |
-
* Verify a JWT that was signed with your own certificates.
|
508 |
-
*
|
509 |
-
* @param $id_token string
|
510 |
-
* The JWT token
|
511 |
-
* @param $cert_location array
|
512 |
-
* of certificates
|
513 |
-
* @param $audience string
|
514 |
-
* the expected consumer of the token
|
515 |
-
* @param $issuer string
|
516 |
-
* the expected issuer, defaults to Google
|
517 |
-
* @param
|
518 |
-
* [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
519 |
-
* @return mixed token information if valid, false if not
|
520 |
-
*/
|
521 |
-
public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null)
|
522 |
-
{
|
523 |
-
$auth = new Google_Auth_OAuth2($this);
|
524 |
-
$certs = $auth->retrieveCertsFromLocation($cert_location);
|
525 |
-
return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry);
|
526 |
-
}
|
527 |
-
|
528 |
-
/**
|
529 |
-
*
|
530 |
-
* @param $creds Google_Auth_AssertionCredentials
|
531 |
-
*/
|
532 |
-
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
533 |
-
{
|
534 |
-
$this->getAuth()->setAssertionCredentials($creds);
|
535 |
-
}
|
536 |
-
|
537 |
-
/**
|
538 |
-
* Set the scopes to be requested.
|
539 |
-
* Must be called before createAuthUrl().
|
540 |
-
* Will remove any previously configured scopes.
|
541 |
-
*
|
542 |
-
* @param array $scopes,
|
543 |
-
* ie: array('https://www.googleapis.com/auth/plus.login',
|
544 |
-
* 'https://www.googleapis.com/auth/moderator')
|
545 |
-
*/
|
546 |
-
public function setScopes($scopes)
|
547 |
-
{
|
548 |
-
$this->requestedScopes = array();
|
549 |
-
$this->addScope($scopes);
|
550 |
-
}
|
551 |
-
|
552 |
-
/**
|
553 |
-
* This functions adds a scope to be requested as part of the OAuth2.0 flow.
|
554 |
-
* Will append any scopes not previously requested to the scope parameter.
|
555 |
-
* A single string will be treated as a scope to request. An array of strings
|
556 |
-
* will each be appended.
|
557 |
-
*
|
558 |
-
* @param $scope_or_scopes string|array
|
559 |
-
* e.g. "profile"
|
560 |
-
*/
|
561 |
-
public function addScope($scope_or_scopes)
|
562 |
-
{
|
563 |
-
if (is_string($scope_or_scopes) && ! in_array($scope_or_scopes, $this->requestedScopes)) {
|
564 |
-
$this->requestedScopes[] = $scope_or_scopes;
|
565 |
-
} else
|
566 |
-
if (is_array($scope_or_scopes)) {
|
567 |
-
foreach ($scope_or_scopes as $scope) {
|
568 |
-
$this->addScope($scope);
|
569 |
-
}
|
570 |
-
}
|
571 |
-
}
|
572 |
-
|
573 |
-
/**
|
574 |
-
* Returns the list of scopes requested by the client
|
575 |
-
*
|
576 |
-
* @return array the list of scopes
|
577 |
-
*
|
578 |
-
*/
|
579 |
-
public function getScopes()
|
580 |
-
{
|
581 |
-
return $this->requestedScopes;
|
582 |
-
}
|
583 |
-
|
584 |
-
/**
|
585 |
-
* Declare whether batch calls should be used.
|
586 |
-
* This may increase throughput
|
587 |
-
* by making multiple requests in one connection.
|
588 |
-
*
|
589 |
-
* @param boolean $useBatch
|
590 |
-
* True if the batch support should
|
591 |
-
* be enabled. Defaults to False.
|
592 |
-
*/
|
593 |
-
public function setUseBatch($useBatch)
|
594 |
-
{
|
595 |
-
// This is actually an alias for setDefer.
|
596 |
-
$this->setDefer($useBatch);
|
597 |
-
}
|
598 |
-
|
599 |
-
/**
|
600 |
-
* Declare whether making API calls should make the call immediately, or
|
601 |
-
* return a request which can be called with ->execute();
|
602 |
-
*
|
603 |
-
* @param boolean $defer
|
604 |
-
* True if calls should not be executed right away.
|
605 |
-
*/
|
606 |
-
public function setDefer($defer)
|
607 |
-
{
|
608 |
-
$this->deferExecution = $defer;
|
609 |
-
}
|
610 |
-
|
611 |
-
/**
|
612 |
-
* Helper method to execute deferred HTTP requests.
|
613 |
-
*
|
614 |
-
* @param $request Google_Http_Request|Google_Http_Batch
|
615 |
-
* @throws Google_Exception
|
616 |
-
* @return object of the type of the expected class or array.
|
617 |
-
*/
|
618 |
-
public function execute($request)
|
619 |
-
{
|
620 |
-
if ($request instanceof Google_Http_Request) {
|
621 |
-
$request->setUserAgent($this->getApplicationName() . " " . self::USER_AGENT_SUFFIX . $this->getLibraryVersion());
|
622 |
-
if (! $this->getClassConfig("Google_Http_Request", "disable_gzip")) {
|
623 |
-
$request->enableGzip();
|
624 |
-
}
|
625 |
-
$request->maybeMoveParametersToBody();
|
626 |
-
return Google_Http_REST::execute($this, $request);
|
627 |
-
} else
|
628 |
-
if ($request instanceof Google_Http_Batch) {
|
629 |
-
return $request->execute();
|
630 |
-
} else {
|
631 |
-
throw new Google_Exception("Do not know how to execute this type of object.");
|
632 |
-
}
|
633 |
-
}
|
634 |
-
|
635 |
-
/**
|
636 |
-
* Whether or not to return raw requests
|
637 |
-
*
|
638 |
-
* @return boolean
|
639 |
-
*/
|
640 |
-
public function shouldDefer()
|
641 |
-
{
|
642 |
-
return $this->deferExecution;
|
643 |
-
}
|
644 |
-
|
645 |
-
/**
|
646 |
-
*
|
647 |
-
* @return Google_Auth_Abstract Authentication implementation
|
648 |
-
*/
|
649 |
-
public function getAuth()
|
650 |
-
{
|
651 |
-
if (! isset($this->auth)) {
|
652 |
-
$class = $this->config->getAuthClass();
|
653 |
-
$this->auth = new $class($this);
|
654 |
-
}
|
655 |
-
return $this->auth;
|
656 |
-
}
|
657 |
-
|
658 |
-
/**
|
659 |
-
*
|
660 |
-
* @return Google_IO_Abstract IO implementation
|
661 |
-
*/
|
662 |
-
public function getIo()
|
663 |
-
{
|
664 |
-
if (! isset($this->io)) {
|
665 |
-
$class = $this->config->getIoClass();
|
666 |
-
$this->io = new $class($this);
|
667 |
-
}
|
668 |
-
return $this->io;
|
669 |
-
}
|
670 |
-
|
671 |
-
/**
|
672 |
-
*
|
673 |
-
* @return Google_Cache_Abstract Cache implementation
|
674 |
-
*/
|
675 |
-
public function getCache()
|
676 |
-
{
|
677 |
-
if (! isset($this->cache)) {
|
678 |
-
$class = $this->config->getCacheClass();
|
679 |
-
$this->cache = new $class($this);
|
680 |
-
}
|
681 |
-
return $this->cache;
|
682 |
-
}
|
683 |
-
|
684 |
-
/**
|
685 |
-
*
|
686 |
-
* @return Google_Logger_Abstract Logger implementation
|
687 |
-
*/
|
688 |
-
public function getLogger()
|
689 |
-
{
|
690 |
-
if (! isset($this->logger)) {
|
691 |
-
$class = $this->config->getLoggerClass();
|
692 |
-
$this->logger = new $class($this);
|
693 |
-
}
|
694 |
-
return $this->logger;
|
695 |
-
}
|
696 |
-
|
697 |
-
/**
|
698 |
-
* Retrieve custom configuration for a specific class.
|
699 |
-
*
|
700 |
-
* @param $class string|object
|
701 |
-
* - class or instance of class to retrieve
|
702 |
-
* @param $key string
|
703 |
-
* optional - key to retrieve
|
704 |
-
* @return array
|
705 |
-
*/
|
706 |
-
public function getClassConfig($class, $key = null)
|
707 |
-
{
|
708 |
-
if (! is_string($class)) {
|
709 |
-
$class = get_class($class);
|
710 |
-
}
|
711 |
-
return $this->config->getClassConfig($class, $key);
|
712 |
-
}
|
713 |
-
|
714 |
-
/**
|
715 |
-
* Set configuration specific to a given class.
|
716 |
-
* $config->setClassConfig('Google_Cache_File',
|
717 |
-
* array('directory' => '/tmp/cache'));
|
718 |
-
*
|
719 |
-
* @param $class string|object
|
720 |
-
* - The class name for the configuration
|
721 |
-
* @param $config string
|
722 |
-
* key or an array of configuration values
|
723 |
-
* @param $value string
|
724 |
-
* optional - if $config is a key, the value
|
725 |
-
*
|
726 |
-
*/
|
727 |
-
public function setClassConfig($class, $config, $value = null)
|
728 |
-
{
|
729 |
-
if (! is_string($class)) {
|
730 |
-
$class = get_class($class);
|
731 |
-
}
|
732 |
-
$this->config->setClassConfig($class, $config, $value);
|
733 |
-
}
|
734 |
-
|
735 |
-
/**
|
736 |
-
*
|
737 |
-
* @return string the base URL to use for calls to the APIs
|
738 |
-
*/
|
739 |
-
public function getBasePath()
|
740 |
-
{
|
741 |
-
return $this->config->getBasePath();
|
742 |
-
}
|
743 |
-
|
744 |
-
/**
|
745 |
-
*
|
746 |
-
* @return string the name of the application
|
747 |
-
*/
|
748 |
-
public function getApplicationName()
|
749 |
-
{
|
750 |
-
return $this->config->getApplicationName();
|
751 |
-
}
|
752 |
-
|
753 |
-
/**
|
754 |
-
* Are we running in Google AppEngine?
|
755 |
-
* return bool
|
756 |
-
*/
|
757 |
-
public function isAppEngine()
|
758 |
-
{
|
759 |
-
return (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false);
|
760 |
-
}
|
761 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* The Google API Client
|
21 |
+
* http://code.google.com/p/google-api-php-client/
|
22 |
+
*
|
23 |
+
* @author Chris Chabot <chabotc@google.com>
|
24 |
+
* @author Chirag Shah <chirags@google.com>
|
25 |
+
*/
|
26 |
+
class Google_Client
|
27 |
+
{
|
28 |
+
|
29 |
+
const LIBVER = "1.1.2";
|
30 |
+
|
31 |
+
const USER_AGENT_SUFFIX = "google-api-php-client/";
|
32 |
+
|
33 |
+
/**
|
34 |
+
*
|
35 |
+
* @var Google_Auth_Abstract $auth
|
36 |
+
*/
|
37 |
+
private $auth;
|
38 |
+
|
39 |
+
/**
|
40 |
+
*
|
41 |
+
* @var Google_IO_Abstract $io
|
42 |
+
*/
|
43 |
+
private $io;
|
44 |
+
|
45 |
+
/**
|
46 |
+
*
|
47 |
+
* @var Google_Cache_Abstract $cache
|
48 |
+
*/
|
49 |
+
private $cache;
|
50 |
+
|
51 |
+
/**
|
52 |
+
*
|
53 |
+
* @var Google_Config $config
|
54 |
+
*/
|
55 |
+
private $config;
|
56 |
+
|
57 |
+
/**
|
58 |
+
*
|
59 |
+
* @var Google_Logger_Abstract $logger
|
60 |
+
*/
|
61 |
+
private $logger;
|
62 |
+
|
63 |
+
/**
|
64 |
+
*
|
65 |
+
* @var boolean $deferExecution
|
66 |
+
*/
|
67 |
+
private $deferExecution = false;
|
68 |
+
|
69 |
+
/**
|
70 |
+
*
|
71 |
+
* @var array $scopes
|
72 |
+
*/
|
73 |
+
// Scopes requested by the client
|
74 |
+
protected $requestedScopes = array();
|
75 |
+
// definitions of services that are discovered.
|
76 |
+
protected $services = array();
|
77 |
+
// Used to track authenticated state, can't discover services after doing authenticate()
|
78 |
+
private $authenticated = false;
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Construct the Google Client.
|
82 |
+
*
|
83 |
+
* @param $config Google_Config
|
84 |
+
* or string for the ini file to load
|
85 |
+
*/
|
86 |
+
public function __construct($config = null)
|
87 |
+
{
|
88 |
+
if (is_string($config) && strlen($config)) {
|
89 |
+
$config = new Google_Config($config);
|
90 |
+
} else
|
91 |
+
if (! ($config instanceof Google_Config)) {
|
92 |
+
$config = new Google_Config();
|
93 |
+
if ($this->isAppEngine()) {
|
94 |
+
// Automatically use Memcache if we're in AppEngine.
|
95 |
+
$config->setCacheClass('Google_Cache_Memcache');
|
96 |
+
}
|
97 |
+
if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) {
|
98 |
+
// Automatically disable compress.zlib, as currently unsupported.
|
99 |
+
$config->setClassConfig('Google_Http_Request', 'disable_gzip', true);
|
100 |
+
}
|
101 |
+
}
|
102 |
+
if ($config->getIoClass() == Google_Config::USE_AUTO_IO_SELECTION) {
|
103 |
+
if (function_exists('curl_version') && function_exists('curl_exec') && ! $this->isAppEngine()) {
|
104 |
+
$config->setIoClass("Google_IO_Curl");
|
105 |
+
} else {
|
106 |
+
$config->setIoClass("Google_IO_Stream");
|
107 |
+
}
|
108 |
+
}
|
109 |
+
$this->config = $config;
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Get a string containing the version of the library.
|
114 |
+
*
|
115 |
+
* @return string
|
116 |
+
*/
|
117 |
+
public function getLibraryVersion()
|
118 |
+
{
|
119 |
+
return self::LIBVER;
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Attempt to exchange a code for an valid authentication token.
|
124 |
+
* Helper wrapped around the OAuth 2.0 implementation.
|
125 |
+
*
|
126 |
+
* @param $code string
|
127 |
+
* code from accounts.google.com
|
128 |
+
* @return string token
|
129 |
+
*/
|
130 |
+
public function authenticate($code)
|
131 |
+
{
|
132 |
+
$this->authenticated = true;
|
133 |
+
return $this->getAuth()->authenticate($code);
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Set the auth config from the JSON string provided.
|
138 |
+
* This structure should match the file downloaded from
|
139 |
+
* the "Download JSON" button on in the Google Developer
|
140 |
+
* Console.
|
141 |
+
*
|
142 |
+
* @param string $json
|
143 |
+
* the configuration json
|
144 |
+
* @throws Google_Exception
|
145 |
+
*/
|
146 |
+
public function setAuthConfig($json)
|
147 |
+
{
|
148 |
+
$data = json_decode($json);
|
149 |
+
$key = isset($data->installed) ? 'installed' : 'web';
|
150 |
+
if (! isset($data->$key)) {
|
151 |
+
throw new Google_Exception("Invalid client secret JSON file.");
|
152 |
+
}
|
153 |
+
$this->setClientId($data->$key->client_id);
|
154 |
+
$this->setClientSecret($data->$key->client_secret);
|
155 |
+
if (isset($data->$key->redirect_uris)) {
|
156 |
+
$this->setRedirectUri($data->$key->redirect_uris[0]);
|
157 |
+
}
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Set the auth config from the JSON file in the path
|
162 |
+
* provided.
|
163 |
+
* This should match the file downloaded from
|
164 |
+
* the "Download JSON" button on in the Google Developer
|
165 |
+
* Console.
|
166 |
+
*
|
167 |
+
* @param string $file
|
168 |
+
* the file location of the client json
|
169 |
+
*/
|
170 |
+
public function setAuthConfigFile($file)
|
171 |
+
{
|
172 |
+
$this->setAuthConfig(file_get_contents($file));
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
*
|
177 |
+
* @throws Google_Auth_Exception
|
178 |
+
* @return array @visible For Testing
|
179 |
+
*/
|
180 |
+
public function prepareScopes()
|
181 |
+
{
|
182 |
+
if (empty($this->requestedScopes)) {
|
183 |
+
throw new Google_Auth_Exception("No scopes specified");
|
184 |
+
}
|
185 |
+
$scopes = implode(' ', $this->requestedScopes);
|
186 |
+
return $scopes;
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl()
|
191 |
+
* or Google_Client#getAccessToken().
|
192 |
+
*
|
193 |
+
* @param string $accessToken
|
194 |
+
* JSON encoded string containing in the following format:
|
195 |
+
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
196 |
+
* "expires_in":3600, "id_token":"TOKEN", "created":1320790426}
|
197 |
+
*/
|
198 |
+
public function setAccessToken($accessToken)
|
199 |
+
{
|
200 |
+
if ($accessToken == 'null') {
|
201 |
+
$accessToken = null;
|
202 |
+
}
|
203 |
+
$this->getAuth()->setAccessToken($accessToken);
|
204 |
+
}
|
205 |
+
|
206 |
+
/**
|
207 |
+
* Set the authenticator object
|
208 |
+
*
|
209 |
+
* @param Google_Auth_Abstract $auth
|
210 |
+
*/
|
211 |
+
public function setAuth(Google_Auth_Abstract $auth)
|
212 |
+
{
|
213 |
+
$this->config->setAuthClass(get_class($auth));
|
214 |
+
$this->auth = $auth;
|
215 |
+
}
|
216 |
+
|
217 |
+
/**
|
218 |
+
* Set the IO object
|
219 |
+
*
|
220 |
+
* @param Google_IO_Abstract $io
|
221 |
+
*/
|
222 |
+
public function setIo(Google_IO_Abstract $io)
|
223 |
+
{
|
224 |
+
$this->config->setIoClass(get_class($io));
|
225 |
+
$this->io = $io;
|
226 |
+
}
|
227 |
+
|
228 |
+
/**
|
229 |
+
* Set the Cache object
|
230 |
+
*
|
231 |
+
* @param Google_Cache_Abstract $cache
|
232 |
+
*/
|
233 |
+
public function setCache(Google_Cache_Abstract $cache)
|
234 |
+
{
|
235 |
+
$this->config->setCacheClass(get_class($cache));
|
236 |
+
$this->cache = $cache;
|
237 |
+
}
|
238 |
+
|
239 |
+
/**
|
240 |
+
* Set the Logger object
|
241 |
+
*
|
242 |
+
* @param Google_Logger_Abstract $logger
|
243 |
+
*/
|
244 |
+
public function setLogger(Google_Logger_Abstract $logger)
|
245 |
+
{
|
246 |
+
$this->config->setLoggerClass(get_class($logger));
|
247 |
+
$this->logger = $logger;
|
248 |
+
}
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Construct the OAuth 2.0 authorization request URI.
|
252 |
+
*
|
253 |
+
* @return string
|
254 |
+
*/
|
255 |
+
public function createAuthUrl()
|
256 |
+
{
|
257 |
+
$scopes = $this->prepareScopes();
|
258 |
+
return $this->getAuth()->createAuthUrl($scopes);
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Get the OAuth 2.0 access token.
|
263 |
+
*
|
264 |
+
* @return string $accessToken JSON encoded string in the following format:
|
265 |
+
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
266 |
+
* "expires_in":3600,"id_token":"TOKEN", "created":1320790426}
|
267 |
+
*/
|
268 |
+
public function getAccessToken()
|
269 |
+
{
|
270 |
+
$token = $this->getAuth()->getAccessToken();
|
271 |
+
// The response is json encoded, so could be the string null.
|
272 |
+
// It is arguable whether this check should be here or lower
|
273 |
+
// in the library.
|
274 |
+
return (null == $token || 'null' == $token || '[]' == $token) ? null : $token;
|
275 |
+
}
|
276 |
+
|
277 |
+
/**
|
278 |
+
* Get the OAuth 2.0 refresh token.
|
279 |
+
*
|
280 |
+
* @return string $refreshToken refresh token or null if not available
|
281 |
+
*/
|
282 |
+
public function getRefreshToken()
|
283 |
+
{
|
284 |
+
return $this->getAuth()->getRefreshToken();
|
285 |
+
}
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Returns if the access_token is expired.
|
289 |
+
*
|
290 |
+
* @return bool Returns True if the access_token is expired.
|
291 |
+
*/
|
292 |
+
public function isAccessTokenExpired()
|
293 |
+
{
|
294 |
+
return $this->getAuth()->isAccessTokenExpired();
|
295 |
+
}
|
296 |
+
|
297 |
+
/**
|
298 |
+
* Set OAuth 2.0 "state" parameter to achieve per-request customization.
|
299 |
+
*
|
300 |
+
* @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2
|
301 |
+
* @param string $state
|
302 |
+
*/
|
303 |
+
public function setState($state)
|
304 |
+
{
|
305 |
+
$this->getAuth()->setState($state);
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
*
|
310 |
+
* @param string $accessType
|
311 |
+
* Possible values for access_type include:
|
312 |
+
* {@code "offline"} to request offline access from the user.
|
313 |
+
* {@code "online"} to request online access from the user.
|
314 |
+
*/
|
315 |
+
public function setAccessType($accessType)
|
316 |
+
{
|
317 |
+
$this->config->setAccessType($accessType);
|
318 |
+
}
|
319 |
+
|
320 |
+
/**
|
321 |
+
*
|
322 |
+
* @param string $approvalPrompt
|
323 |
+
* Possible values for approval_prompt include:
|
324 |
+
* {@code "force"} to force the approval UI to appear. (This is the default value)
|
325 |
+
* {@code "auto"} to request auto-approval when possible.
|
326 |
+
*/
|
327 |
+
public function setApprovalPrompt($approvalPrompt)
|
328 |
+
{
|
329 |
+
$this->config->setApprovalPrompt($approvalPrompt);
|
330 |
+
}
|
331 |
+
|
332 |
+
/**
|
333 |
+
* Set the login hint, email address or sub id.
|
334 |
+
*
|
335 |
+
* @param string $loginHint
|
336 |
+
*/
|
337 |
+
public function setLoginHint($loginHint)
|
338 |
+
{
|
339 |
+
$this->config->setLoginHint($loginHint);
|
340 |
+
}
|
341 |
+
|
342 |
+
/**
|
343 |
+
* Set the application name, this is included in the User-Agent HTTP header.
|
344 |
+
*
|
345 |
+
* @param string $applicationName
|
346 |
+
*/
|
347 |
+
public function setApplicationName($applicationName)
|
348 |
+
{
|
349 |
+
$this->config->setApplicationName($applicationName);
|
350 |
+
}
|
351 |
+
|
352 |
+
/**
|
353 |
+
* Set the OAuth 2.0 Client ID.
|
354 |
+
*
|
355 |
+
* @param string $clientId
|
356 |
+
*/
|
357 |
+
public function setClientId($clientId)
|
358 |
+
{
|
359 |
+
$this->config->setClientId($clientId);
|
360 |
+
}
|
361 |
+
|
362 |
+
/**
|
363 |
+
* Set the OAuth 2.0 Client Secret.
|
364 |
+
*
|
365 |
+
* @param string $clientSecret
|
366 |
+
*/
|
367 |
+
public function setClientSecret($clientSecret)
|
368 |
+
{
|
369 |
+
$this->config->setClientSecret($clientSecret);
|
370 |
+
}
|
371 |
+
|
372 |
+
/**
|
373 |
+
* Set the OAuth 2.0 Redirect URI.
|
374 |
+
*
|
375 |
+
* @param string $redirectUri
|
376 |
+
*/
|
377 |
+
public function setRedirectUri($redirectUri)
|
378 |
+
{
|
379 |
+
$this->config->setRedirectUri($redirectUri);
|
380 |
+
}
|
381 |
+
|
382 |
+
/**
|
383 |
+
* If 'plus.login' is included in the list of requested scopes, you can use
|
384 |
+
* this method to define types of app activities that your app will write.
|
385 |
+
* You can find a list of available types here:
|
386 |
+
*
|
387 |
+
* @link https://developers.google.com/+/api/moment-types
|
388 |
+
*
|
389 |
+
* @param array $requestVisibleActions
|
390 |
+
* Array of app activity types
|
391 |
+
*/
|
392 |
+
public function setRequestVisibleActions($requestVisibleActions)
|
393 |
+
{
|
394 |
+
if (is_array($requestVisibleActions)) {
|
395 |
+
$requestVisibleActions = join(" ", $requestVisibleActions);
|
396 |
+
}
|
397 |
+
$this->config->setRequestVisibleActions($requestVisibleActions);
|
398 |
+
}
|
399 |
+
|
400 |
+
/**
|
401 |
+
* Set the developer key to use, these are obtained through the API Console.
|
402 |
+
*
|
403 |
+
* @see http://code.google.com/apis/console-help/#generatingdevkeys
|
404 |
+
* @param string $developerKey
|
405 |
+
*/
|
406 |
+
public function setDeveloperKey($developerKey)
|
407 |
+
{
|
408 |
+
$this->config->setDeveloperKey($developerKey);
|
409 |
+
}
|
410 |
+
|
411 |
+
/**
|
412 |
+
* Set the hd (hosted domain) parameter streamlines the login process for
|
413 |
+
* Google Apps hosted accounts.
|
414 |
+
* By including the domain of the user, you
|
415 |
+
* restrict sign-in to accounts at that domain.
|
416 |
+
*
|
417 |
+
* @param $hd string
|
418 |
+
* - the domain to use.
|
419 |
+
*/
|
420 |
+
public function setHostedDomain($hd)
|
421 |
+
{
|
422 |
+
$this->config->setHostedDomain($hd);
|
423 |
+
}
|
424 |
+
|
425 |
+
/**
|
426 |
+
* Set the prompt hint.
|
427 |
+
* Valid values are none, consent and select_account.
|
428 |
+
* If no value is specified and the user has not previously authorized
|
429 |
+
* access, then the user is shown a consent screen.
|
430 |
+
*
|
431 |
+
* @param $prompt string
|
432 |
+
*/
|
433 |
+
public function setPrompt($prompt)
|
434 |
+
{
|
435 |
+
$this->config->setPrompt($prompt);
|
436 |
+
}
|
437 |
+
|
438 |
+
/**
|
439 |
+
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
440 |
+
* 2.0.
|
441 |
+
* It is used in OpenID 2.0 requests to signify the URL-space for which
|
442 |
+
* an authentication request is valid.
|
443 |
+
*
|
444 |
+
* @param $realm string
|
445 |
+
* - the URL-space to use.
|
446 |
+
*/
|
447 |
+
public function setOpenidRealm($realm)
|
448 |
+
{
|
449 |
+
$this->config->setOpenidRealm($realm);
|
450 |
+
}
|
451 |
+
|
452 |
+
/**
|
453 |
+
* If this is provided with the value true, and the authorization request is
|
454 |
+
* granted, the authorization will include any previous authorizations
|
455 |
+
* granted to this user/application combination for other scopes.
|
456 |
+
*
|
457 |
+
* @param $include boolean
|
458 |
+
* - the URL-space to use.
|
459 |
+
*/
|
460 |
+
public function setIncludeGrantedScopes($include)
|
461 |
+
{
|
462 |
+
$this->config->setIncludeGrantedScopes($include);
|
463 |
+
}
|
464 |
+
|
465 |
+
/**
|
466 |
+
* Fetches a fresh OAuth 2.0 access token with the given refresh token.
|
467 |
+
*
|
468 |
+
* @param string $refreshToken
|
469 |
+
*/
|
470 |
+
public function refreshToken($refreshToken)
|
471 |
+
{
|
472 |
+
$this->getAuth()->refreshToken($refreshToken);
|
473 |
+
}
|
474 |
+
|
475 |
+
/**
|
476 |
+
* Revoke an OAuth2 access token or refresh token.
|
477 |
+
* This method will revoke the current access
|
478 |
+
* token, if a token isn't provided.
|
479 |
+
*
|
480 |
+
* @throws Google_Auth_Exception
|
481 |
+
* @param string|null $token
|
482 |
+
* The token (access token or a refresh token) that should be revoked.
|
483 |
+
* @return boolean Returns True if the revocation was successful, otherwise False.
|
484 |
+
*/
|
485 |
+
public function revokeToken($token = null)
|
486 |
+
{
|
487 |
+
return $this->getAuth()->revokeToken($token);
|
488 |
+
}
|
489 |
+
|
490 |
+
/**
|
491 |
+
* Verify an id_token.
|
492 |
+
* This method will verify the current id_token, if one
|
493 |
+
* isn't provided.
|
494 |
+
*
|
495 |
+
* @throws Google_Auth_Exception
|
496 |
+
* @param string|null $token
|
497 |
+
* The token (id_token) that should be verified.
|
498 |
+
* @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was
|
499 |
+
* successful.
|
500 |
+
*/
|
501 |
+
public function verifyIdToken($token = null)
|
502 |
+
{
|
503 |
+
return $this->getAuth()->verifyIdToken($token);
|
504 |
+
}
|
505 |
+
|
506 |
+
/**
|
507 |
+
* Verify a JWT that was signed with your own certificates.
|
508 |
+
*
|
509 |
+
* @param $id_token string
|
510 |
+
* The JWT token
|
511 |
+
* @param $cert_location array
|
512 |
+
* of certificates
|
513 |
+
* @param $audience string
|
514 |
+
* the expected consumer of the token
|
515 |
+
* @param $issuer string
|
516 |
+
* the expected issuer, defaults to Google
|
517 |
+
* @param
|
518 |
+
* [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
519 |
+
* @return mixed token information if valid, false if not
|
520 |
+
*/
|
521 |
+
public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null)
|
522 |
+
{
|
523 |
+
$auth = new Google_Auth_OAuth2($this);
|
524 |
+
$certs = $auth->retrieveCertsFromLocation($cert_location);
|
525 |
+
return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry);
|
526 |
+
}
|
527 |
+
|
528 |
+
/**
|
529 |
+
*
|
530 |
+
* @param $creds Google_Auth_AssertionCredentials
|
531 |
+
*/
|
532 |
+
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
533 |
+
{
|
534 |
+
$this->getAuth()->setAssertionCredentials($creds);
|
535 |
+
}
|
536 |
+
|
537 |
+
/**
|
538 |
+
* Set the scopes to be requested.
|
539 |
+
* Must be called before createAuthUrl().
|
540 |
+
* Will remove any previously configured scopes.
|
541 |
+
*
|
542 |
+
* @param array $scopes,
|
543 |
+
* ie: array('https://www.googleapis.com/auth/plus.login',
|
544 |
+
* 'https://www.googleapis.com/auth/moderator')
|
545 |
+
*/
|
546 |
+
public function setScopes($scopes)
|
547 |
+
{
|
548 |
+
$this->requestedScopes = array();
|
549 |
+
$this->addScope($scopes);
|
550 |
+
}
|
551 |
+
|
552 |
+
/**
|
553 |
+
* This functions adds a scope to be requested as part of the OAuth2.0 flow.
|
554 |
+
* Will append any scopes not previously requested to the scope parameter.
|
555 |
+
* A single string will be treated as a scope to request. An array of strings
|
556 |
+
* will each be appended.
|
557 |
+
*
|
558 |
+
* @param $scope_or_scopes string|array
|
559 |
+
* e.g. "profile"
|
560 |
+
*/
|
561 |
+
public function addScope($scope_or_scopes)
|
562 |
+
{
|
563 |
+
if (is_string($scope_or_scopes) && ! in_array($scope_or_scopes, $this->requestedScopes)) {
|
564 |
+
$this->requestedScopes[] = $scope_or_scopes;
|
565 |
+
} else
|
566 |
+
if (is_array($scope_or_scopes)) {
|
567 |
+
foreach ($scope_or_scopes as $scope) {
|
568 |
+
$this->addScope($scope);
|
569 |
+
}
|
570 |
+
}
|
571 |
+
}
|
572 |
+
|
573 |
+
/**
|
574 |
+
* Returns the list of scopes requested by the client
|
575 |
+
*
|
576 |
+
* @return array the list of scopes
|
577 |
+
*
|
578 |
+
*/
|
579 |
+
public function getScopes()
|
580 |
+
{
|
581 |
+
return $this->requestedScopes;
|
582 |
+
}
|
583 |
+
|
584 |
+
/**
|
585 |
+
* Declare whether batch calls should be used.
|
586 |
+
* This may increase throughput
|
587 |
+
* by making multiple requests in one connection.
|
588 |
+
*
|
589 |
+
* @param boolean $useBatch
|
590 |
+
* True if the batch support should
|
591 |
+
* be enabled. Defaults to False.
|
592 |
+
*/
|
593 |
+
public function setUseBatch($useBatch)
|
594 |
+
{
|
595 |
+
// This is actually an alias for setDefer.
|
596 |
+
$this->setDefer($useBatch);
|
597 |
+
}
|
598 |
+
|
599 |
+
/**
|
600 |
+
* Declare whether making API calls should make the call immediately, or
|
601 |
+
* return a request which can be called with ->execute();
|
602 |
+
*
|
603 |
+
* @param boolean $defer
|
604 |
+
* True if calls should not be executed right away.
|
605 |
+
*/
|
606 |
+
public function setDefer($defer)
|
607 |
+
{
|
608 |
+
$this->deferExecution = $defer;
|
609 |
+
}
|
610 |
+
|
611 |
+
/**
|
612 |
+
* Helper method to execute deferred HTTP requests.
|
613 |
+
*
|
614 |
+
* @param $request Google_Http_Request|Google_Http_Batch
|
615 |
+
* @throws Google_Exception
|
616 |
+
* @return object of the type of the expected class or array.
|
617 |
+
*/
|
618 |
+
public function execute($request)
|
619 |
+
{
|
620 |
+
if ($request instanceof Google_Http_Request) {
|
621 |
+
$request->setUserAgent($this->getApplicationName() . " " . self::USER_AGENT_SUFFIX . $this->getLibraryVersion());
|
622 |
+
if (! $this->getClassConfig("Google_Http_Request", "disable_gzip")) {
|
623 |
+
$request->enableGzip();
|
624 |
+
}
|
625 |
+
$request->maybeMoveParametersToBody();
|
626 |
+
return Google_Http_REST::execute($this, $request);
|
627 |
+
} else
|
628 |
+
if ($request instanceof Google_Http_Batch) {
|
629 |
+
return $request->execute();
|
630 |
+
} else {
|
631 |
+
throw new Google_Exception("Do not know how to execute this type of object.");
|
632 |
+
}
|
633 |
+
}
|
634 |
+
|
635 |
+
/**
|
636 |
+
* Whether or not to return raw requests
|
637 |
+
*
|
638 |
+
* @return boolean
|
639 |
+
*/
|
640 |
+
public function shouldDefer()
|
641 |
+
{
|
642 |
+
return $this->deferExecution;
|
643 |
+
}
|
644 |
+
|
645 |
+
/**
|
646 |
+
*
|
647 |
+
* @return Google_Auth_Abstract Authentication implementation
|
648 |
+
*/
|
649 |
+
public function getAuth()
|
650 |
+
{
|
651 |
+
if (! isset($this->auth)) {
|
652 |
+
$class = $this->config->getAuthClass();
|
653 |
+
$this->auth = new $class($this);
|
654 |
+
}
|
655 |
+
return $this->auth;
|
656 |
+
}
|
657 |
+
|
658 |
+
/**
|
659 |
+
*
|
660 |
+
* @return Google_IO_Abstract IO implementation
|
661 |
+
*/
|
662 |
+
public function getIo()
|
663 |
+
{
|
664 |
+
if (! isset($this->io)) {
|
665 |
+
$class = $this->config->getIoClass();
|
666 |
+
$this->io = new $class($this);
|
667 |
+
}
|
668 |
+
return $this->io;
|
669 |
+
}
|
670 |
+
|
671 |
+
/**
|
672 |
+
*
|
673 |
+
* @return Google_Cache_Abstract Cache implementation
|
674 |
+
*/
|
675 |
+
public function getCache()
|
676 |
+
{
|
677 |
+
if (! isset($this->cache)) {
|
678 |
+
$class = $this->config->getCacheClass();
|
679 |
+
$this->cache = new $class($this);
|
680 |
+
}
|
681 |
+
return $this->cache;
|
682 |
+
}
|
683 |
+
|
684 |
+
/**
|
685 |
+
*
|
686 |
+
* @return Google_Logger_Abstract Logger implementation
|
687 |
+
*/
|
688 |
+
public function getLogger()
|
689 |
+
{
|
690 |
+
if (! isset($this->logger)) {
|
691 |
+
$class = $this->config->getLoggerClass();
|
692 |
+
$this->logger = new $class($this);
|
693 |
+
}
|
694 |
+
return $this->logger;
|
695 |
+
}
|
696 |
+
|
697 |
+
/**
|
698 |
+
* Retrieve custom configuration for a specific class.
|
699 |
+
*
|
700 |
+
* @param $class string|object
|
701 |
+
* - class or instance of class to retrieve
|
702 |
+
* @param $key string
|
703 |
+
* optional - key to retrieve
|
704 |
+
* @return array
|
705 |
+
*/
|
706 |
+
public function getClassConfig($class, $key = null)
|
707 |
+
{
|
708 |
+
if (! is_string($class)) {
|
709 |
+
$class = get_class($class);
|
710 |
+
}
|
711 |
+
return $this->config->getClassConfig($class, $key);
|
712 |
+
}
|
713 |
+
|
714 |
+
/**
|
715 |
+
* Set configuration specific to a given class.
|
716 |
+
* $config->setClassConfig('Google_Cache_File',
|
717 |
+
* array('directory' => '/tmp/cache'));
|
718 |
+
*
|
719 |
+
* @param $class string|object
|
720 |
+
* - The class name for the configuration
|
721 |
+
* @param $config string
|
722 |
+
* key or an array of configuration values
|
723 |
+
* @param $value string
|
724 |
+
* optional - if $config is a key, the value
|
725 |
+
*
|
726 |
+
*/
|
727 |
+
public function setClassConfig($class, $config, $value = null)
|
728 |
+
{
|
729 |
+
if (! is_string($class)) {
|
730 |
+
$class = get_class($class);
|
731 |
+
}
|
732 |
+
$this->config->setClassConfig($class, $config, $value);
|
733 |
+
}
|
734 |
+
|
735 |
+
/**
|
736 |
+
*
|
737 |
+
* @return string the base URL to use for calls to the APIs
|
738 |
+
*/
|
739 |
+
public function getBasePath()
|
740 |
+
{
|
741 |
+
return $this->config->getBasePath();
|
742 |
+
}
|
743 |
+
|
744 |
+
/**
|
745 |
+
*
|
746 |
+
* @return string the name of the application
|
747 |
+
*/
|
748 |
+
public function getApplicationName()
|
749 |
+
{
|
750 |
+
return $this->config->getApplicationName();
|
751 |
+
}
|
752 |
+
|
753 |
+
/**
|
754 |
+
* Are we running in Google AppEngine?
|
755 |
+
* return bool
|
756 |
+
*/
|
757 |
+
public function isAppEngine()
|
758 |
+
{
|
759 |
+
return (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false);
|
760 |
+
}
|
761 |
}
|
tools/src/Google/Collection.php
CHANGED
@@ -1,93 +1,93 @@
|
|
1 |
-
<?php
|
2 |
-
require_once realpath(dirname(__FILE__) . '/../../autoload.php');
|
3 |
-
|
4 |
-
/**
|
5 |
-
* Extension to the regular Google_Model that automatically
|
6 |
-
* exposes the items array for iteration, so you can just
|
7 |
-
* iterate over the object rather than a reference inside.
|
8 |
-
*/
|
9 |
-
class Google_Collection extends Google_Model implements Iterator, Countable
|
10 |
-
{
|
11 |
-
|
12 |
-
protected $collection_key = 'items';
|
13 |
-
|
14 |
-
public function rewind()
|
15 |
-
{
|
16 |
-
if (isset($this->modelData[$this->collection_key]) && is_array($this->modelData[$this->collection_key])) {
|
17 |
-
reset($this->modelData[$this->collection_key]);
|
18 |
-
}
|
19 |
-
}
|
20 |
-
|
21 |
-
public function current()
|
22 |
-
{
|
23 |
-
$this->coerceType($this->key());
|
24 |
-
if (is_array($this->modelData[$this->collection_key])) {
|
25 |
-
return current($this->modelData[$this->collection_key]);
|
26 |
-
}
|
27 |
-
}
|
28 |
-
|
29 |
-
public function key()
|
30 |
-
{
|
31 |
-
if (isset($this->modelData[$this->collection_key]) && is_array($this->modelData[$this->collection_key])) {
|
32 |
-
return key($this->modelData[$this->collection_key]);
|
33 |
-
}
|
34 |
-
}
|
35 |
-
|
36 |
-
public function next()
|
37 |
-
{
|
38 |
-
return next($this->modelData[$this->collection_key]);
|
39 |
-
}
|
40 |
-
|
41 |
-
public function valid()
|
42 |
-
{
|
43 |
-
$key = $this->key();
|
44 |
-
return $key !== null && $key !== false;
|
45 |
-
}
|
46 |
-
|
47 |
-
public function count()
|
48 |
-
{
|
49 |
-
return count($this->modelData[$this->collection_key]);
|
50 |
-
}
|
51 |
-
|
52 |
-
public function offsetExists($offset)
|
53 |
-
{
|
54 |
-
if (! is_numeric($offset)) {
|
55 |
-
return parent::offsetExists($offset);
|
56 |
-
}
|
57 |
-
return isset($this->modelData[$this->collection_key][$offset]);
|
58 |
-
}
|
59 |
-
|
60 |
-
public function offsetGet($offset)
|
61 |
-
{
|
62 |
-
if (! is_numeric($offset)) {
|
63 |
-
return parent::offsetGet($offset);
|
64 |
-
}
|
65 |
-
$this->coerceType($offset);
|
66 |
-
return $this->modelData[$this->collection_key][$offset];
|
67 |
-
}
|
68 |
-
|
69 |
-
public function offsetSet($offset, $value)
|
70 |
-
{
|
71 |
-
if (! is_numeric($offset)) {
|
72 |
-
return parent::offsetSet($offset, $value);
|
73 |
-
}
|
74 |
-
$this->modelData[$this->collection_key][$offset] = $value;
|
75 |
-
}
|
76 |
-
|
77 |
-
public function offsetUnset($offset)
|
78 |
-
{
|
79 |
-
if (! is_numeric($offset)) {
|
80 |
-
return parent::offsetUnset($offset);
|
81 |
-
}
|
82 |
-
unset($this->modelData[$this->collection_key][$offset]);
|
83 |
-
}
|
84 |
-
|
85 |
-
private function coerceType($offset)
|
86 |
-
{
|
87 |
-
$typeKey = $this->keyType($this->collection_key);
|
88 |
-
if (isset($this->$typeKey) && ! is_object($this->modelData[$this->collection_key][$offset])) {
|
89 |
-
$type = $this->$typeKey;
|
90 |
-
$this->modelData[$this->collection_key][$offset] = new $type($this->modelData[$this->collection_key][$offset]);
|
91 |
-
}
|
92 |
-
}
|
93 |
}
|
1 |
+
<?php
|
2 |
+
require_once realpath(dirname(__FILE__) . '/../../autoload.php');
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Extension to the regular Google_Model that automatically
|
6 |
+
* exposes the items array for iteration, so you can just
|
7 |
+
* iterate over the object rather than a reference inside.
|
8 |
+
*/
|
9 |
+
class Google_Collection extends Google_Model implements Iterator, Countable
|
10 |
+
{
|
11 |
+
|
12 |
+
protected $collection_key = 'items';
|
13 |
+
|
14 |
+
public function rewind()
|
15 |
+
{
|
16 |
+
if (isset($this->modelData[$this->collection_key]) && is_array($this->modelData[$this->collection_key])) {
|
17 |
+
reset($this->modelData[$this->collection_key]);
|
18 |
+
}
|
19 |
+
}
|
20 |
+
|
21 |
+
public function current()
|
22 |
+
{
|
23 |
+
$this->coerceType($this->key());
|
24 |
+
if (is_array($this->modelData[$this->collection_key])) {
|
25 |
+
return current($this->modelData[$this->collection_key]);
|
26 |
+
}
|
27 |
+
}
|
28 |
+
|
29 |
+
public function key()
|
30 |
+
{
|
31 |
+
if (isset($this->modelData[$this->collection_key]) && is_array($this->modelData[$this->collection_key])) {
|
32 |
+
return key($this->modelData[$this->collection_key]);
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
public function next()
|
37 |
+
{
|
38 |
+
return next($this->modelData[$this->collection_key]);
|
39 |
+
}
|
40 |
+
|
41 |
+
public function valid()
|
42 |
+
{
|
43 |
+
$key = $this->key();
|
44 |
+
return $key !== null && $key !== false;
|
45 |
+
}
|
46 |
+
|
47 |
+
public function count()
|
48 |
+
{
|
49 |
+
return count($this->modelData[$this->collection_key]);
|
50 |
+
}
|
51 |
+
|
52 |
+
public function offsetExists($offset)
|
53 |
+
{
|
54 |
+
if (! is_numeric($offset)) {
|
55 |
+
return parent::offsetExists($offset);
|
56 |
+
}
|
57 |
+
return isset($this->modelData[$this->collection_key][$offset]);
|
58 |
+
}
|
59 |
+
|
60 |
+
public function offsetGet($offset)
|
61 |
+
{
|
62 |
+
if (! is_numeric($offset)) {
|
63 |
+
return parent::offsetGet($offset);
|
64 |
+
}
|
65 |
+
$this->coerceType($offset);
|
66 |
+
return $this->modelData[$this->collection_key][$offset];
|
67 |
+
}
|
68 |
+
|
69 |
+
public function offsetSet($offset, $value)
|
70 |
+
{
|
71 |
+
if (! is_numeric($offset)) {
|
72 |
+
return parent::offsetSet($offset, $value);
|
73 |
+
}
|
74 |
+
$this->modelData[$this->collection_key][$offset] = $value;
|
75 |
+
}
|
76 |
+
|
77 |
+
public function offsetUnset($offset)
|
78 |
+
{
|
79 |
+
if (! is_numeric($offset)) {
|
80 |
+
return parent::offsetUnset($offset);
|
81 |
+
}
|
82 |
+
unset($this->modelData[$this->collection_key][$offset]);
|
83 |
+
}
|
84 |
+
|
85 |
+
private function coerceType($offset)
|
86 |
+
{
|
87 |
+
$typeKey = $this->keyType($this->collection_key);
|
88 |
+
if (isset($this->$typeKey) && ! is_object($this->modelData[$this->collection_key][$offset])) {
|
89 |
+
$type = $this->$typeKey;
|
90 |
+
$this->modelData[$this->collection_key][$offset] = new $type($this->modelData[$this->collection_key][$offset]);
|
91 |
+
}
|
92 |
+
}
|
93 |
}
|
tools/src/Google/Config.php
CHANGED
@@ -1,447 +1,447 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
* Copyright 2010 Google Inc.
|
5 |
-
*
|
6 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
-
* you may not use this file except in compliance with the License.
|
8 |
-
* You may obtain a copy of the License at
|
9 |
-
*
|
10 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
-
*
|
12 |
-
* Unless required by applicable law or agreed to in writing, software
|
13 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
-
* See the License for the specific language governing permissions and
|
16 |
-
* limitations under the License.
|
17 |
-
*/
|
18 |
-
/**
|
19 |
-
* A class to contain the library configuration for the Google API client.
|
20 |
-
*/
|
21 |
-
class Google_Config
|
22 |
-
{
|
23 |
-
|
24 |
-
const GZIP_DISABLED = true;
|
25 |
-
|
26 |
-
const GZIP_ENABLED = false;
|
27 |
-
|
28 |
-
const GZIP_UPLOADS_ENABLED = true;
|
29 |
-
|
30 |
-
const GZIP_UPLOADS_DISABLED = false;
|
31 |
-
|
32 |
-
const USE_AUTO_IO_SELECTION = "auto";
|
33 |
-
|
34 |
-
protected $configuration;
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Create a new Google_Config.
|
38 |
-
* Can accept an ini file location with the
|
39 |
-
* local configuration. For example:
|
40 |
-
* application_name="My App"
|
41 |
-
*
|
42 |
-
* @param
|
43 |
-
* [$ini_file_location] - optional - The location of the ini file to load
|
44 |
-
*/
|
45 |
-
public function __construct($ini_file_location = null)
|
46 |
-
{
|
47 |
-
$this->configuration = array(
|
48 |
-
// The application_name is included in the User-Agent HTTP header.
|
49 |
-
'application_name' => '',
|
50 |
-
// Which Authentication, Storage and HTTP IO classes to use.
|
51 |
-
'auth_class' => 'Google_Auth_OAuth2',
|
52 |
-
'io_class' => self::USE_AUTO_IO_SELECTION,
|
53 |
-
'cache_class' => 'Google_Cache_File',
|
54 |
-
'logger_class' => 'Google_Logger_Null',
|
55 |
-
// Don't change these unless you're working against a special development
|
56 |
-
// or testing environment.
|
57 |
-
'base_path' => 'https://www.googleapis.com',
|
58 |
-
// Definition of class specific values, like file paths and so on.
|
59 |
-
'classes' => array(
|
60 |
-
'Google_IO_Abstract' => array(
|
61 |
-
'request_timeout_seconds' => 100
|
62 |
-
),
|
63 |
-
'Google_Logger_Abstract' => array(
|
64 |
-
'level' => 'debug',
|
65 |
-
'log_format' => "[%datetime%] %level%: %message% %context%\n",
|
66 |
-
'date_format' => 'd/M/Y:H:i:s O',
|
67 |
-
'allow_newlines' => true
|
68 |
-
),
|
69 |
-
'Google_Logger_File' => array(
|
70 |
-
'file' => 'php://stdout',
|
71 |
-
'mode' => 0640,
|
72 |
-
'lock' => false
|
73 |
-
),
|
74 |
-
'Google_Http_Request' => array(
|
75 |
-
// Disable the use of gzip on calls if set to true. Defaults to false.
|
76 |
-
'disable_gzip' => self::GZIP_ENABLED,
|
77 |
-
// We default gzip to disabled on uploads even if gzip is otherwise
|
78 |
-
// enabled, due to some issues seen with small packet sizes for uploads.
|
79 |
-
// Please test with this option before enabling gzip for uploads in
|
80 |
-
// a production environment.
|
81 |
-
'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED
|
82 |
-
),
|
83 |
-
// If you want to pass in OAuth 2.0 settings, they will need to be
|
84 |
-
// structured like this.
|
85 |
-
'Google_Auth_OAuth2' => array(
|
86 |
-
// Keys for OAuth 2.0 access, see the API console at
|
87 |
-
// https://developers.google.com/console
|
88 |
-
'client_id' => '',
|
89 |
-
'client_secret' => '',
|
90 |
-
'redirect_uri' => '',
|
91 |
-
// Simple API access key, also from the API console. Ensure you get
|
92 |
-
// a Server key, and not a Browser key.
|
93 |
-
'developer_key' => '',
|
94 |
-
// Other parameters.
|
95 |
-
'hd' => '',
|
96 |
-
'prompt' => '',
|
97 |
-
'openid.realm' => '',
|
98 |
-
'include_granted_scopes' => '',
|
99 |
-
'login_hint' => '',
|
100 |
-
'request_visible_actions' => '',
|
101 |
-
'access_type' => 'online',
|
102 |
-
'approval_prompt' => 'auto',
|
103 |
-
'federated_signon_certs_url' => 'https://www.googleapis.com/oauth2/v1/certs'
|
104 |
-
),
|
105 |
-
// Set a default directory for the file cache.
|
106 |
-
'Google_Cache_File' => array(
|
107 |
-
'directory' => sys_get_temp_dir() . '/Google_Client'
|
108 |
-
)
|
109 |
-
)
|
110 |
-
);
|
111 |
-
if ($ini_file_location) {
|
112 |
-
$ini = parse_ini_file($ini_file_location, true);
|
113 |
-
if (is_array($ini) && count($ini)) {
|
114 |
-
$merged_configuration = $ini + $this->configuration;
|
115 |
-
if (isset($ini['classes']) && isset($this->configuration['classes'])) {
|
116 |
-
$merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes'];
|
117 |
-
}
|
118 |
-
$this->configuration = $merged_configuration;
|
119 |
-
}
|
120 |
-
}
|
121 |
-
}
|
122 |
-
|
123 |
-
/**
|
124 |
-
* Set configuration specific to a given class.
|
125 |
-
* $config->setClassConfig('Google_Cache_File',
|
126 |
-
* array('directory' => '/tmp/cache'));
|
127 |
-
*
|
128 |
-
* @param $class string
|
129 |
-
* The class name for the configuration
|
130 |
-
* @param $config string
|
131 |
-
* key or an array of configuration values
|
132 |
-
* @param $value string
|
133 |
-
* optional - if $config is a key, the value
|
134 |
-
*/
|
135 |
-
public function setClassConfig($class, $config, $value = null)
|
136 |
-
{
|
137 |
-
if (! is_array($config)) {
|
138 |
-
if (! isset($this->configuration['classes'][$class])) {
|
139 |
-
$this->configuration['classes'][$class] = array();
|
140 |
-
}
|
141 |
-
$this->configuration['classes'][$class][$config] = $value;
|
142 |
-
} else {
|
143 |
-
$this->configuration['classes'][$class] = $config;
|
144 |
-
}
|
145 |
-
}
|
146 |
-
|
147 |
-
public function getClassConfig($class, $key = null)
|
148 |
-
{
|
149 |
-
if (! isset($this->configuration['classes'][$class])) {
|
150 |
-
return null;
|
151 |
-
}
|
152 |
-
if ($key === null) {
|
153 |
-
return $this->configuration['classes'][$class];
|
154 |
-
} else {
|
155 |
-
return $this->configuration['classes'][$class][$key];
|
156 |
-
}
|
157 |
-
}
|
158 |
-
|
159 |
-
/**
|
160 |
-
* Return the configured cache class.
|
161 |
-
*
|
162 |
-
* @return string
|
163 |
-
*/
|
164 |
-
public function getCacheClass()
|
165 |
-
{
|
166 |
-
return $this->configuration['cache_class'];
|
167 |
-
}
|
168 |
-
|
169 |
-
/**
|
170 |
-
* Return the configured logger class.
|
171 |
-
*
|
172 |
-
* @return string
|
173 |
-
*/
|
174 |
-
public function getLoggerClass()
|
175 |
-
{
|
176 |
-
return $this->configuration['logger_class'];
|
177 |
-
}
|
178 |
-
|
179 |
-
/**
|
180 |
-
* Return the configured Auth class.
|
181 |
-
*
|
182 |
-
* @return string
|
183 |
-
*/
|
184 |
-
public function getAuthClass()
|
185 |
-
{
|
186 |
-
return $this->configuration['auth_class'];
|
187 |
-
}
|
188 |
-
|
189 |
-
/**
|
190 |
-
* Set the auth class.
|
191 |
-
*
|
192 |
-
* @param $class string
|
193 |
-
* the class name to set
|
194 |
-
*/
|
195 |
-
public function setAuthClass($class)
|
196 |
-
{
|
197 |
-
$prev = $this->configuration['auth_class'];
|
198 |
-
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
199 |
-
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
200 |
-
}
|
201 |
-
$this->configuration['auth_class'] = $class;
|
202 |
-
}
|
203 |
-
|
204 |
-
/**
|
205 |
-
* Set the IO class.
|
206 |
-
*
|
207 |
-
* @param $class string
|
208 |
-
* the class name to set
|
209 |
-
*/
|
210 |
-
public function setIoClass($class)
|
211 |
-
{
|
212 |
-
$prev = $this->configuration['io_class'];
|
213 |
-
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
214 |
-
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
215 |
-
}
|
216 |
-
$this->configuration['io_class'] = $class;
|
217 |
-
}
|
218 |
-
|
219 |
-
/**
|
220 |
-
* Set the cache class.
|
221 |
-
*
|
222 |
-
* @param $class string
|
223 |
-
* the class name to set
|
224 |
-
*/
|
225 |
-
public function setCacheClass($class)
|
226 |
-
{
|
227 |
-
$prev = $this->configuration['cache_class'];
|
228 |
-
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
229 |
-
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
230 |
-
}
|
231 |
-
$this->configuration['cache_class'] = $class;
|
232 |
-
}
|
233 |
-
|
234 |
-
/**
|
235 |
-
* Set the logger class.
|
236 |
-
*
|
237 |
-
* @param $class string
|
238 |
-
* the class name to set
|
239 |
-
*/
|
240 |
-
public function setLoggerClass($class)
|
241 |
-
{
|
242 |
-
$prev = $this->configuration['logger_class'];
|
243 |
-
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
244 |
-
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
245 |
-
}
|
246 |
-
$this->configuration['logger_class'] = $class;
|
247 |
-
}
|
248 |
-
|
249 |
-
/**
|
250 |
-
* Return the configured IO class.
|
251 |
-
*
|
252 |
-
* @return string
|
253 |
-
*/
|
254 |
-
public function getIoClass()
|
255 |
-
{
|
256 |
-
return $this->configuration['io_class'];
|
257 |
-
}
|
258 |
-
|
259 |
-
/**
|
260 |
-
* Set the application name, this is included in the User-Agent HTTP header.
|
261 |
-
*
|
262 |
-
* @param string $name
|
263 |
-
*/
|
264 |
-
public function setApplicationName($name)
|
265 |
-
{
|
266 |
-
$this->configuration['application_name'] = $name;
|
267 |
-
}
|
268 |
-
|
269 |
-
/**
|
270 |
-
*
|
271 |
-
* @return string the name of the application
|
272 |
-
*/
|
273 |
-
public function getApplicationName()
|
274 |
-
{
|
275 |
-
return $this->configuration['application_name'];
|
276 |
-
}
|
277 |
-
|
278 |
-
/**
|
279 |
-
* Set the client ID for the auth class.
|
280 |
-
*
|
281 |
-
* @param $clientId string
|
282 |
-
* - the API console client ID
|
283 |
-
*/
|
284 |
-
public function setClientId($clientId)
|
285 |
-
{
|
286 |
-
$this->setAuthConfig('client_id', $clientId);
|
287 |
-
}
|
288 |
-
|
289 |
-
/**
|
290 |
-
* Set the client secret for the auth class.
|
291 |
-
*
|
292 |
-
* @param $secret string
|
293 |
-
* - the API console client secret
|
294 |
-
*/
|
295 |
-
public function setClientSecret($secret)
|
296 |
-
{
|
297 |
-
$this->setAuthConfig('client_secret', $secret);
|
298 |
-
}
|
299 |
-
|
300 |
-
/**
|
301 |
-
* Set the redirect uri for the auth class.
|
302 |
-
* Note that if using the
|
303 |
-
* Javascript based sign in flow, this should be the string 'postmessage'.
|
304 |
-
*
|
305 |
-
* @param $uri string
|
306 |
-
* - the URI that users should be redirected to
|
307 |
-
*/
|
308 |
-
public function setRedirectUri($uri)
|
309 |
-
{
|
310 |
-
$this->setAuthConfig('redirect_uri', $uri);
|
311 |
-
}
|
312 |
-
|
313 |
-
/**
|
314 |
-
* Set the app activities for the auth class.
|
315 |
-
*
|
316 |
-
* @param $rva string
|
317 |
-
* a space separated list of app activity types
|
318 |
-
*/
|
319 |
-
public function setRequestVisibleActions($rva)
|
320 |
-
{
|
321 |
-
$this->setAuthConfig('request_visible_actions', $rva);
|
322 |
-
}
|
323 |
-
|
324 |
-
/**
|
325 |
-
* Set the the access type requested (offline or online.)
|
326 |
-
*
|
327 |
-
* @param $access string
|
328 |
-
* - the access type
|
329 |
-
*/
|
330 |
-
public function setAccessType($access)
|
331 |
-
{
|
332 |
-
$this->setAuthConfig('access_type', $access);
|
333 |
-
}
|
334 |
-
|
335 |
-
/**
|
336 |
-
* Set when to show the approval prompt (auto or force)
|
337 |
-
*
|
338 |
-
* @param $approval string
|
339 |
-
* - the approval request
|
340 |
-
*/
|
341 |
-
public function setApprovalPrompt($approval)
|
342 |
-
{
|
343 |
-
$this->setAuthConfig('approval_prompt', $approval);
|
344 |
-
}
|
345 |
-
|
346 |
-
/**
|
347 |
-
* Set the login hint (email address or sub identifier)
|
348 |
-
*
|
349 |
-
* @param $hint string
|
350 |
-
*/
|
351 |
-
public function setLoginHint($hint)
|
352 |
-
{
|
353 |
-
$this->setAuthConfig('login_hint', $hint);
|
354 |
-
}
|
355 |
-
|
356 |
-
/**
|
357 |
-
* Set the developer key for the auth class.
|
358 |
-
* Note that this is separate value
|
359 |
-
* from the client ID - if it looks like a URL, its a client ID!
|
360 |
-
*
|
361 |
-
* @param $key string
|
362 |
-
* - the API console developer key
|
363 |
-
*/
|
364 |
-
public function setDeveloperKey($key)
|
365 |
-
{
|
366 |
-
$this->setAuthConfig('developer_key', $key);
|
367 |
-
}
|
368 |
-
|
369 |
-
/**
|
370 |
-
* Set the hd (hosted domain) parameter streamlines the login process for
|
371 |
-
* Google Apps hosted accounts.
|
372 |
-
* By including the domain of the user, you
|
373 |
-
* restrict sign-in to accounts at that domain.
|
374 |
-
*
|
375 |
-
* @param $hd string
|
376 |
-
* - the domain to use.
|
377 |
-
*/
|
378 |
-
public function setHostedDomain($hd)
|
379 |
-
{
|
380 |
-
$this->setAuthConfig('hd', $hd);
|
381 |
-
}
|
382 |
-
|
383 |
-
/**
|
384 |
-
* Set the prompt hint.
|
385 |
-
* Valid values are none, consent and select_account.
|
386 |
-
* If no value is specified and the user has not previously authorized
|
387 |
-
* access, then the user is shown a consent screen.
|
388 |
-
*
|
389 |
-
* @param $prompt string
|
390 |
-
*/
|
391 |
-
public function setPrompt($prompt)
|
392 |
-
{
|
393 |
-
$this->setAuthConfig('prompt', $prompt);
|
394 |
-
}
|
395 |
-
|
396 |
-
/**
|
397 |
-
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
398 |
-
* 2.0.
|
399 |
-
* It is used in OpenID 2.0 requests to signify the URL-space for which
|
400 |
-
* an authentication request is valid.
|
401 |
-
*
|
402 |
-
* @param $realm string
|
403 |
-
* - the URL-space to use.
|
404 |
-
*/
|
405 |
-
public function setOpenidRealm($realm)
|
406 |
-
{
|
407 |
-
$this->setAuthConfig('openid.realm', $realm);
|
408 |
-
}
|
409 |
-
|
410 |
-
/**
|
411 |
-
* If this is provided with the value true, and the authorization request is
|
412 |
-
* granted, the authorization will include any previous authorizations
|
413 |
-
* granted to this user/application combination for other scopes.
|
414 |
-
*
|
415 |
-
* @param $include boolean
|
416 |
-
* - the URL-space to use.
|
417 |
-
*/
|
418 |
-
public function setIncludeGrantedScopes($include)
|
419 |
-
{
|
420 |
-
$this->setAuthConfig('include_granted_scopes', $include ? "true" : "false");
|
421 |
-
}
|
422 |
-
|
423 |
-
/**
|
424 |
-
*
|
425 |
-
* @return string the base URL to use for API calls
|
426 |
-
*/
|
427 |
-
public function getBasePath()
|
428 |
-
{
|
429 |
-
return $this->configuration['base_path'];
|
430 |
-
}
|
431 |
-
|
432 |
-
/**
|
433 |
-
* Set the auth configuration for the current auth class.
|
434 |
-
*
|
435 |
-
* @param $key -
|
436 |
-
* the key to set
|
437 |
-
* @param $value -
|
438 |
-
* the parameter value
|
439 |
-
*/
|
440 |
-
private function setAuthConfig($key, $value)
|
441 |
-
{
|
442 |
-
if (! isset($this->configuration['classes'][$this->getAuthClass()])) {
|
443 |
-
$this->configuration['classes'][$this->getAuthClass()] = array();
|
444 |
-
}
|
445 |
-
$this->configuration['classes'][$this->getAuthClass()][$key] = $value;
|
446 |
-
}
|
447 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright 2010 Google Inc.
|
5 |
+
*
|
6 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
+
* you may not use this file except in compliance with the License.
|
8 |
+
* You may obtain a copy of the License at
|
9 |
+
*
|
10 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
+
*
|
12 |
+
* Unless required by applicable law or agreed to in writing, software
|
13 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
+
* See the License for the specific language governing permissions and
|
16 |
+
* limitations under the License.
|
17 |
+
*/
|
18 |
+
/**
|
19 |
+
* A class to contain the library configuration for the Google API client.
|
20 |
+
*/
|
21 |
+
class Google_Config
|
22 |
+
{
|
23 |
+
|
24 |
+
const GZIP_DISABLED = true;
|
25 |
+
|
26 |
+
const GZIP_ENABLED = false;
|
27 |
+
|
28 |
+
const GZIP_UPLOADS_ENABLED = true;
|
29 |
+
|
30 |
+
const GZIP_UPLOADS_DISABLED = false;
|
31 |
+
|
32 |
+
const USE_AUTO_IO_SELECTION = "auto";
|
33 |
+
|
34 |
+
protected $configuration;
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Create a new Google_Config.
|
38 |
+
* Can accept an ini file location with the
|
39 |
+
* local configuration. For example:
|
40 |
+
* application_name="My App"
|
41 |
+
*
|
42 |
+
* @param
|
43 |
+
* [$ini_file_location] - optional - The location of the ini file to load
|
44 |
+
*/
|
45 |
+
public function __construct($ini_file_location = null)
|
46 |
+
{
|
47 |
+
$this->configuration = array(
|
48 |
+
// The application_name is included in the User-Agent HTTP header.
|
49 |
+
'application_name' => '',
|
50 |
+
// Which Authentication, Storage and HTTP IO classes to use.
|
51 |
+
'auth_class' => 'Google_Auth_OAuth2',
|
52 |
+
'io_class' => self::USE_AUTO_IO_SELECTION,
|
53 |
+
'cache_class' => 'Google_Cache_File',
|
54 |
+
'logger_class' => 'Google_Logger_Null',
|
55 |
+
// Don't change these unless you're working against a special development
|
56 |
+
// or testing environment.
|
57 |
+
'base_path' => 'https://www.googleapis.com',
|
58 |
+
// Definition of class specific values, like file paths and so on.
|
59 |
+
'classes' => array(
|
60 |
+
'Google_IO_Abstract' => array(
|
61 |
+
'request_timeout_seconds' => 100
|
62 |
+
),
|
63 |
+
'Google_Logger_Abstract' => array(
|
64 |
+
'level' => 'debug',
|
65 |
+
'log_format' => "[%datetime%] %level%: %message% %context%\n",
|
66 |
+
'date_format' => 'd/M/Y:H:i:s O',
|
67 |
+
'allow_newlines' => true
|
68 |
+
),
|
69 |
+
'Google_Logger_File' => array(
|
70 |
+
'file' => 'php://stdout',
|
71 |
+
'mode' => 0640,
|
72 |
+
'lock' => false
|
73 |
+
),
|
74 |
+
'Google_Http_Request' => array(
|
75 |
+
// Disable the use of gzip on calls if set to true. Defaults to false.
|
76 |
+
'disable_gzip' => self::GZIP_ENABLED,
|
77 |
+
// We default gzip to disabled on uploads even if gzip is otherwise
|
78 |
+
// enabled, due to some issues seen with small packet sizes for uploads.
|
79 |
+
// Please test with this option before enabling gzip for uploads in
|
80 |
+
// a production environment.
|
81 |
+
'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED
|
82 |
+
),
|
83 |
+
// If you want to pass in OAuth 2.0 settings, they will need to be
|
84 |
+
// structured like this.
|
85 |
+
'Google_Auth_OAuth2' => array(
|
86 |
+
// Keys for OAuth 2.0 access, see the API console at
|
87 |
+
// https://developers.google.com/console
|
88 |
+
'client_id' => '',
|
89 |
+
'client_secret' => '',
|
90 |
+
'redirect_uri' => '',
|
91 |
+
// Simple API access key, also from the API console. Ensure you get
|
92 |
+
// a Server key, and not a Browser key.
|
93 |
+
'developer_key' => '',
|
94 |
+
// Other parameters.
|
95 |
+
'hd' => '',
|
96 |
+
'prompt' => '',
|
97 |
+
'openid.realm' => '',
|
98 |
+
'include_granted_scopes' => '',
|
99 |
+
'login_hint' => '',
|
100 |
+
'request_visible_actions' => '',
|
101 |
+
'access_type' => 'online',
|
102 |
+
'approval_prompt' => 'auto',
|
103 |
+
'federated_signon_certs_url' => 'https://www.googleapis.com/oauth2/v1/certs'
|
104 |
+
),
|
105 |
+
// Set a default directory for the file cache.
|
106 |
+
'Google_Cache_File' => array(
|
107 |
+
'directory' => sys_get_temp_dir() . '/Google_Client'
|
108 |
+
)
|
109 |
+
)
|
110 |
+
);
|
111 |
+
if ($ini_file_location) {
|
112 |
+
$ini = parse_ini_file($ini_file_location, true);
|
113 |
+
if (is_array($ini) && count($ini)) {
|
114 |
+
$merged_configuration = $ini + $this->configuration;
|
115 |
+
if (isset($ini['classes']) && isset($this->configuration['classes'])) {
|
116 |
+
$merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes'];
|
117 |
+
}
|
118 |
+
$this->configuration = $merged_configuration;
|
119 |
+
}
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Set configuration specific to a given class.
|
125 |
+
* $config->setClassConfig('Google_Cache_File',
|
126 |
+
* array('directory' => '/tmp/cache'));
|
127 |
+
*
|
128 |
+
* @param $class string
|
129 |
+
* The class name for the configuration
|
130 |
+
* @param $config string
|
131 |
+
* key or an array of configuration values
|
132 |
+
* @param $value string
|
133 |
+
* optional - if $config is a key, the value
|
134 |
+
*/
|
135 |
+
public function setClassConfig($class, $config, $value = null)
|
136 |
+
{
|
137 |
+
if (! is_array($config)) {
|
138 |
+
if (! isset($this->configuration['classes'][$class])) {
|
139 |
+
$this->configuration['classes'][$class] = array();
|
140 |
+
}
|
141 |
+
$this->configuration['classes'][$class][$config] = $value;
|
142 |
+
} else {
|
143 |
+
$this->configuration['classes'][$class] = $config;
|
144 |
+
}
|
145 |
+
}
|
146 |
+
|
147 |
+
public function getClassConfig($class, $key = null)
|
148 |
+
{
|
149 |
+
if (! isset($this->configuration['classes'][$class])) {
|
150 |
+
return null;
|
151 |
+
}
|
152 |
+
if ($key === null) {
|
153 |
+
return $this->configuration['classes'][$class];
|
154 |
+
} else {
|
155 |
+
return $this->configuration['classes'][$class][$key];
|
156 |
+
}
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Return the configured cache class.
|
161 |
+
*
|
162 |
+
* @return string
|
163 |
+
*/
|
164 |
+
public function getCacheClass()
|
165 |
+
{
|
166 |
+
return $this->configuration['cache_class'];
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Return the configured logger class.
|
171 |
+
*
|
172 |
+
* @return string
|
173 |
+
*/
|
174 |
+
public function getLoggerClass()
|
175 |
+
{
|
176 |
+
return $this->configuration['logger_class'];
|
177 |
+
}
|
178 |
+
|
179 |
+
/**
|
180 |
+
* Return the configured Auth class.
|
181 |
+
*
|
182 |
+
* @return string
|
183 |
+
*/
|
184 |
+
public function getAuthClass()
|
185 |
+
{
|
186 |
+
return $this->configuration['auth_class'];
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Set the auth class.
|
191 |
+
*
|
192 |
+
* @param $class string
|
193 |
+
* the class name to set
|
194 |
+
*/
|
195 |
+
public function setAuthClass($class)
|
196 |
+
{
|
197 |
+
$prev = $this->configuration['auth_class'];
|
198 |
+
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
199 |
+
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
200 |
+
}
|
201 |
+
$this->configuration['auth_class'] = $class;
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Set the IO class.
|
206 |
+
*
|
207 |
+
* @param $class string
|
208 |
+
* the class name to set
|
209 |
+
*/
|
210 |
+
public function setIoClass($class)
|
211 |
+
{
|
212 |
+
$prev = $this->configuration['io_class'];
|
213 |
+
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
214 |
+
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
215 |
+
}
|
216 |
+
$this->configuration['io_class'] = $class;
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* Set the cache class.
|
221 |
+
*
|
222 |
+
* @param $class string
|
223 |
+
* the class name to set
|
224 |
+
*/
|
225 |
+
public function setCacheClass($class)
|
226 |
+
{
|
227 |
+
$prev = $this->configuration['cache_class'];
|
228 |
+
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
229 |
+
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
230 |
+
}
|
231 |
+
$this->configuration['cache_class'] = $class;
|
232 |
+
}
|
233 |
+
|
234 |
+
/**
|
235 |
+
* Set the logger class.
|
236 |
+
*
|
237 |
+
* @param $class string
|
238 |
+
* the class name to set
|
239 |
+
*/
|
240 |
+
public function setLoggerClass($class)
|
241 |
+
{
|
242 |
+
$prev = $this->configuration['logger_class'];
|
243 |
+
if (! isset($this->configuration['classes'][$class]) && isset($this->configuration['classes'][$prev])) {
|
244 |
+
$this->configuration['classes'][$class] = $this->configuration['classes'][$prev];
|
245 |
+
}
|
246 |
+
$this->configuration['logger_class'] = $class;
|
247 |
+
}
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Return the configured IO class.
|
251 |
+
*
|
252 |
+
* @return string
|
253 |
+
*/
|
254 |
+
public function getIoClass()
|
255 |
+
{
|
256 |
+
return $this->configuration['io_class'];
|
257 |
+
}
|
258 |
+
|
259 |
+
/**
|
260 |
+
* Set the application name, this is included in the User-Agent HTTP header.
|
261 |
+
*
|
262 |
+
* @param string $name
|
263 |
+
*/
|
264 |
+
public function setApplicationName($name)
|
265 |
+
{
|
266 |
+
$this->configuration['application_name'] = $name;
|
267 |
+
}
|
268 |
+
|
269 |
+
/**
|
270 |
+
*
|
271 |
+
* @return string the name of the application
|
272 |
+
*/
|
273 |
+
public function getApplicationName()
|
274 |
+
{
|
275 |
+
return $this->configuration['application_name'];
|
276 |
+
}
|
277 |
+
|
278 |
+
/**
|
279 |
+
* Set the client ID for the auth class.
|
280 |
+
*
|
281 |
+
* @param $clientId string
|
282 |
+
* - the API console client ID
|
283 |
+
*/
|
284 |
+
public function setClientId($clientId)
|
285 |
+
{
|
286 |
+
$this->setAuthConfig('client_id', $clientId);
|
287 |
+
}
|
288 |
+
|
289 |
+
/**
|
290 |
+
* Set the client secret for the auth class.
|
291 |
+
*
|
292 |
+
* @param $secret string
|
293 |
+
* - the API console client secret
|
294 |
+
*/
|
295 |
+
public function setClientSecret($secret)
|
296 |
+
{
|
297 |
+
$this->setAuthConfig('client_secret', $secret);
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* Set the redirect uri for the auth class.
|
302 |
+
* Note that if using the
|
303 |
+
* Javascript based sign in flow, this should be the string 'postmessage'.
|
304 |
+
*
|
305 |
+
* @param $uri string
|
306 |
+
* - the URI that users should be redirected to
|
307 |
+
*/
|
308 |
+
public function setRedirectUri($uri)
|
309 |
+
{
|
310 |
+
$this->setAuthConfig('redirect_uri', $uri);
|
311 |
+
}
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Set the app activities for the auth class.
|
315 |
+
*
|
316 |
+
* @param $rva string
|
317 |
+
* a space separated list of app activity types
|
318 |
+
*/
|
319 |
+
public function setRequestVisibleActions($rva)
|
320 |
+
{
|
321 |
+
$this->setAuthConfig('request_visible_actions', $rva);
|
322 |
+
}
|
323 |
+
|
324 |
+
/**
|
325 |
+
* Set the the access type requested (offline or online.)
|
326 |
+
*
|
327 |
+
* @param $access string
|
328 |
+
* - the access type
|
329 |
+
*/
|
330 |
+
public function setAccessType($access)
|
331 |
+
{
|
332 |
+
$this->setAuthConfig('access_type', $access);
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Set when to show the approval prompt (auto or force)
|
337 |
+
*
|
338 |
+
* @param $approval string
|
339 |
+
* - the approval request
|
340 |
+
*/
|
341 |
+
public function setApprovalPrompt($approval)
|
342 |
+
{
|
343 |
+
$this->setAuthConfig('approval_prompt', $approval);
|
344 |
+
}
|
345 |
+
|
346 |
+
/**
|
347 |
+
* Set the login hint (email address or sub identifier)
|
348 |
+
*
|
349 |
+
* @param $hint string
|
350 |
+
*/
|
351 |
+
public function setLoginHint($hint)
|
352 |
+
{
|
353 |
+
$this->setAuthConfig('login_hint', $hint);
|
354 |
+
}
|
355 |
+
|
356 |
+
/**
|
357 |
+
* Set the developer key for the auth class.
|
358 |
+
* Note that this is separate value
|
359 |
+
* from the client ID - if it looks like a URL, its a client ID!
|
360 |
+
*
|
361 |
+
* @param $key string
|
362 |
+
* - the API console developer key
|
363 |
+
*/
|
364 |
+
public function setDeveloperKey($key)
|
365 |
+
{
|
366 |
+
$this->setAuthConfig('developer_key', $key);
|
367 |
+
}
|
368 |
+
|
369 |
+
/**
|
370 |
+
* Set the hd (hosted domain) parameter streamlines the login process for
|
371 |
+
* Google Apps hosted accounts.
|
372 |
+
* By including the domain of the user, you
|
373 |
+
* restrict sign-in to accounts at that domain.
|
374 |
+
*
|
375 |
+
* @param $hd string
|
376 |
+
* - the domain to use.
|
377 |
+
*/
|
378 |
+
public function setHostedDomain($hd)
|
379 |
+
{
|
380 |
+
$this->setAuthConfig('hd', $hd);
|
381 |
+
}
|
382 |
+
|
383 |
+
/**
|
384 |
+
* Set the prompt hint.
|
385 |
+
* Valid values are none, consent and select_account.
|
386 |
+
* If no value is specified and the user has not previously authorized
|
387 |
+
* access, then the user is shown a consent screen.
|
388 |
+
*
|
389 |
+
* @param $prompt string
|
390 |
+
*/
|
391 |
+
public function setPrompt($prompt)
|
392 |
+
{
|
393 |
+
$this->setAuthConfig('prompt', $prompt);
|
394 |
+
}
|
395 |
+
|
396 |
+
/**
|
397 |
+
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
398 |
+
* 2.0.
|
399 |
+
* It is used in OpenID 2.0 requests to signify the URL-space for which
|
400 |
+
* an authentication request is valid.
|
401 |
+
*
|
402 |
+
* @param $realm string
|
403 |
+
* - the URL-space to use.
|
404 |
+
*/
|
405 |
+
public function setOpenidRealm($realm)
|
406 |
+
{
|
407 |
+
$this->setAuthConfig('openid.realm', $realm);
|
408 |
+
}
|
409 |
+
|
410 |
+
/**
|
411 |
+
* If this is provided with the value true, and the authorization request is
|
412 |
+
* granted, the authorization will include any previous authorizations
|
413 |
+
* granted to this user/application combination for other scopes.
|
414 |
+
*
|
415 |
+
* @param $include boolean
|
416 |
+
* - the URL-space to use.
|
417 |
+
*/
|
418 |
+
public function setIncludeGrantedScopes($include)
|
419 |
+
{
|
420 |
+
$this->setAuthConfig('include_granted_scopes', $include ? "true" : "false");
|
421 |
+
}
|
422 |
+
|
423 |
+
/**
|
424 |
+
*
|
425 |
+
* @return string the base URL to use for API calls
|
426 |
+
*/
|
427 |
+
public function getBasePath()
|
428 |
+
{
|
429 |
+
return $this->configuration['base_path'];
|
430 |
+
}
|
431 |
+
|
432 |
+
/**
|
433 |
+
* Set the auth configuration for the current auth class.
|
434 |
+
*
|
435 |
+
* @param $key -
|
436 |
+
* the key to set
|
437 |
+
* @param $value -
|
438 |
+
* the parameter value
|
439 |
+
*/
|
440 |
+
private function setAuthConfig($key, $value)
|
441 |
+
{
|
442 |
+
if (! isset($this->configuration['classes'][$this->getAuthClass()])) {
|
443 |
+
$this->configuration['classes'][$this->getAuthClass()] = array();
|
444 |
+
}
|
445 |
+
$this->configuration['classes'][$this->getAuthClass()][$key] = $value;
|
446 |
+
}
|
447 |
}
|
tools/src/Google/Exception.php
CHANGED
@@ -1,20 +1,20 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
* Copyright 2013 Google Inc.
|
5 |
-
*
|
6 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
-
* you may not use this file except in compliance with the License.
|
8 |
-
* You may obtain a copy of the License at
|
9 |
-
*
|
10 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
-
*
|
12 |
-
* Unless required by applicable law or agreed to in writing, software
|
13 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
-
* See the License for the specific language governing permissions and
|
16 |
-
* limitations under the License.
|
17 |
-
*/
|
18 |
-
class Google_Exception extends Exception
|
19 |
-
{
|
20 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright 2013 Google Inc.
|
5 |
+
*
|
6 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
+
* you may not use this file except in compliance with the License.
|
8 |
+
* You may obtain a copy of the License at
|
9 |
+
*
|
10 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
+
*
|
12 |
+
* Unless required by applicable law or agreed to in writing, software
|
13 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
+
* See the License for the specific language governing permissions and
|
16 |
+
* limitations under the License.
|
17 |
+
*/
|
18 |
+
class Google_Exception extends Exception
|
19 |
+
{
|
20 |
}
|
tools/src/Google/Http/Batch.php
CHANGED
@@ -1,138 +1,138 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
*
|
21 |
-
* @author Chirag Shah <chirags@google.com>
|
22 |
-
*/
|
23 |
-
class Google_Http_Batch
|
24 |
-
{
|
25 |
-
|
26 |
-
/**
|
27 |
-
*
|
28 |
-
* @var string Multipart Boundary.
|
29 |
-
*/
|
30 |
-
private $boundary;
|
31 |
-
|
32 |
-
/**
|
33 |
-
*
|
34 |
-
* @var array service requests to be executed.
|
35 |
-
*/
|
36 |
-
private $requests = array();
|
37 |
-
|
38 |
-
/**
|
39 |
-
*
|
40 |
-
* @var Google_Client
|
41 |
-
*/
|
42 |
-
private $client;
|
43 |
-
|
44 |
-
private $expected_classes = array();
|
45 |
-
|
46 |
-
private $base_path;
|
47 |
-
|
48 |
-
public function __construct(Google_Client $client, $boundary = false)
|
49 |
-
{
|
50 |
-
$this->client = $client;
|
51 |
-
$this->base_path = $this->client->getBasePath();
|
52 |
-
$this->expected_classes = array();
|
53 |
-
$boundary = (false == $boundary) ? mt_rand() : $boundary;
|
54 |
-
$this->boundary = str_replace('"', '', $boundary);
|
55 |
-
}
|
56 |
-
|
57 |
-
public function add(Google_Http_Request $request, $key = false)
|
58 |
-
{
|
59 |
-
if (false == $key) {
|
60 |
-
$key = mt_rand();
|
61 |
-
}
|
62 |
-
$this->requests[$key] = $request;
|
63 |
-
}
|
64 |
-
|
65 |
-
public function execute()
|
66 |
-
{
|
67 |
-
$body = '';
|
68 |
-
/**
|
69 |
-
*
|
70 |
-
* @var Google_Http_Request $req
|
71 |
-
*/
|
72 |
-
foreach ($this->requests as $key => $req) {
|
73 |
-
$body .= "--{$this->boundary}\n";
|
74 |
-
$body .= $req->toBatchString($key) . "\n";
|
75 |
-
$this->expected_classes["response-" . $key] = $req->getExpectedClass();
|
76 |
-
}
|
77 |
-
$body = rtrim($body);
|
78 |
-
$body .= "\n--{$this->boundary}--";
|
79 |
-
$url = $this->base_path . '/batch';
|
80 |
-
$httpRequest = new Google_Http_Request($url, 'POST');
|
81 |
-
$httpRequest->setRequestHeaders(array(
|
82 |
-
'Content-Type' => 'multipart/mixed; boundary=' . $this->boundary
|
83 |
-
));
|
84 |
-
$httpRequest->setPostBody($body);
|
85 |
-
$response = $this->client->getIo()->makeRequest($httpRequest);
|
86 |
-
return $this->parseResponse($response);
|
87 |
-
}
|
88 |
-
|
89 |
-
public function parseResponse(Google_Http_Request $response)
|
90 |
-
{
|
91 |
-
$contentType = $response->getResponseHeader('content-type');
|
92 |
-
$contentType = explode(';', $contentType);
|
93 |
-
$boundary = false;
|
94 |
-
foreach ($contentType as $part) {
|
95 |
-
$part = (explode('=', $part, 2));
|
96 |
-
if (isset($part[0]) && 'boundary' == trim($part[0])) {
|
97 |
-
$boundary = $part[1];
|
98 |
-
}
|
99 |
-
}
|
100 |
-
$body = $response->getResponseBody();
|
101 |
-
if ($body) {
|
102 |
-
$body = str_replace("--$boundary--", "--$boundary", $body);
|
103 |
-
$parts = explode("--$boundary", $body);
|
104 |
-
$responses = array();
|
105 |
-
foreach ($parts as $part) {
|
106 |
-
$part = trim($part);
|
107 |
-
if (! empty($part)) {
|
108 |
-
list ($metaHeaders, $part) = explode("\r\n\r\n", $part, 2);
|
109 |
-
$metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders);
|
110 |
-
$status = substr($part, 0, strpos($part, "\n"));
|
111 |
-
$status = explode(" ", $status);
|
112 |
-
$status = $status[1];
|
113 |
-
list ($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false);
|
114 |
-
$response = new Google_Http_Request("");
|
115 |
-
$response->setResponseHttpCode($status);
|
116 |
-
$response->setResponseHeaders($partHeaders);
|
117 |
-
$response->setResponseBody($partBody);
|
118 |
-
// Need content id.
|
119 |
-
$key = $metaHeaders['content-id'];
|
120 |
-
if (isset($this->expected_classes[$key]) && strlen($this->expected_classes[$key]) > 0) {
|
121 |
-
$class = $this->expected_classes[$key];
|
122 |
-
$response->setExpectedClass($class);
|
123 |
-
}
|
124 |
-
try {
|
125 |
-
$response = Google_Http_REST::decodeHttpResponse($response, $this->client);
|
126 |
-
$responses[$key] = $response;
|
127 |
-
} catch (Google_Service_Exception $e) {
|
128 |
-
// Store the exception as the response, so successful responses
|
129 |
-
// can be processed.
|
130 |
-
$responses[$key] = $e;
|
131 |
-
}
|
132 |
-
}
|
133 |
-
}
|
134 |
-
return $responses;
|
135 |
-
}
|
136 |
-
return null;
|
137 |
-
}
|
138 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
*
|
21 |
+
* @author Chirag Shah <chirags@google.com>
|
22 |
+
*/
|
23 |
+
class Google_Http_Batch
|
24 |
+
{
|
25 |
+
|
26 |
+
/**
|
27 |
+
*
|
28 |
+
* @var string Multipart Boundary.
|
29 |
+
*/
|
30 |
+
private $boundary;
|
31 |
+
|
32 |
+
/**
|
33 |
+
*
|
34 |
+
* @var array service requests to be executed.
|
35 |
+
*/
|
36 |
+
private $requests = array();
|
37 |
+
|
38 |
+
/**
|
39 |
+
*
|
40 |
+
* @var Google_Client
|
41 |
+
*/
|
42 |
+
private $client;
|
43 |
+
|
44 |
+
private $expected_classes = array();
|
45 |
+
|
46 |
+
private $base_path;
|
47 |
+
|
48 |
+
public function __construct(Google_Client $client, $boundary = false)
|
49 |
+
{
|
50 |
+
$this->client = $client;
|
51 |
+
$this->base_path = $this->client->getBasePath();
|
52 |
+
$this->expected_classes = array();
|
53 |
+
$boundary = (false == $boundary) ? mt_rand() : $boundary;
|
54 |
+
$this->boundary = str_replace('"', '', $boundary);
|
55 |
+
}
|
56 |
+
|
57 |
+
public function add(Google_Http_Request $request, $key = false)
|
58 |
+
{
|
59 |
+
if (false == $key) {
|
60 |
+
$key = mt_rand();
|
61 |
+
}
|
62 |
+
$this->requests[$key] = $request;
|
63 |
+
}
|
64 |
+
|
65 |
+
public function execute()
|
66 |
+
{
|
67 |
+
$body = '';
|
68 |
+
/**
|
69 |
+
*
|
70 |
+
* @var Google_Http_Request $req
|
71 |
+
*/
|
72 |
+
foreach ($this->requests as $key => $req) {
|
73 |
+
$body .= "--{$this->boundary}\n";
|
74 |
+
$body .= $req->toBatchString($key) . "\n";
|
75 |
+
$this->expected_classes["response-" . $key] = $req->getExpectedClass();
|
76 |
+
}
|
77 |
+
$body = rtrim($body);
|
78 |
+
$body .= "\n--{$this->boundary}--";
|
79 |
+
$url = $this->base_path . '/batch';
|
80 |
+
$httpRequest = new Google_Http_Request($url, 'POST');
|
81 |
+
$httpRequest->setRequestHeaders(array(
|
82 |
+
'Content-Type' => 'multipart/mixed; boundary=' . $this->boundary
|
83 |
+
));
|
84 |
+
$httpRequest->setPostBody($body);
|
85 |
+
$response = $this->client->getIo()->makeRequest($httpRequest);
|
86 |
+
return $this->parseResponse($response);
|
87 |
+
}
|
88 |
+
|
89 |
+
public function parseResponse(Google_Http_Request $response)
|
90 |
+
{
|
91 |
+
$contentType = $response->getResponseHeader('content-type');
|
92 |
+
$contentType = explode(';', $contentType);
|
93 |
+
$boundary = false;
|
94 |
+
foreach ($contentType as $part) {
|
95 |
+
$part = (explode('=', $part, 2));
|
96 |
+
if (isset($part[0]) && 'boundary' == trim($part[0])) {
|
97 |
+
$boundary = $part[1];
|
98 |
+
}
|
99 |
+
}
|
100 |
+
$body = $response->getResponseBody();
|
101 |
+
if ($body) {
|
102 |
+
$body = str_replace("--$boundary--", "--$boundary", $body);
|
103 |
+
$parts = explode("--$boundary", $body);
|
104 |
+
$responses = array();
|
105 |
+
foreach ($parts as $part) {
|
106 |
+
$part = trim($part);
|
107 |
+
if (! empty($part)) {
|
108 |
+
list ($metaHeaders, $part) = explode("\r\n\r\n", $part, 2);
|
109 |
+
$metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders);
|
110 |
+
$status = substr($part, 0, strpos($part, "\n"));
|
111 |
+
$status = explode(" ", $status);
|
112 |
+
$status = $status[1];
|
113 |
+
list ($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false);
|
114 |
+
$response = new Google_Http_Request("");
|
115 |
+
$response->setResponseHttpCode($status);
|
116 |
+
$response->setResponseHeaders($partHeaders);
|
117 |
+
$response->setResponseBody($partBody);
|
118 |
+
// Need content id.
|
119 |
+
$key = $metaHeaders['content-id'];
|
120 |
+
if (isset($this->expected_classes[$key]) && strlen($this->expected_classes[$key]) > 0) {
|
121 |
+
$class = $this->expected_classes[$key];
|
122 |
+
$response->setExpectedClass($class);
|
123 |
+
}
|
124 |
+
try {
|
125 |
+
$response = Google_Http_REST::decodeHttpResponse($response, $this->client);
|
126 |
+
$responses[$key] = $response;
|
127 |
+
} catch (Google_Service_Exception $e) {
|
128 |
+
// Store the exception as the response, so successful responses
|
129 |
+
// can be processed.
|
130 |
+
$responses[$key] = $e;
|
131 |
+
}
|
132 |
+
}
|
133 |
+
}
|
134 |
+
return $responses;
|
135 |
+
}
|
136 |
+
return null;
|
137 |
+
}
|
138 |
}
|
tools/src/Google/Http/CacheParser.php
CHANGED
@@ -1,182 +1,182 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Implement the caching directives specified in rfc2616.
|
21 |
-
* This
|
22 |
-
* implementation is guided by the guidance offered in rfc2616-sec13.
|
23 |
-
*
|
24 |
-
* @author Chirag Shah <chirags@google.com>
|
25 |
-
*/
|
26 |
-
class Google_Http_CacheParser
|
27 |
-
{
|
28 |
-
|
29 |
-
public static $CACHEABLE_HTTP_METHODS = array(
|
30 |
-
'GET',
|
31 |
-
'HEAD'
|
32 |
-
);
|
33 |
-
|
34 |
-
public static $CACHEABLE_STATUS_CODES = array(
|
35 |
-
'200',
|
36 |
-
'203',
|
37 |
-
'300',
|
38 |
-
'301'
|
39 |
-
);
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Check if an HTTP request can be cached by a private local cache.
|
43 |
-
*
|
44 |
-
* @static
|
45 |
-
*
|
46 |
-
* @param Google_Http_Request $resp
|
47 |
-
* @return bool True if the request is cacheable.
|
48 |
-
* False if the request is uncacheable.
|
49 |
-
*/
|
50 |
-
public static function isRequestCacheable(Google_Http_Request $resp)
|
51 |
-
{
|
52 |
-
$method = $resp->getRequestMethod();
|
53 |
-
if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) {
|
54 |
-
return false;
|
55 |
-
}
|
56 |
-
// Don't cache authorized requests/responses.
|
57 |
-
// [rfc2616-14.8] When a shared cache receives a request containing an
|
58 |
-
// Authorization field, it MUST NOT return the corresponding response
|
59 |
-
// as a reply to any other request...
|
60 |
-
if ($resp->getRequestHeader("authorization")) {
|
61 |
-
return false;
|
62 |
-
}
|
63 |
-
return true;
|
64 |
-
}
|
65 |
-
|
66 |
-
/**
|
67 |
-
* Check if an HTTP response can be cached by a private local cache.
|
68 |
-
*
|
69 |
-
* @static
|
70 |
-
*
|
71 |
-
* @param Google_Http_Request $resp
|
72 |
-
* @return bool True if the response is cacheable.
|
73 |
-
* False if the response is un-cacheable.
|
74 |
-
*/
|
75 |
-
public static function isResponseCacheable(Google_Http_Request $resp)
|
76 |
-
{
|
77 |
-
// First, check if the HTTP request was cacheable before inspecting the
|
78 |
-
// HTTP response.
|
79 |
-
if (false == self::isRequestCacheable($resp)) {
|
80 |
-
return false;
|
81 |
-
}
|
82 |
-
$code = $resp->getResponseHttpCode();
|
83 |
-
if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) {
|
84 |
-
return false;
|
85 |
-
}
|
86 |
-
// The resource is uncacheable if the resource is already expired and
|
87 |
-
// the resource doesn't have an ETag for revalidation.
|
88 |
-
$etag = $resp->getResponseHeader("etag");
|
89 |
-
if (self::isExpired($resp) && $etag == false) {
|
90 |
-
return false;
|
91 |
-
}
|
92 |
-
// [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT
|
93 |
-
// store any part of either this response or the request that elicited it.
|
94 |
-
$cacheControl = $resp->getParsedCacheControl();
|
95 |
-
if (isset($cacheControl['no-store'])) {
|
96 |
-
return false;
|
97 |
-
}
|
98 |
-
// Pragma: no-cache is an http request directive, but is occasionally
|
99 |
-
// used as a response header incorrectly.
|
100 |
-
$pragma = $resp->getResponseHeader('pragma');
|
101 |
-
if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) {
|
102 |
-
return false;
|
103 |
-
}
|
104 |
-
// [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that
|
105 |
-
// a cache cannot determine from the request headers of a subsequent request
|
106 |
-
// whether this response is the appropriate representation."
|
107 |
-
// Given this, we deem responses with the Vary header as uncacheable.
|
108 |
-
$vary = $resp->getResponseHeader('vary');
|
109 |
-
if ($vary) {
|
110 |
-
return false;
|
111 |
-
}
|
112 |
-
return true;
|
113 |
-
}
|
114 |
-
|
115 |
-
/**
|
116 |
-
*
|
117 |
-
* @static
|
118 |
-
*
|
119 |
-
* @param Google_Http_Request $resp
|
120 |
-
* @return bool True if the HTTP response is considered to be expired.
|
121 |
-
* False if it is considered to be fresh.
|
122 |
-
*/
|
123 |
-
public static function isExpired(Google_Http_Request $resp)
|
124 |
-
{
|
125 |
-
// HTTP/1.1 clients and caches MUST treat other invalid date formats,
|
126 |
-
// especially including the value “0”, as in the past.
|
127 |
-
$parsedExpires = false;
|
128 |
-
$responseHeaders = $resp->getResponseHeaders();
|
129 |
-
if (isset($responseHeaders['expires'])) {
|
130 |
-
$rawExpires = $responseHeaders['expires'];
|
131 |
-
// Check for a malformed expires header first.
|
132 |
-
if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) {
|
133 |
-
return true;
|
134 |
-
}
|
135 |
-
// See if we can parse the expires header.
|
136 |
-
$parsedExpires = strtotime($rawExpires);
|
137 |
-
if (false == $parsedExpires || $parsedExpires <= 0) {
|
138 |
-
return true;
|
139 |
-
}
|
140 |
-
}
|
141 |
-
// Calculate the freshness of an http response.
|
142 |
-
$freshnessLifetime = false;
|
143 |
-
$cacheControl = $resp->getParsedCacheControl();
|
144 |
-
if (isset($cacheControl['max-age'])) {
|
145 |
-
$freshnessLifetime = $cacheControl['max-age'];
|
146 |
-
}
|
147 |
-
$rawDate = $resp->getResponseHeader('date');
|
148 |
-
$parsedDate = strtotime($rawDate);
|
149 |
-
if (empty($rawDate) || false == $parsedDate) {
|
150 |
-
// We can't default this to now, as that means future cache reads
|
151 |
-
// will always pass with the logic below, so we will require a
|
152 |
-
// date be injected if not supplied.
|
153 |
-
throw new Google_Exception("All cacheable requests must have creation dates.");
|
154 |
-
}
|
155 |
-
if (false == $freshnessLifetime && isset($responseHeaders['expires'])) {
|
156 |
-
$freshnessLifetime = $parsedExpires - $parsedDate;
|
157 |
-
}
|
158 |
-
if (false == $freshnessLifetime) {
|
159 |
-
return true;
|
160 |
-
}
|
161 |
-
// Calculate the age of an http response.
|
162 |
-
$age = max(0, time() - $parsedDate);
|
163 |
-
if (isset($responseHeaders['age'])) {
|
164 |
-
$age = max($age, strtotime($responseHeaders['age']));
|
165 |
-
}
|
166 |
-
return $freshnessLifetime <= $age;
|
167 |
-
}
|
168 |
-
|
169 |
-
/**
|
170 |
-
* Determine if a cache entry should be revalidated with by the origin.
|
171 |
-
*
|
172 |
-
* @param Google_Http_Request $response
|
173 |
-
* @return bool True if the entry is expired, else return false.
|
174 |
-
*/
|
175 |
-
public static function mustRevalidate(Google_Http_Request $response)
|
176 |
-
{
|
177 |
-
// [13.3] When a cache has a stale entry that it would like to use as a
|
178 |
-
// response to a client's request, it first has to check with the origin
|
179 |
-
// server to see if its cached entry is still usable.
|
180 |
-
return self::isExpired($response);
|
181 |
-
}
|
182 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Implement the caching directives specified in rfc2616.
|
21 |
+
* This
|
22 |
+
* implementation is guided by the guidance offered in rfc2616-sec13.
|
23 |
+
*
|
24 |
+
* @author Chirag Shah <chirags@google.com>
|
25 |
+
*/
|
26 |
+
class Google_Http_CacheParser
|
27 |
+
{
|
28 |
+
|
29 |
+
public static $CACHEABLE_HTTP_METHODS = array(
|
30 |
+
'GET',
|
31 |
+
'HEAD'
|
32 |
+
);
|
33 |
+
|
34 |
+
public static $CACHEABLE_STATUS_CODES = array(
|
35 |
+
'200',
|
36 |
+
'203',
|
37 |
+
'300',
|
38 |
+
'301'
|
39 |
+
);
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Check if an HTTP request can be cached by a private local cache.
|
43 |
+
*
|
44 |
+
* @static
|
45 |
+
*
|
46 |
+
* @param Google_Http_Request $resp
|
47 |
+
* @return bool True if the request is cacheable.
|
48 |
+
* False if the request is uncacheable.
|
49 |
+
*/
|
50 |
+
public static function isRequestCacheable(Google_Http_Request $resp)
|
51 |
+
{
|
52 |
+
$method = $resp->getRequestMethod();
|
53 |
+
if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) {
|
54 |
+
return false;
|
55 |
+
}
|
56 |
+
// Don't cache authorized requests/responses.
|
57 |
+
// [rfc2616-14.8] When a shared cache receives a request containing an
|
58 |
+
// Authorization field, it MUST NOT return the corresponding response
|
59 |
+
// as a reply to any other request...
|
60 |
+
if ($resp->getRequestHeader("authorization")) {
|
61 |
+
return false;
|
62 |
+
}
|
63 |
+
return true;
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Check if an HTTP response can be cached by a private local cache.
|
68 |
+
*
|
69 |
+
* @static
|
70 |
+
*
|
71 |
+
* @param Google_Http_Request $resp
|
72 |
+
* @return bool True if the response is cacheable.
|
73 |
+
* False if the response is un-cacheable.
|
74 |
+
*/
|
75 |
+
public static function isResponseCacheable(Google_Http_Request $resp)
|
76 |
+
{
|
77 |
+
// First, check if the HTTP request was cacheable before inspecting the
|
78 |
+
// HTTP response.
|
79 |
+
if (false == self::isRequestCacheable($resp)) {
|
80 |
+
return false;
|
81 |
+
}
|
82 |
+
$code = $resp->getResponseHttpCode();
|
83 |
+
if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) {
|
84 |
+
return false;
|
85 |
+
}
|
86 |
+
// The resource is uncacheable if the resource is already expired and
|
87 |
+
// the resource doesn't have an ETag for revalidation.
|
88 |
+
$etag = $resp->getResponseHeader("etag");
|
89 |
+
if (self::isExpired($resp) && $etag == false) {
|
90 |
+
return false;
|
91 |
+
}
|
92 |
+
// [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT
|
93 |
+
// store any part of either this response or the request that elicited it.
|
94 |
+
$cacheControl = $resp->getParsedCacheControl();
|
95 |
+
if (isset($cacheControl['no-store'])) {
|
96 |
+
return false;
|
97 |
+
}
|
98 |
+
// Pragma: no-cache is an http request directive, but is occasionally
|
99 |
+
// used as a response header incorrectly.
|
100 |
+
$pragma = $resp->getResponseHeader('pragma');
|
101 |
+
if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) {
|
102 |
+
return false;
|
103 |
+
}
|
104 |
+
// [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that
|
105 |
+
// a cache cannot determine from the request headers of a subsequent request
|
106 |
+
// whether this response is the appropriate representation."
|
107 |
+
// Given this, we deem responses with the Vary header as uncacheable.
|
108 |
+
$vary = $resp->getResponseHeader('vary');
|
109 |
+
if ($vary) {
|
110 |
+
return false;
|
111 |
+
}
|
112 |
+
return true;
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
*
|
117 |
+
* @static
|
118 |
+
*
|
119 |
+
* @param Google_Http_Request $resp
|
120 |
+
* @return bool True if the HTTP response is considered to be expired.
|
121 |
+
* False if it is considered to be fresh.
|
122 |
+
*/
|
123 |
+
public static function isExpired(Google_Http_Request $resp)
|
124 |
+
{
|
125 |
+
// HTTP/1.1 clients and caches MUST treat other invalid date formats,
|
126 |
+
// especially including the value “0”, as in the past.
|
127 |
+
$parsedExpires = false;
|
128 |
+
$responseHeaders = $resp->getResponseHeaders();
|
129 |
+
if (isset($responseHeaders['expires'])) {
|
130 |
+
$rawExpires = $responseHeaders['expires'];
|
131 |
+
// Check for a malformed expires header first.
|
132 |
+
if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) {
|
133 |
+
return true;
|
134 |
+
}
|
135 |
+
// See if we can parse the expires header.
|
136 |
+
$parsedExpires = strtotime($rawExpires);
|
137 |
+
if (false == $parsedExpires || $parsedExpires <= 0) {
|
138 |
+
return true;
|
139 |
+
}
|
140 |
+
}
|
141 |
+
// Calculate the freshness of an http response.
|
142 |
+
$freshnessLifetime = false;
|
143 |
+
$cacheControl = $resp->getParsedCacheControl();
|
144 |
+
if (isset($cacheControl['max-age'])) {
|
145 |
+
$freshnessLifetime = $cacheControl['max-age'];
|
146 |
+
}
|
147 |
+
$rawDate = $resp->getResponseHeader('date');
|
148 |
+
$parsedDate = strtotime($rawDate);
|
149 |
+
if (empty($rawDate) || false == $parsedDate) {
|
150 |
+
// We can't default this to now, as that means future cache reads
|
151 |
+
// will always pass with the logic below, so we will require a
|
152 |
+
// date be injected if not supplied.
|
153 |
+
throw new Google_Exception("All cacheable requests must have creation dates.");
|
154 |
+
}
|
155 |
+
if (false == $freshnessLifetime && isset($responseHeaders['expires'])) {
|
156 |
+
$freshnessLifetime = $parsedExpires - $parsedDate;
|
157 |
+
}
|
158 |
+
if (false == $freshnessLifetime) {
|
159 |
+
return true;
|
160 |
+
}
|
161 |
+
// Calculate the age of an http response.
|
162 |
+
$age = max(0, time() - $parsedDate);
|
163 |
+
if (isset($responseHeaders['age'])) {
|
164 |
+
$age = max($age, strtotime($responseHeaders['age']));
|
165 |
+
}
|
166 |
+
return $freshnessLifetime <= $age;
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Determine if a cache entry should be revalidated with by the origin.
|
171 |
+
*
|
172 |
+
* @param Google_Http_Request $response
|
173 |
+
* @return bool True if the entry is expired, else return false.
|
174 |
+
*/
|
175 |
+
public static function mustRevalidate(Google_Http_Request $response)
|
176 |
+
{
|
177 |
+
// [13.3] When a cache has a stale entry that it would like to use as a
|
178 |
+
// response to a client's request, it first has to check with the origin
|
179 |
+
// server to see if its cached entry is still usable.
|
180 |
+
return self::isExpired($response);
|
181 |
+
}
|
182 |
}
|
tools/src/Google/Http/MediaFileUpload.php
CHANGED
@@ -1,315 +1,315 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
*
|
21 |
-
* @author Chirag Shah <chirags@google.com>
|
22 |
-
*
|
23 |
-
*/
|
24 |
-
class Google_Http_MediaFileUpload
|
25 |
-
{
|
26 |
-
|
27 |
-
const UPLOAD_MEDIA_TYPE = 'media';
|
28 |
-
|
29 |
-
const UPLOAD_MULTIPART_TYPE = 'multipart';
|
30 |
-
|
31 |
-
const UPLOAD_RESUMABLE_TYPE = 'resumable';
|
32 |
-
|
33 |
-
/**
|
34 |
-
*
|
35 |
-
* @var string $mimeType
|
36 |
-
*/
|
37 |
-
private $mimeType;
|
38 |
-
|
39 |
-
/**
|
40 |
-
*
|
41 |
-
* @var string $data
|
42 |
-
*/
|
43 |
-
private $data;
|
44 |
-
|
45 |
-
/**
|
46 |
-
*
|
47 |
-
* @var bool $resumable
|
48 |
-
*/
|
49 |
-
private $resumable;
|
50 |
-
|
51 |
-
/**
|
52 |
-
*
|
53 |
-
* @var int $chunkSize
|
54 |
-
*/
|
55 |
-
private $chunkSize;
|
56 |
-
|
57 |
-
/**
|
58 |
-
*
|
59 |
-
* @var int $size
|
60 |
-
*/
|
61 |
-
private $size;
|
62 |
-
|
63 |
-
/**
|
64 |
-
*
|
65 |
-
* @var string $resumeUri
|
66 |
-
*/
|
67 |
-
private $resumeUri;
|
68 |
-
|
69 |
-
/**
|
70 |
-
*
|
71 |
-
* @var int $progress
|
72 |
-
*/
|
73 |
-
private $progress;
|
74 |
-
|
75 |
-
/**
|
76 |
-
*
|
77 |
-
* @var Google_Client
|
78 |
-
*/
|
79 |
-
private $client;
|
80 |
-
|
81 |
-
/**
|
82 |
-
*
|
83 |
-
* @var Google_Http_Request
|
84 |
-
*/
|
85 |
-
private $request;
|
86 |
-
|
87 |
-
/**
|
88 |
-
*
|
89 |
-
* @var string
|
90 |
-
*/
|
91 |
-
private $boundary;
|
92 |
-
|
93 |
-
/**
|
94 |
-
* Result code from last HTTP call
|
95 |
-
*
|
96 |
-
* @var int
|
97 |
-
*/
|
98 |
-
private $httpResultCode;
|
99 |
-
|
100 |
-
/**
|
101 |
-
*
|
102 |
-
* @param $mimeType string
|
103 |
-
* @param $data string
|
104 |
-
* The bytes you want to upload.
|
105 |
-
* @param $resumable bool
|
106 |
-
* @param bool $chunkSize
|
107 |
-
* File will be uploaded in chunks of this many bytes.
|
108 |
-
* only used if resumable=True
|
109 |
-
*/
|
110 |
-
public function __construct(Google_Client $client, Google_Http_Request $request, $mimeType, $data, $resumable = false, $chunkSize = false, $boundary = false)
|
111 |
-
{
|
112 |
-
$this->client = $client;
|
113 |
-
$this->request = $request;
|
114 |
-
$this->mimeType = $mimeType;
|
115 |
-
$this->data = $data;
|
116 |
-
$this->size = strlen($this->data);
|
117 |
-
$this->resumable = $resumable;
|
118 |
-
if (! $chunkSize) {
|
119 |
-
$chunkSize = 256 * 1024;
|
120 |
-
}
|
121 |
-
$this->chunkSize = $chunkSize;
|
122 |
-
$this->progress = 0;
|
123 |
-
$this->boundary = $boundary;
|
124 |
-
// Process Media Request
|
125 |
-
$this->process();
|
126 |
-
}
|
127 |
-
|
128 |
-
/**
|
129 |
-
* Set the size of the file that is being uploaded.
|
130 |
-
*
|
131 |
-
* @param $size -
|
132 |
-
* int file size in bytes
|
133 |
-
*/
|
134 |
-
public function setFileSize($size)
|
135 |
-
{
|
136 |
-
$this->size = $size;
|
137 |
-
}
|
138 |
-
|
139 |
-
/**
|
140 |
-
* Return the progress on the upload
|
141 |
-
*
|
142 |
-
* @return int progress in bytes uploaded.
|
143 |
-
*/
|
144 |
-
public function getProgress()
|
145 |
-
{
|
146 |
-
return $this->progress;
|
147 |
-
}
|
148 |
-
|
149 |
-
/**
|
150 |
-
* Return the HTTP result code from the last call made.
|
151 |
-
*
|
152 |
-
* @return int code
|
153 |
-
*/
|
154 |
-
public function getHttpResultCode()
|
155 |
-
{
|
156 |
-
return $this->httpResultCode;
|
157 |
-
}
|
158 |
-
|
159 |
-
/**
|
160 |
-
* Send the next part of the file to upload.
|
161 |
-
*
|
162 |
-
* @param
|
163 |
-
* [$chunk] the next set of bytes to send. If false will used $data passed
|
164 |
-
* at construct time.
|
165 |
-
*/
|
166 |
-
public function nextChunk($chunk = false)
|
167 |
-
{
|
168 |
-
if (false == $this->resumeUri) {
|
169 |
-
$this->resumeUri = $this->getResumeUri();
|
170 |
-
}
|
171 |
-
if (false == $chunk) {
|
172 |
-
$chunk = substr($this->data, $this->progress, $this->chunkSize);
|
173 |
-
}
|
174 |
-
$lastBytePos = $this->progress + strlen($chunk) - 1;
|
175 |
-
$headers = array(
|
176 |
-
'content-range' => "bytes $this->progress-$lastBytePos/$this->size",
|
177 |
-
'content-type' => $this->request->getRequestHeader('content-type'),
|
178 |
-
'content-length' => $this->chunkSize,
|
179 |
-
'expect' => ''
|
180 |
-
);
|
181 |
-
$httpRequest = new Google_Http_Request($this->resumeUri, 'PUT', $headers, $chunk);
|
182 |
-
if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) {
|
183 |
-
$httpRequest->enableGzip();
|
184 |
-
} else {
|
185 |
-
$httpRequest->disableGzip();
|
186 |
-
}
|
187 |
-
$response = $this->client->getIo()->makeRequest($httpRequest);
|
188 |
-
$response->setExpectedClass($this->request->getExpectedClass());
|
189 |
-
$code = $response->getResponseHttpCode();
|
190 |
-
$this->httpResultCode = $code;
|
191 |
-
if (308 == $code) {
|
192 |
-
// Track the amount uploaded.
|
193 |
-
$range = explode('-', $response->getResponseHeader('range'));
|
194 |
-
$this->progress = $range[1] + 1;
|
195 |
-
// Allow for changing upload URLs.
|
196 |
-
$location = $response->getResponseHeader('location');
|
197 |
-
if ($location) {
|
198 |
-
$this->resumeUri = $location;
|
199 |
-
}
|
200 |
-
// No problems, but upload not complete.
|
201 |
-
return false;
|
202 |
-
} else {
|
203 |
-
return Google_Http_REST::decodeHttpResponse($response, $this->client);
|
204 |
-
}
|
205 |
-
}
|
206 |
-
|
207 |
-
/**
|
208 |
-
*
|
209 |
-
* @param
|
210 |
-
* $meta
|
211 |
-
* @param
|
212 |
-
* $params
|
213 |
-
* @return array|bool @visible for testing
|
214 |
-
*/
|
215 |
-
private function process()
|
216 |
-
{
|
217 |
-
$postBody = false;
|
218 |
-
$contentType = false;
|
219 |
-
$meta = $this->request->getPostBody();
|
220 |
-
$meta = is_string($meta) ? json_decode($meta, true) : $meta;
|
221 |
-
$uploadType = $this->getUploadType($meta);
|
222 |
-
$this->request->setQueryParam('uploadType', $uploadType);
|
223 |
-
$this->transformToUploadUrl();
|
224 |
-
$mimeType = $this->mimeType ? $this->mimeType : $this->request->getRequestHeader('content-type');
|
225 |
-
if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) {
|
226 |
-
$contentType = $mimeType;
|
227 |
-
$postBody = is_string($meta) ? $meta : json_encode($meta);
|
228 |
-
} else
|
229 |
-
if (self::UPLOAD_MEDIA_TYPE == $uploadType) {
|
230 |
-
$contentType = $mimeType;
|
231 |
-
$postBody = $this->data;
|
232 |
-
} else
|
233 |
-
if (self::UPLOAD_MULTIPART_TYPE == $uploadType) {
|
234 |
-
// This is a multipart/related upload.
|
235 |
-
$boundary = $this->boundary ? $this->boundary : mt_rand();
|
236 |
-
$boundary = str_replace('"', '', $boundary);
|
237 |
-
$contentType = 'multipart/related; boundary=' . $boundary;
|
238 |
-
$related = "--$boundary\r\n";
|
239 |
-
$related .= "Content-Type: application/json; charset=UTF-8\r\n";
|
240 |
-
$related .= "\r\n" . json_encode($meta) . "\r\n";
|
241 |
-
$related .= "--$boundary\r\n";
|
242 |
-
$related .= "Content-Type: $mimeType\r\n";
|
243 |
-
$related .= "Content-Transfer-Encoding: base64\r\n";
|
244 |
-
$related .= "\r\n" . base64_encode($this->data) . "\r\n";
|
245 |
-
$related .= "--$boundary--";
|
246 |
-
$postBody = $related;
|
247 |
-
}
|
248 |
-
$this->request->setPostBody($postBody);
|
249 |
-
if (isset($contentType) && $contentType) {
|
250 |
-
$contentTypeHeader['content-type'] = $contentType;
|
251 |
-
$this->request->setRequestHeaders($contentTypeHeader);
|
252 |
-
}
|
253 |
-
}
|
254 |
-
|
255 |
-
private function transformToUploadUrl()
|
256 |
-
{
|
257 |
-
$base = $this->request->getBaseComponent();
|
258 |
-
$this->request->setBaseComponent($base . '/upload');
|
259 |
-
}
|
260 |
-
|
261 |
-
/**
|
262 |
-
* Valid upload types:
|
263 |
-
* - resumable (UPLOAD_RESUMABLE_TYPE)
|
264 |
-
* - media (UPLOAD_MEDIA_TYPE)
|
265 |
-
* - multipart (UPLOAD_MULTIPART_TYPE)
|
266 |
-
*
|
267 |
-
* @param
|
268 |
-
* $meta
|
269 |
-
* @return string @visible for testing
|
270 |
-
*/
|
271 |
-
public function getUploadType($meta)
|
272 |
-
{
|
273 |
-
if ($this->resumable) {
|
274 |
-
return self::UPLOAD_RESUMABLE_TYPE;
|
275 |
-
}
|
276 |
-
if (false == $meta && $this->data) {
|
277 |
-
return self::UPLOAD_MEDIA_TYPE;
|
278 |
-
}
|
279 |
-
return self::UPLOAD_MULTIPART_TYPE;
|
280 |
-
}
|
281 |
-
|
282 |
-
private function getResumeUri()
|
283 |
-
{
|
284 |
-
$result = null;
|
285 |
-
$body = $this->request->getPostBody();
|
286 |
-
if ($body) {
|
287 |
-
$headers = array(
|
288 |
-
'content-type' => 'application/json; charset=UTF-8',
|
289 |
-
'content-length' => Google_Utils::getStrLen($body),
|
290 |
-
'x-upload-content-type' => $this->mimeType,
|
291 |
-
'x-upload-content-length' => $this->size,
|
292 |
-
'expect' => ''
|
293 |
-
);
|
294 |
-
$this->request->setRequestHeaders($headers);
|
295 |
-
}
|
296 |
-
$response = $this->client->getIo()->makeRequest($this->request);
|
297 |
-
$location = $response->getResponseHeader('location');
|
298 |
-
$code = $response->getResponseHttpCode();
|
299 |
-
if (200 == $code && true == $location) {
|
300 |
-
return $location;
|
301 |
-
}
|
302 |
-
$message = $code;
|
303 |
-
$body = @json_decode($response->getResponseBody());
|
304 |
-
if (! empty($body->error->errors)) {
|
305 |
-
$message .= ': ';
|
306 |
-
foreach ($body->error->errors as $error) {
|
307 |
-
$message .= "{$error->domain}, {$error->message};";
|
308 |
-
}
|
309 |
-
$message = rtrim($message, ';');
|
310 |
-
}
|
311 |
-
$error = "Failed to start the resumable upload (HTTP {$message})";
|
312 |
-
$this->client->getLogger()->error($error);
|
313 |
-
throw new Google_Exception($error);
|
314 |
-
}
|
315 |
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
*
|
21 |
+
* @author Chirag Shah <chirags@google.com>
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
class Google_Http_MediaFileUpload
|
25 |
+
{
|
26 |
+
|
27 |
+
const UPLOAD_MEDIA_TYPE = 'media';
|
28 |
+
|
29 |
+
const UPLOAD_MULTIPART_TYPE = 'multipart';
|
30 |
+
|
31 |
+
const UPLOAD_RESUMABLE_TYPE = 'resumable';
|
32 |
+
|
33 |
+
/**
|
34 |
+
*
|
35 |
+
* @var string $mimeType
|
36 |
+
*/
|
37 |
+
private $mimeType;
|
38 |
+
|
39 |
+
/**
|
40 |
+
*
|
41 |
+
* @var string $data
|
42 |
+
*/
|
43 |
+
private $data;
|
44 |
+
|
45 |
+
/**
|
46 |
+
*
|
47 |
+
* @var bool $resumable
|
48 |
+
*/
|
49 |
+
private $resumable;
|
50 |
+
|
51 |
+
/**
|
52 |
+
*
|
53 |
+
* @var int $chunkSize
|
54 |
+
*/
|
55 |
+
private $chunkSize;
|
56 |
+
|
57 |
+
/**
|
58 |
+
*
|
59 |
+
* @var int $size
|
60 |
+
*/
|
61 |
+
private $size;
|
62 |
+
|
63 |
+
/**
|
64 |
+
*
|
65 |
+
* @var string $resumeUri
|
66 |
+
*/
|
67 |
+
private $resumeUri;
|
68 |
+
|
69 |
+
/**
|
70 |
+
*
|
71 |
+
* @var int $progress
|
72 |
+
*/
|
73 |
+
private $progress;
|
74 |
+
|
75 |
+
/**
|
76 |
+
*
|
77 |
+
* @var Google_Client
|
78 |
+
*/
|
79 |
+
private $client;
|
80 |
+
|
81 |
+
/**
|
82 |
+
*
|
83 |
+
* @var Google_Http_Request
|
84 |
+
*/
|
85 |
+
private $request;
|
86 |
+
|
87 |
+
/**
|
88 |
+
*
|
89 |
+
* @var string
|
90 |
+
*/
|
91 |
+
private $boundary;
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Result code from last HTTP call
|
95 |
+
*
|
96 |
+
* @var int
|
97 |
+
*/
|
98 |
+
private $httpResultCode;
|
99 |
+
|
100 |
+
/**
|
101 |
+
*
|
102 |
+
* @param $mimeType string
|
103 |
+
* @param $data string
|
104 |
+
* The bytes you want to upload.
|
105 |
+
* @param $resumable bool
|
106 |
+
* @param bool $chunkSize
|
107 |
+
* File will be uploaded in chunks of this many bytes.
|
108 |
+
* only used if resumable=True
|
109 |
+
*/
|
110 |
+
public function __construct(Google_Client $client, Google_Http_Request $request, $mimeType, $data, $resumable = false, $chunkSize = false, $boundary = false)
|
111 |
+
{
|
112 |
+
$this->client = $client;
|
113 |
+
$this->request = $request;
|
114 |
+
$this->mimeType = $mimeType;
|
115 |
+
$this->data = $data;
|
116 |
+
$this->size = strlen($this->data);
|
117 |
+
$this->resumable = $resumable;
|
118 |
+
if (! $chunkSize) {
|
119 |
+
$chunkSize = 256 * 1024;
|
120 |
+
}
|
121 |
+
$this->chunkSize = $chunkSize;
|
122 |
+
$this->progress = 0;
|
123 |
+
$this->boundary = $boundary;
|
124 |
+
// Process Media Request
|
125 |
+
$this->process();
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Set the size of the file that is being uploaded.
|
130 |
+
*
|
131 |
+
* @param $size -
|
132 |
+
* int file size in bytes
|
133 |
+
*/
|
134 |
+
public function setFileSize($size)
|
135 |
+
{
|
136 |
+
$this->size = $size;
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Return the progress on the upload
|
141 |
+
*
|
142 |
+
* @return int progress in bytes uploaded.
|
143 |
+
*/
|
144 |
+
public function getProgress()
|
145 |
+
{
|
146 |
+
return $this->progress;
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Return the HTTP result code from the last call made.
|
151 |
+
*
|
152 |
+
* @return int code
|
153 |
+
*/
|
154 |
+
public function getHttpResultCode()
|
155 |
+
{
|
156 |
+
return $this->httpResultCode;
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Send the next part of the file to upload.
|
161 |
+
*
|
162 |
+
* @param
|
163 |
+
* [$chunk] the next set of bytes to send. If false will used $data passed
|
164 |
+
* at construct time.
|
165 |
+
*/
|
166 |
+
public function nextChunk($chunk = false)
|
167 |
+
{
|
168 |
+
if (false == $this->resumeUri) {
|
169 |
+
$this->resumeUri = $this->getResumeUri();
|
170 |
+
}
|
171 |
+
if (false == $chunk) {
|
172 |
+
$chunk = substr($this->data, $this->progress, $this->chunkSize);
|
173 |
+
}
|
174 |
+
$lastBytePos = $this->progress + strlen($chunk) - 1;
|
175 |
+
$headers = array(
|
176 |
+
'content-range' => "bytes $this->progress-$lastBytePos/$this->size",
|
177 |
+
'content-type' => $this->request->getRequestHeader('content-type'),
|
178 |
+
'content-length' => $this->chunkSize,
|
179 |
+
'expect' => ''
|
180 |
+
);
|
181 |
+
$httpRequest = new Google_Http_Request($this->resumeUri, 'PUT', $headers, $chunk);
|
182 |
+
if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) {
|
183 |
+
$httpRequest->enableGzip();
|
184 |
+
} else {
|
185 |
+
$httpRequest->disableGzip();
|
186 |
+
}
|
187 |
+
$response = $this->client->getIo()->makeRequest($httpRequest);
|
188 |
+
$response->setExpectedClass($this->request->getExpectedClass());
|
189 |
+
$code = $response->getResponseHttpCode();
|
190 |
+
$this->httpResultCode = $code;
|
191 |
+
if (308 == $code) {
|
192 |
+
// Track the amount uploaded.
|
193 |
+
$range = explode('-', $response->getResponseHeader('range'));
|
194 |
+
$this->progress = $range[1] + 1;
|
195 |
+
// Allow for changing upload URLs.
|
196 |
+
$location = $response->getResponseHeader('location');
|
197 |
+
if ($location) {
|
198 |
+
$this->resumeUri = $location;
|
199 |
+
}
|
200 |
+
// No problems, but upload not complete.
|
201 |
+
return false;
|
202 |
+
} else {
|
203 |
+
return Google_Http_REST::decodeHttpResponse($response, $this->client);
|
204 |
+
}
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
*
|
209 |
+
* @param
|
210 |
+
* $meta
|
211 |
+
* @param
|
212 |
+
* $params
|
213 |
+
* @return array|bool @visible for testing
|
214 |
+
*/
|
215 |
+
private function process()
|
216 |
+
{
|
217 |
+
$postBody = false;
|
218 |
+
$contentType = false;
|
219 |
+
$meta = $this->request->getPostBody();
|
220 |
+
$meta = is_string($meta) ? json_decode($meta, true) : $meta;
|
221 |
+
$uploadType = $this->getUploadType($meta);
|
222 |
+
$this->request->setQueryParam('uploadType', $uploadType);
|
223 |
+
$this->transformToUploadUrl();
|
224 |
+
$mimeType = $this->mimeType ? $this->mimeType : $this->request->getRequestHeader('content-type');
|
225 |
+
if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) {
|
226 |
+
$contentType = $mimeType;
|
227 |
+
$postBody = is_string($meta) ? $meta : json_encode($meta);
|
228 |
+
} else
|
229 |
+
if (self::UPLOAD_MEDIA_TYPE == $uploadType) {
|
230 |
+
$contentType = $mimeType;
|
231 |
+
$postBody = $this->data;
|
232 |
+
} else
|
233 |
+
if (self::UPLOAD_MULTIPART_TYPE == $uploadType) {
|
234 |
+
// This is a multipart/related upload.
|
235 |
+
$boundary = $this->boundary ? $this->boundary : mt_rand();
|
236 |
+
$boundary = str_replace('"', '', $boundary);
|
237 |
+
$contentType = 'multipart/related; boundary=' . $boundary;
|
238 |
+
$related = "--$boundary\r\n";
|
239 |
+
$related .= "Content-Type: application/json; charset=UTF-8\r\n";
|
240 |
+
$related .= "\r\n" . json_encode($meta) . "\r\n";
|
241 |
+
$related .= "--$boundary\r\n";
|
242 |
+
$related .= "Content-Type: $mimeType\r\n";
|
243 |
+
$related .= "Content-Transfer-Encoding: base64\r\n";
|
244 |
+
$related .= "\r\n" . base64_encode($this->data) . "\r\n";
|
245 |
+
$related .= "--$boundary--";
|
246 |
+
$postBody = $related;
|
247 |
+
}
|
248 |
+
$this->request->setPostBody($postBody);
|
249 |
+
if (isset($contentType) && $contentType) {
|
250 |
+
$contentTypeHeader['content-type'] = $contentType;
|
251 |
+
$this->request->setRequestHeaders($contentTypeHeader);
|
252 |
+
}
|
253 |
+
}
|
254 |
+
|
255 |
+
private function transformToUploadUrl()
|
256 |
+
{
|
257 |
+
$base = $this->request->getBaseComponent();
|
258 |
+
$this->request->setBaseComponent($base . '/upload');
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Valid upload types:
|
263 |
+
* - resumable (UPLOAD_RESUMABLE_TYPE)
|
264 |
+
* - media (UPLOAD_MEDIA_TYPE)
|
265 |
+
* - multipart (UPLOAD_MULTIPART_TYPE)
|
266 |
+
*
|
267 |
+
* @param
|
268 |
+
* $meta
|
269 |
+
* @return string @visible for testing
|
270 |
+
*/
|
271 |
+
public function getUploadType($meta)
|
272 |
+
{
|
273 |
+
if ($this->resumable) {
|
274 |
+
return self::UPLOAD_RESUMABLE_TYPE;
|
275 |
+
}
|
276 |
+
if (false == $meta && $this->data) {
|
277 |
+
return self::UPLOAD_MEDIA_TYPE;
|
278 |
+
}
|
279 |
+
return self::UPLOAD_MULTIPART_TYPE;
|
280 |
+
}
|
281 |
+
|
282 |
+
private function getResumeUri()
|
283 |
+
{
|
284 |
+
$result = null;
|
285 |
+
$body = $this->request->getPostBody();
|
286 |
+
if ($body) {
|
287 |
+
$headers = array(
|
288 |
+
'content-type' => 'application/json; charset=UTF-8',
|
289 |
+
'content-length' => Google_Utils::getStrLen($body),
|
290 |
+
'x-upload-content-type' => $this->mimeType,
|
291 |
+
'x-upload-content-length' => $this->size,
|
292 |
+
'expect' => ''
|
293 |
+
);
|
294 |
+
$this->request->setRequestHeaders($headers);
|
295 |
+
}
|
296 |
+
$response = $this->client->getIo()->makeRequest($this->request);
|
297 |
+
$location = $response->getResponseHeader('location');
|
298 |
+
$code = $response->getResponseHttpCode();
|
299 |
+
if (200 == $code && true == $location) {
|
300 |
+
return $location;
|
301 |
+
}
|
302 |
+
$message = $code;
|
303 |
+
$body = @json_decode($response->getResponseBody());
|
304 |
+
if (! empty($body->error->errors)) {
|
305 |
+
$message .= ': ';
|
306 |
+
foreach ($body->error->errors as $error) {
|
307 |
+
$message .= "{$error->domain}, {$error->message};";
|
308 |
+
}
|
309 |
+
$message = rtrim($message, ';');
|
310 |
+
}
|
311 |
+
$error = "Failed to start the resumable upload (HTTP {$message})";
|
312 |
+
$this->client->getLogger()->error($error);
|
313 |
+
throw new Google_Exception($error);
|
314 |
+
}
|
315 |
}
|
tools/src/Google/Http/REST.php
CHANGED
@@ -1,143 +1,143 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* This class implements the RESTful transport of apiServiceRequest()'s
|
21 |
-
*
|
22 |
-
* @author Chris Chabot <chabotc@google.com>
|
23 |
-
* @author Chirag Shah <chirags@google.com>
|
24 |
-
*/
|
25 |
-
class Google_Http_REST
|
26 |
-
{
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Executes a Google_Http_Request
|
30 |
-
*
|
31 |
-
* @param Google_Client $client
|
32 |
-
* @param Google_Http_Request $req
|
33 |
-
* @return array decoded result
|
34 |
-
* @throws Google_Service_Exception on server side error (ie: not authenticated,
|
35 |
-
* invalid or malformed post body, invalid url)
|
36 |
-
*/
|
37 |
-
public static function execute(Google_Client $client, Google_Http_Request $req)
|
38 |
-
{
|
39 |
-
$httpRequest = $client->getIo()->makeRequest($req);
|
40 |
-
$httpRequest->setExpectedClass($req->getExpectedClass());
|
41 |
-
return self::decodeHttpResponse($httpRequest, $client);
|
42 |
-
}
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Decode an HTTP Response.
|
46 |
-
*
|
47 |
-
* @static
|
48 |
-
*
|
49 |
-
* @throws Google_Service_Exception
|
50 |
-
* @param Google_Http_Request $response
|
51 |
-
* The http response to be decoded.
|
52 |
-
* @param Google_Client $client
|
53 |
-
* @return mixed|null
|
54 |
-
*/
|
55 |
-
public static function decodeHttpResponse($response, Google_Client $client = null)
|
56 |
-
{
|
57 |
-
$code = $response->getResponseHttpCode();
|
58 |
-
$body = $response->getResponseBody();
|
59 |
-
$decoded = null;
|
60 |
-
if ((intVal($code)) >= 300) {
|
61 |
-
$decoded = json_decode($body, true);
|
62 |
-
$err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl();
|
63 |
-
if (isset($decoded['error']) && isset($decoded['error']['message']) && isset($decoded['error']['code'])) {
|
64 |
-
// if we're getting a json encoded error definition, use that instead of the raw response
|
65 |
-
// body for improved readability
|
66 |
-
$err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}";
|
67 |
-
} else {
|
68 |
-
$err .= ": ($code) $body";
|
69 |
-
}
|
70 |
-
$errors = null;
|
71 |
-
// Specific check for APIs which don't return error details, such as Blogger.
|
72 |
-
if (isset($decoded['error']) && isset($decoded['error']['errors'])) {
|
73 |
-
$errors = $decoded['error']['errors'];
|
74 |
-
}
|
75 |
-
if ($client) {
|
76 |
-
$client->getLogger()->error($err, array(
|
77 |
-
'code' => $code,
|
78 |
-
'errors' => $errors
|
79 |
-
));
|
80 |
-
}
|
81 |
-
throw new Google_Service_Exception($err, $code, null, $errors);
|
82 |
-
}
|
83 |
-
// Only attempt to decode the response, if the response code wasn't (204) 'no content'
|
84 |
-
if ($code != '204') {
|
85 |
-
$decoded = json_decode($body, true);
|
86 |
-
if ($decoded === null || $decoded === "") {
|
87 |
-
$error = "Invalid json in service response: $body";
|
88 |
-
if ($client) {
|
89 |
-
$client->getLogger()->error($error);
|
90 |
-
}
|
91 |
-
throw new Google_Service_Exception($error);
|
92 |
-
}
|
93 |
-
if ($response->getExpectedClass()) {
|
94 |
-
$class = $response->getExpectedClass();
|
95 |
-
$decoded = new $class($decoded);
|
96 |
-
}
|
97 |
-
}
|
98 |
-
return $decoded;
|
99 |
-
}
|
100 |
-
|
101 |
-
/**
|
102 |
-
* Parse/expand request parameters and create a fully qualified
|
103 |
-
* request uri.
|
104 |
-
*
|
105 |
-
* @static
|
106 |
-
*
|
107 |
-
* @param string $servicePath
|
108 |
-
* @param string $restPath
|
109 |
-
* @param array $params
|
110 |
-
* @return string $requestUrl
|
111 |
-
*/
|
112 |
-
public static function createRequestUri($servicePath, $restPath, $params)
|
113 |
-
{
|
114 |
-
$requestUrl = $servicePath . $restPath;
|
115 |
-
$uriTemplateVars = array();
|
116 |
-
$queryVars = array();
|
117 |
-
foreach ($params as $paramName => $paramSpec) {
|
118 |
-
if ($paramSpec['type'] == 'boolean') {
|
119 |
-
$paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false';
|
120 |
-
}
|
121 |
-
if ($paramSpec['location'] == 'path') {
|
122 |
-
$uriTemplateVars[$paramName] = $paramSpec['value'];
|
123 |
-
} else
|
124 |
-
if ($paramSpec['location'] == 'query') {
|
125 |
-
if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) {
|
126 |
-
foreach ($paramSpec['value'] as $value) {
|
127 |
-
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value));
|
128 |
-
}
|
129 |
-
} else {
|
130 |
-
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value']));
|
131 |
-
}
|
132 |
-
}
|
133 |
-
}
|
134 |
-
if (count($uriTemplateVars)) {
|
135 |
-
$uriTemplateParser = new Google_Utils_URITemplate();
|
136 |
-
$requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars);
|
137 |
-
}
|
138 |
-
if (count($queryVars)) {
|
139 |
-
$requestUrl .= '?' . implode($queryVars, '&');
|
140 |
-
}
|
141 |
-
return $requestUrl;
|
142 |
-
}
|
143 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* This class implements the RESTful transport of apiServiceRequest()'s
|
21 |
+
*
|
22 |
+
* @author Chris Chabot <chabotc@google.com>
|
23 |
+
* @author Chirag Shah <chirags@google.com>
|
24 |
+
*/
|
25 |
+
class Google_Http_REST
|
26 |
+
{
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Executes a Google_Http_Request
|
30 |
+
*
|
31 |
+
* @param Google_Client $client
|
32 |
+
* @param Google_Http_Request $req
|
33 |
+
* @return array decoded result
|
34 |
+
* @throws Google_Service_Exception on server side error (ie: not authenticated,
|
35 |
+
* invalid or malformed post body, invalid url)
|
36 |
+
*/
|
37 |
+
public static function execute(Google_Client $client, Google_Http_Request $req)
|
38 |
+
{
|
39 |
+
$httpRequest = $client->getIo()->makeRequest($req);
|
40 |
+
$httpRequest->setExpectedClass($req->getExpectedClass());
|
41 |
+
return self::decodeHttpResponse($httpRequest, $client);
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Decode an HTTP Response.
|
46 |
+
*
|
47 |
+
* @static
|
48 |
+
*
|
49 |
+
* @throws Google_Service_Exception
|
50 |
+
* @param Google_Http_Request $response
|
51 |
+
* The http response to be decoded.
|
52 |
+
* @param Google_Client $client
|
53 |
+
* @return mixed|null
|
54 |
+
*/
|
55 |
+
public static function decodeHttpResponse($response, Google_Client $client = null)
|
56 |
+
{
|
57 |
+
$code = $response->getResponseHttpCode();
|
58 |
+
$body = $response->getResponseBody();
|
59 |
+
$decoded = null;
|
60 |
+
if ((intVal($code)) >= 300) {
|
61 |
+
$decoded = json_decode($body, true);
|
62 |
+
$err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl();
|
63 |
+
if (isset($decoded['error']) && isset($decoded['error']['message']) && isset($decoded['error']['code'])) {
|
64 |
+
// if we're getting a json encoded error definition, use that instead of the raw response
|
65 |
+
// body for improved readability
|
66 |
+
$err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}";
|
67 |
+
} else {
|
68 |
+
$err .= ": ($code) $body";
|
69 |
+
}
|
70 |
+
$errors = null;
|
71 |
+
// Specific check for APIs which don't return error details, such as Blogger.
|
72 |
+
if (isset($decoded['error']) && isset($decoded['error']['errors'])) {
|
73 |
+
$errors = $decoded['error']['errors'];
|
74 |
+
}
|
75 |
+
if ($client) {
|
76 |
+
$client->getLogger()->error($err, array(
|
77 |
+
'code' => $code,
|
78 |
+
'errors' => $errors
|
79 |
+
));
|
80 |
+
}
|
81 |
+
throw new Google_Service_Exception($err, $code, null, $errors);
|
82 |
+
}
|
83 |
+
// Only attempt to decode the response, if the response code wasn't (204) 'no content'
|
84 |
+
if ($code != '204') {
|
85 |
+
$decoded = json_decode($body, true);
|
86 |
+
if ($decoded === null || $decoded === "") {
|
87 |
+
$error = "Invalid json in service response: $body";
|
88 |
+
if ($client) {
|
89 |
+
$client->getLogger()->error($error);
|
90 |
+
}
|
91 |
+
throw new Google_Service_Exception($error);
|
92 |
+
}
|
93 |
+
if ($response->getExpectedClass()) {
|
94 |
+
$class = $response->getExpectedClass();
|
95 |
+
$decoded = new $class($decoded);
|
96 |
+
}
|
97 |
+
}
|
98 |
+
return $decoded;
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Parse/expand request parameters and create a fully qualified
|
103 |
+
* request uri.
|
104 |
+
*
|
105 |
+
* @static
|
106 |
+
*
|
107 |
+
* @param string $servicePath
|
108 |
+
* @param string $restPath
|
109 |
+
* @param array $params
|
110 |
+
* @return string $requestUrl
|
111 |
+
*/
|
112 |
+
public static function createRequestUri($servicePath, $restPath, $params)
|
113 |
+
{
|
114 |
+
$requestUrl = $servicePath . $restPath;
|
115 |
+
$uriTemplateVars = array();
|
116 |
+
$queryVars = array();
|
117 |
+
foreach ($params as $paramName => $paramSpec) {
|
118 |
+
if ($paramSpec['type'] == 'boolean') {
|
119 |
+
$paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false';
|
120 |
+
}
|
121 |
+
if ($paramSpec['location'] == 'path') {
|
122 |
+
$uriTemplateVars[$paramName] = $paramSpec['value'];
|
123 |
+
} else
|
124 |
+
if ($paramSpec['location'] == 'query') {
|
125 |
+
if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) {
|
126 |
+
foreach ($paramSpec['value'] as $value) {
|
127 |
+
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value));
|
128 |
+
}
|
129 |
+
} else {
|
130 |
+
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value']));
|
131 |
+
}
|
132 |
+
}
|
133 |
+
}
|
134 |
+
if (count($uriTemplateVars)) {
|
135 |
+
$uriTemplateParser = new Google_Utils_URITemplate();
|
136 |
+
$requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars);
|
137 |
+
}
|
138 |
+
if (count($queryVars)) {
|
139 |
+
$requestUrl .= '?' . implode($queryVars, '&');
|
140 |
+
}
|
141 |
+
return $requestUrl;
|
142 |
+
}
|
143 |
}
|
tools/src/Google/Http/Request.php
CHANGED
@@ -1,498 +1,498 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* HTTP Request to be executed by IO classes.
|
21 |
-
* Upon execution, the
|
22 |
-
* responseHttpCode, responseHeaders and responseBody will be filled in.
|
23 |
-
*
|
24 |
-
* @author Chris Chabot <chabotc@google.com>
|
25 |
-
* @author Chirag Shah <chirags@google.com>
|
26 |
-
*
|
27 |
-
*/
|
28 |
-
class Google_Http_Request
|
29 |
-
{
|
30 |
-
|
31 |
-
const GZIP_UA = " (gzip)";
|
32 |
-
|
33 |
-
private $batchHeaders = array(
|
34 |
-
'Content-Type' => 'application/http',
|
35 |
-
'Content-Transfer-Encoding' => 'binary',
|
36 |
-
'MIME-Version' => '1.0'
|
37 |
-
);
|
38 |
-
|
39 |
-
protected $queryParams;
|
40 |
-
|
41 |
-
protected $requestMethod;
|
42 |
-
|
43 |
-
protected $requestHeaders;
|
44 |
-
|
45 |
-
protected $baseComponent = null;
|
46 |
-
|
47 |
-
protected $path;
|
48 |
-
|
49 |
-
protected $postBody;
|
50 |
-
|
51 |
-
protected $userAgent;
|
52 |
-
|
53 |
-
protected $canGzip = null;
|
54 |
-
|
55 |
-
protected $responseHttpCode;
|
56 |
-
|
57 |
-
protected $responseHeaders;
|
58 |
-
|
59 |
-
protected $responseBody;
|
60 |
-
|
61 |
-
protected $expectedClass;
|
62 |
-
|
63 |
-
public $accessKey;
|
64 |
-
|
65 |
-
public function __construct($url, $method = 'GET', $headers = array(), $postBody = null)
|
66 |
-
{
|
67 |
-
$this->setUrl($url);
|
68 |
-
$this->setRequestMethod($method);
|
69 |
-
$this->setRequestHeaders($headers);
|
70 |
-
$this->setPostBody($postBody);
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Misc function that returns the base url component of the $url
|
75 |
-
* used by the OAuth signing class to calculate the base string
|
76 |
-
*
|
77 |
-
* @return string The base url component of the $url.
|
78 |
-
*/
|
79 |
-
public function getBaseComponent()
|
80 |
-
{
|
81 |
-
return $this->baseComponent;
|
82 |
-
}
|
83 |
-
|
84 |
-
/**
|
85 |
-
* Set the base URL that path and query parameters will be added to.
|
86 |
-
*
|
87 |
-
* @param $baseComponent string
|
88 |
-
*/
|
89 |
-
public function setBaseComponent($baseComponent)
|
90 |
-
{
|
91 |
-
$this->baseComponent = $baseComponent;
|
92 |
-
}
|
93 |
-
|
94 |
-
/**
|
95 |
-
* Enable support for gzipped responses with this request.
|
96 |
-
*/
|
97 |
-
public function enableGzip()
|
98 |
-
{
|
99 |
-
$this->setRequestHeaders(array(
|
100 |
-
"Accept-Encoding" => "gzip"
|
101 |
-
));
|
102 |
-
$this->canGzip = true;
|
103 |
-
$this->setUserAgent($this->userAgent);
|
104 |
-
}
|
105 |
-
|
106 |
-
/**
|
107 |
-
* Disable support for gzip responses with this request.
|
108 |
-
*/
|
109 |
-
public function disableGzip()
|
110 |
-
{
|
111 |
-
if (isset($this->requestHeaders['accept-encoding']) && $this->requestHeaders['accept-encoding'] == "gzip") {
|
112 |
-
unset($this->requestHeaders['accept-encoding']);
|
113 |
-
}
|
114 |
-
$this->canGzip = false;
|
115 |
-
$this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent);
|
116 |
-
}
|
117 |
-
|
118 |
-
/**
|
119 |
-
* Can this request accept a gzip response?
|
120 |
-
*
|
121 |
-
* @return bool
|
122 |
-
*/
|
123 |
-
public function canGzip()
|
124 |
-
{
|
125 |
-
return $this->canGzip;
|
126 |
-
}
|
127 |
-
|
128 |
-
/**
|
129 |
-
* Misc function that returns an array of the query parameters of the current
|
130 |
-
* url used by the OAuth signing class to calculate the signature
|
131 |
-
*
|
132 |
-
* @return array Query parameters in the query string.
|
133 |
-
*/
|
134 |
-
public function getQueryParams()
|
135 |
-
{
|
136 |
-
return $this->queryParams;
|
137 |
-
}
|
138 |
-
|
139 |
-
/**
|
140 |
-
* Set a new query parameter.
|
141 |
-
*
|
142 |
-
* @param $key -
|
143 |
-
* string to set, does not need to be URL encoded
|
144 |
-
* @param $value -
|
145 |
-
* string to set, does not need to be URL encoded
|
146 |
-
*/
|
147 |
-
public function setQueryParam($key, $value)
|
148 |
-
{
|
149 |
-
$this->queryParams[$key] = $value;
|
150 |
-
}
|
151 |
-
|
152 |
-
/**
|
153 |
-
*
|
154 |
-
* @return string HTTP Response Code.
|
155 |
-
*/
|
156 |
-
public function getResponseHttpCode()
|
157 |
-
{
|
158 |
-
return (int) $this->responseHttpCode;
|
159 |
-
}
|
160 |
-
|
161 |
-
/**
|
162 |
-
*
|
163 |
-
* @param int $responseHttpCode
|
164 |
-
* HTTP Response Code.
|
165 |
-
*/
|
166 |
-
public function setResponseHttpCode($responseHttpCode)
|
167 |
-
{
|
168 |
-
$this->responseHttpCode = $responseHttpCode;
|
169 |
-
}
|
170 |
-
|
171 |
-
/**
|
172 |
-
*
|
173 |
-
* @return $responseHeaders (array) HTTP Response Headers.
|
174 |
-
*/
|
175 |
-
public function getResponseHeaders()
|
176 |
-
{
|
177 |
-
return $this->responseHeaders;
|
178 |
-
}
|
179 |
-
|
180 |
-
/**
|
181 |
-
*
|
182 |
-
* @return string HTTP Response Body
|
183 |
-
*/
|
184 |
-
public function getResponseBody()
|
185 |
-
{
|
186 |
-
return $this->responseBody;
|
187 |
-
}
|
188 |
-
|
189 |
-
/**
|
190 |
-
* Set the class the response to this request should expect.
|
191 |
-
*
|
192 |
-
* @param $class string
|
193 |
-
* the class name
|
194 |
-
*/
|
195 |
-
public function setExpectedClass($class)
|
196 |
-
{
|
197 |
-
$this->expectedClass = $class;
|
198 |
-
}
|
199 |
-
|
200 |
-
/**
|
201 |
-
* Retrieve the expected class the response should expect.
|
202 |
-
*
|
203 |
-
* @return string class name
|
204 |
-
*/
|
205 |
-
public function getExpectedClass()
|
206 |
-
{
|
207 |
-
return $this->expectedClass;
|
208 |
-
}
|
209 |
-
|
210 |
-
/**
|
211 |
-
*
|
212 |
-
* @param array $headers
|
213 |
-
* The HTTP response headers
|
214 |
-
* to be normalized.
|
215 |
-
*/
|
216 |
-
public function setResponseHeaders($headers)
|
217 |
-
{
|
218 |
-
$headers = Google_Utils::normalize($headers);
|
219 |
-
if ($this->responseHeaders) {
|
220 |
-
$headers = array_merge($this->responseHeaders, $headers);
|
221 |
-
}
|
222 |
-
$this->responseHeaders = $headers;
|
223 |
-
}
|
224 |
-
|
225 |
-
/**
|
226 |
-
*
|
227 |
-
* @param string $key
|
228 |
-
* @return array|boolean Returns the requested HTTP header or
|
229 |
-
* false if unavailable.
|
230 |
-
*/
|
231 |
-
public function getResponseHeader($key)
|
232 |
-
{
|
233 |
-
return isset($this->responseHeaders[$key]) ? $this->responseHeaders[$key] : false;
|
234 |
-
}
|
235 |
-
|
236 |
-
/**
|
237 |
-
*
|
238 |
-
* @param string $responseBody
|
239 |
-
* The HTTP response body.
|
240 |
-
*/
|
241 |
-
public function setResponseBody($responseBody)
|
242 |
-
{
|
243 |
-
$this->responseBody = $responseBody;
|
244 |
-
}
|
245 |
-
|
246 |
-
/**
|
247 |
-
*
|
248 |
-
* @return string $url The request URL.
|
249 |
-
*/
|
250 |
-
public function getUrl()
|
251 |
-
{
|
252 |
-
return $this->baseComponent . $this->path . (count($this->queryParams) ? "?" . $this->buildQuery($this->queryParams) : '');
|
253 |
-
}
|
254 |
-
|
255 |
-
/**
|
256 |
-
*
|
257 |
-
* @return string $method HTTP Request Method.
|
258 |
-
*/
|
259 |
-
public function getRequestMethod()
|
260 |
-
{
|
261 |
-
return $this->requestMethod;
|
262 |
-
}
|
263 |
-
|
264 |
-
/**
|
265 |
-
*
|
266 |
-
* @return array $headers HTTP Request Headers.
|
267 |
-
*/
|
268 |
-
public function getRequestHeaders()
|
269 |
-
{
|
270 |
-
return $this->requestHeaders;
|
271 |
-
}
|
272 |
-
|
273 |
-
/**
|
274 |
-
*
|
275 |
-
* @param string $key
|
276 |
-
* @return array|boolean Returns the requested HTTP header or
|
277 |
-
* false if unavailable.
|
278 |
-
*/
|
279 |
-
public function getRequestHeader($key)
|
280 |
-
{
|
281 |
-
return isset($this->requestHeaders[$key]) ? $this->requestHeaders[$key] : false;
|
282 |
-
}
|
283 |
-
|
284 |
-
/**
|
285 |
-
*
|
286 |
-
* @return string $postBody HTTP Request Body.
|
287 |
-
*/
|
288 |
-
public function getPostBody()
|
289 |
-
{
|
290 |
-
return $this->postBody;
|
291 |
-
}
|
292 |
-
|
293 |
-
/**
|
294 |
-
*
|
295 |
-
* @param string $url
|
296 |
-
* the url to set
|
297 |
-
*/
|
298 |
-
public function setUrl($url)
|
299 |
-
{
|
300 |
-
if (substr($url, 0, 4) != 'http') {
|
301 |
-
// Force the path become relative.
|
302 |
-
if (substr($url, 0, 1) !== '/') {
|
303 |
-
$url = '/' . $url;
|
304 |
-
}
|
305 |
-
}
|
306 |
-
$parts = parse_url($url);
|
307 |
-
if (isset($parts['host'])) {
|
308 |
-
$this->baseComponent = sprintf("%s%s%s", isset($parts['scheme']) ? $parts['scheme'] . "://" : '', isset($parts['host']) ? $parts['host'] : '', isset($parts['port']) ? ":" . $parts['port'] : '');
|
309 |
-
}
|
310 |
-
$this->path = isset($parts['path']) ? $parts['path'] : '';
|
311 |
-
$this->queryParams = array();
|
312 |
-
if (isset($parts['query'])) {
|
313 |
-
$this->queryParams = $this->parseQuery($parts['query']);
|
314 |
-
}
|
315 |
-
}
|
316 |
-
|
317 |
-
/**
|
318 |
-
*
|
319 |
-
* @param string $method
|
320 |
-
* Set he HTTP Method and normalize
|
321 |
-
* it to upper-case, as required by HTTP.
|
322 |
-
*
|
323 |
-
*/
|
324 |
-
public function setRequestMethod($method)
|
325 |
-
{
|
326 |
-
$this->requestMethod = strtoupper($method);
|
327 |
-
}
|
328 |
-
|
329 |
-
/**
|
330 |
-
*
|
331 |
-
* @param array $headers
|
332 |
-
* The HTTP request headers
|
333 |
-
* to be set and normalized.
|
334 |
-
*/
|
335 |
-
public function setRequestHeaders($headers)
|
336 |
-
{
|
337 |
-
$headers = Google_Utils::normalize($headers);
|
338 |
-
if ($this->requestHeaders) {
|
339 |
-
$headers = array_merge($this->requestHeaders, $headers);
|
340 |
-
}
|
341 |
-
$this->requestHeaders = $headers;
|
342 |
-
}
|
343 |
-
|
344 |
-
/**
|
345 |
-
*
|
346 |
-
* @param string $postBody
|
347 |
-
* the postBody to set
|
348 |
-
*/
|
349 |
-
public function setPostBody($postBody)
|
350 |
-
{
|
351 |
-
$this->postBody = $postBody;
|
352 |
-
}
|
353 |
-
|
354 |
-
/**
|
355 |
-
* Set the User-Agent Header.
|
356 |
-
*
|
357 |
-
* @param string $userAgent
|
358 |
-
* The User-Agent.
|
359 |
-
*/
|
360 |
-
public function setUserAgent($userAgent)
|
361 |
-
{
|
362 |
-
$this->userAgent = $userAgent;
|
363 |
-
if ($this->canGzip) {
|
364 |
-
$this->userAgent = $userAgent . self::GZIP_UA;
|
365 |
-
}
|
366 |
-
}
|
367 |
-
|
368 |
-
/**
|
369 |
-
*
|
370 |
-
* @return string The User-Agent.
|
371 |
-
*/
|
372 |
-
public function getUserAgent()
|
373 |
-
{
|
374 |
-
return $this->userAgent;
|
375 |
-
}
|
376 |
-
|
377 |
-
/**
|
378 |
-
* Returns a cache key depending on if this was an OAuth signed request
|
379 |
-
* in which case it will use the non-signed url and access key to make this
|
380 |
-
* cache key unique per authenticated user, else use the plain request url
|
381 |
-
*
|
382 |
-
* @return string The md5 hash of the request cache key.
|
383 |
-
*/
|
384 |
-
public function getCacheKey()
|
385 |
-
{
|
386 |
-
$key = $this->getUrl();
|
387 |
-
if (isset($this->accessKey)) {
|
388 |
-
$key .= $this->accessKey;
|
389 |
-
}
|
390 |
-
if (isset($this->requestHeaders['authorization'])) {
|
391 |
-
$key .= $this->requestHeaders['authorization'];
|
392 |
-
}
|
393 |
-
return md5($key);
|
394 |
-
}
|
395 |
-
|
396 |
-
public function getParsedCacheControl()
|
397 |
-
{
|
398 |
-
$parsed = array();
|
399 |
-
$rawCacheControl = $this->getResponseHeader('cache-control');
|
400 |
-
if ($rawCacheControl) {
|
401 |
-
$rawCacheControl = str_replace(', ', '&', $rawCacheControl);
|
402 |
-
parse_str($rawCacheControl, $parsed);
|
403 |
-
}
|
404 |
-
return $parsed;
|
405 |
-
}
|
406 |
-
|
407 |
-
/**
|
408 |
-
*
|
409 |
-
* @param string $id
|
410 |
-
* @return string A string representation of the HTTP Request.
|
411 |
-
*/
|
412 |
-
public function toBatchString($id)
|
413 |
-
{
|
414 |
-
$str = '';
|
415 |
-
$path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" . http_build_query($this->queryParams);
|
416 |
-
$str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n";
|
417 |
-
foreach ($this->getRequestHeaders() as $key => $val) {
|
418 |
-
$str .= $key . ': ' . $val . "\n";
|
419 |
-
}
|
420 |
-
if ($this->getPostBody()) {
|
421 |
-
$str .= "\n";
|
422 |
-
$str .= $this->getPostBody();
|
423 |
-
}
|
424 |
-
$headers = '';
|
425 |
-
foreach ($this->batchHeaders as $key => $val) {
|
426 |
-
$headers .= $key . ': ' . $val . "\n";
|
427 |
-
}
|
428 |
-
$headers .= "Content-ID: $id\n";
|
429 |
-
$str = $headers . "\n" . $str;
|
430 |
-
return $str;
|
431 |
-
}
|
432 |
-
|
433 |
-
/**
|
434 |
-
* Our own version of parse_str that allows for multiple variables
|
435 |
-
* with the same name.
|
436 |
-
*
|
437 |
-
* @param $string -
|
438 |
-
* the query string to parse
|
439 |
-
*/
|
440 |
-
private function parseQuery($string)
|
441 |
-
{
|
442 |
-
$return = array();
|
443 |
-
$parts = explode("&", $string);
|
444 |
-
foreach ($parts as $part) {
|
445 |
-
list ($key, $value) = explode('=', $part, 2);
|
446 |
-
$value = urldecode($value);
|
447 |
-
if (isset($return[$key])) {
|
448 |
-
if (! is_array($return[$key])) {
|
449 |
-
$return[$key] = array(
|
450 |
-
$return[$key]
|
451 |
-
);
|
452 |
-
}
|
453 |
-
$return[$key][] = $value;
|
454 |
-
} else {
|
455 |
-
$return[$key] = $value;
|
456 |
-
}
|
457 |
-
}
|
458 |
-
return $return;
|
459 |
-
}
|
460 |
-
|
461 |
-
/**
|
462 |
-
* A version of build query that allows for multiple
|
463 |
-
* duplicate keys.
|
464 |
-
*
|
465 |
-
* @param $parts array
|
466 |
-
* of key value pairs
|
467 |
-
*/
|
468 |
-
private function buildQuery($parts)
|
469 |
-
{
|
470 |
-
$return = array();
|
471 |
-
foreach ($parts as $key => $value) {
|
472 |
-
if (is_array($value)) {
|
473 |
-
foreach ($value as $v) {
|
474 |
-
$return[] = urlencode($key) . "=" . urlencode($v);
|
475 |
-
}
|
476 |
-
} else {
|
477 |
-
$return[] = urlencode($key) . "=" . urlencode($value);
|
478 |
-
}
|
479 |
-
}
|
480 |
-
return implode('&', $return);
|
481 |
-
}
|
482 |
-
|
483 |
-
/**
|
484 |
-
* If we're POSTing and have no body to send, we can send the query
|
485 |
-
* parameters in there, which avoids length issues with longer query
|
486 |
-
* params.
|
487 |
-
*/
|
488 |
-
public function maybeMoveParametersToBody()
|
489 |
-
{
|
490 |
-
if ($this->getRequestMethod() == "POST" && empty($this->postBody)) {
|
491 |
-
$this->setRequestHeaders(array(
|
492 |
-
"content-type" => "application/x-www-form-urlencoded; charset=UTF-8"
|
493 |
-
));
|
494 |
-
$this->setPostBody($this->buildQuery($this->queryParams));
|
495 |
-
$this->queryParams = array();
|
496 |
-
}
|
497 |
-
}
|
498 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* HTTP Request to be executed by IO classes.
|
21 |
+
* Upon execution, the
|
22 |
+
* responseHttpCode, responseHeaders and responseBody will be filled in.
|
23 |
+
*
|
24 |
+
* @author Chris Chabot <chabotc@google.com>
|
25 |
+
* @author Chirag Shah <chirags@google.com>
|
26 |
+
*
|
27 |
+
*/
|
28 |
+
class Google_Http_Request
|
29 |
+
{
|
30 |
+
|
31 |
+
const GZIP_UA = " (gzip)";
|
32 |
+
|
33 |
+
private $batchHeaders = array(
|
34 |
+
'Content-Type' => 'application/http',
|
35 |
+
'Content-Transfer-Encoding' => 'binary',
|
36 |
+
'MIME-Version' => '1.0'
|
37 |
+
);
|
38 |
+
|
39 |
+
protected $queryParams;
|
40 |
+
|
41 |
+
protected $requestMethod;
|
42 |
+
|
43 |
+
protected $requestHeaders;
|
44 |
+
|
45 |
+
protected $baseComponent = null;
|
46 |
+
|
47 |
+
protected $path;
|
48 |
+
|
49 |
+
protected $postBody;
|
50 |
+
|
51 |
+
protected $userAgent;
|
52 |
+
|
53 |
+
protected $canGzip = null;
|
54 |
+
|
55 |
+
protected $responseHttpCode;
|
56 |
+
|
57 |
+
protected $responseHeaders;
|
58 |
+
|
59 |
+
protected $responseBody;
|
60 |
+
|
61 |
+
protected $expectedClass;
|
62 |
+
|
63 |
+
public $accessKey;
|
64 |
+
|
65 |
+
public function __construct($url, $method = 'GET', $headers = array(), $postBody = null)
|
66 |
+
{
|
67 |
+
$this->setUrl($url);
|
68 |
+
$this->setRequestMethod($method);
|
69 |
+
$this->setRequestHeaders($headers);
|
70 |
+
$this->setPostBody($postBody);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Misc function that returns the base url component of the $url
|
75 |
+
* used by the OAuth signing class to calculate the base string
|
76 |
+
*
|
77 |
+
* @return string The base url component of the $url.
|
78 |
+
*/
|
79 |
+
public function getBaseComponent()
|
80 |
+
{
|
81 |
+
return $this->baseComponent;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Set the base URL that path and query parameters will be added to.
|
86 |
+
*
|
87 |
+
* @param $baseComponent string
|
88 |
+
*/
|
89 |
+
public function setBaseComponent($baseComponent)
|
90 |
+
{
|
91 |
+
$this->baseComponent = $baseComponent;
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Enable support for gzipped responses with this request.
|
96 |
+
*/
|
97 |
+
public function enableGzip()
|
98 |
+
{
|
99 |
+
$this->setRequestHeaders(array(
|
100 |
+
"Accept-Encoding" => "gzip"
|
101 |
+
));
|
102 |
+
$this->canGzip = true;
|
103 |
+
$this->setUserAgent($this->userAgent);
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Disable support for gzip responses with this request.
|
108 |
+
*/
|
109 |
+
public function disableGzip()
|
110 |
+
{
|
111 |
+
if (isset($this->requestHeaders['accept-encoding']) && $this->requestHeaders['accept-encoding'] == "gzip") {
|
112 |
+
unset($this->requestHeaders['accept-encoding']);
|
113 |
+
}
|
114 |
+
$this->canGzip = false;
|
115 |
+
$this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent);
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Can this request accept a gzip response?
|
120 |
+
*
|
121 |
+
* @return bool
|
122 |
+
*/
|
123 |
+
public function canGzip()
|
124 |
+
{
|
125 |
+
return $this->canGzip;
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Misc function that returns an array of the query parameters of the current
|
130 |
+
* url used by the OAuth signing class to calculate the signature
|
131 |
+
*
|
132 |
+
* @return array Query parameters in the query string.
|
133 |
+
*/
|
134 |
+
public function getQueryParams()
|
135 |
+
{
|
136 |
+
return $this->queryParams;
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Set a new query parameter.
|
141 |
+
*
|
142 |
+
* @param $key -
|
143 |
+
* string to set, does not need to be URL encoded
|
144 |
+
* @param $value -
|
145 |
+
* string to set, does not need to be URL encoded
|
146 |
+
*/
|
147 |
+
public function setQueryParam($key, $value)
|
148 |
+
{
|
149 |
+
$this->queryParams[$key] = $value;
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
*
|
154 |
+
* @return string HTTP Response Code.
|
155 |
+
*/
|
156 |
+
public function getResponseHttpCode()
|
157 |
+
{
|
158 |
+
return (int) $this->responseHttpCode;
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
*
|
163 |
+
* @param int $responseHttpCode
|
164 |
+
* HTTP Response Code.
|
165 |
+
*/
|
166 |
+
public function setResponseHttpCode($responseHttpCode)
|
167 |
+
{
|
168 |
+
$this->responseHttpCode = $responseHttpCode;
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
*
|
173 |
+
* @return $responseHeaders (array) HTTP Response Headers.
|
174 |
+
*/
|
175 |
+
public function getResponseHeaders()
|
176 |
+
{
|
177 |
+
return $this->responseHeaders;
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
*
|
182 |
+
* @return string HTTP Response Body
|
183 |
+
*/
|
184 |
+
public function getResponseBody()
|
185 |
+
{
|
186 |
+
return $this->responseBody;
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Set the class the response to this request should expect.
|
191 |
+
*
|
192 |
+
* @param $class string
|
193 |
+
* the class name
|
194 |
+
*/
|
195 |
+
public function setExpectedClass($class)
|
196 |
+
{
|
197 |
+
$this->expectedClass = $class;
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Retrieve the expected class the response should expect.
|
202 |
+
*
|
203 |
+
* @return string class name
|
204 |
+
*/
|
205 |
+
public function getExpectedClass()
|
206 |
+
{
|
207 |
+
return $this->expectedClass;
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
*
|
212 |
+
* @param array $headers
|
213 |
+
* The HTTP response headers
|
214 |
+
* to be normalized.
|
215 |
+
*/
|
216 |
+
public function setResponseHeaders($headers)
|
217 |
+
{
|
218 |
+
$headers = Google_Utils::normalize($headers);
|
219 |
+
if ($this->responseHeaders) {
|
220 |
+
$headers = array_merge($this->responseHeaders, $headers);
|
221 |
+
}
|
222 |
+
$this->responseHeaders = $headers;
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
*
|
227 |
+
* @param string $key
|
228 |
+
* @return array|boolean Returns the requested HTTP header or
|
229 |
+
* false if unavailable.
|
230 |
+
*/
|
231 |
+
public function getResponseHeader($key)
|
232 |
+
{
|
233 |
+
return isset($this->responseHeaders[$key]) ? $this->responseHeaders[$key] : false;
|
234 |
+
}
|
235 |
+
|
236 |
+
/**
|
237 |
+
*
|
238 |
+
* @param string $responseBody
|
239 |
+
* The HTTP response body.
|
240 |
+
*/
|
241 |
+
public function setResponseBody($responseBody)
|
242 |
+
{
|
243 |
+
$this->responseBody = $responseBody;
|
244 |
+
}
|
245 |
+
|
246 |
+
/**
|
247 |
+
*
|
248 |
+
* @return string $url The request URL.
|
249 |
+
*/
|
250 |
+
public function getUrl()
|
251 |
+
{
|
252 |
+
return $this->baseComponent . $this->path . (count($this->queryParams) ? "?" . $this->buildQuery($this->queryParams) : '');
|
253 |
+
}
|
254 |
+
|
255 |
+
/**
|
256 |
+
*
|
257 |
+
* @return string $method HTTP Request Method.
|
258 |
+
*/
|
259 |
+
public function getRequestMethod()
|
260 |
+
{
|
261 |
+
return $this->requestMethod;
|
262 |
+
}
|
263 |
+
|
264 |
+
/**
|
265 |
+
*
|
266 |
+
* @return array $headers HTTP Request Headers.
|
267 |
+
*/
|
268 |
+
public function getRequestHeaders()
|
269 |
+
{
|
270 |
+
return $this->requestHeaders;
|
271 |
+
}
|
272 |
+
|
273 |
+
/**
|
274 |
+
*
|
275 |
+
* @param string $key
|
276 |
+
* @return array|boolean Returns the requested HTTP header or
|
277 |
+
* false if unavailable.
|
278 |
+
*/
|
279 |
+
public function getRequestHeader($key)
|
280 |
+
{
|
281 |
+
return isset($this->requestHeaders[$key]) ? $this->requestHeaders[$key] : false;
|
282 |
+
}
|
283 |
+
|
284 |
+
/**
|
285 |
+
*
|
286 |
+
* @return string $postBody HTTP Request Body.
|
287 |
+
*/
|
288 |
+
public function getPostBody()
|
289 |
+
{
|
290 |
+
return $this->postBody;
|
291 |
+
}
|
292 |
+
|
293 |
+
/**
|
294 |
+
*
|
295 |
+
* @param string $url
|
296 |
+
* the url to set
|
297 |
+
*/
|
298 |
+
public function setUrl($url)
|
299 |
+
{
|
300 |
+
if (substr($url, 0, 4) != 'http') {
|
301 |
+
// Force the path become relative.
|
302 |
+
if (substr($url, 0, 1) !== '/') {
|
303 |
+
$url = '/' . $url;
|
304 |
+
}
|
305 |
+
}
|
306 |
+
$parts = parse_url($url);
|
307 |
+
if (isset($parts['host'])) {
|
308 |
+
$this->baseComponent = sprintf("%s%s%s", isset($parts['scheme']) ? $parts['scheme'] . "://" : '', isset($parts['host']) ? $parts['host'] : '', isset($parts['port']) ? ":" . $parts['port'] : '');
|
309 |
+
}
|
310 |
+
$this->path = isset($parts['path']) ? $parts['path'] : '';
|
311 |
+
$this->queryParams = array();
|
312 |
+
if (isset($parts['query'])) {
|
313 |
+
$this->queryParams = $this->parseQuery($parts['query']);
|
314 |
+
}
|
315 |
+
}
|
316 |
+
|
317 |
+
/**
|
318 |
+
*
|
319 |
+
* @param string $method
|
320 |
+
* Set he HTTP Method and normalize
|
321 |
+
* it to upper-case, as required by HTTP.
|
322 |
+
*
|
323 |
+
*/
|
324 |
+
public function setRequestMethod($method)
|
325 |
+
{
|
326 |
+
$this->requestMethod = strtoupper($method);
|
327 |
+
}
|
328 |
+
|
329 |
+
/**
|
330 |
+
*
|
331 |
+
* @param array $headers
|
332 |
+
* The HTTP request headers
|
333 |
+
* to be set and normalized.
|
334 |
+
*/
|
335 |
+
public function setRequestHeaders($headers)
|
336 |
+
{
|
337 |
+
$headers = Google_Utils::normalize($headers);
|
338 |
+
if ($this->requestHeaders) {
|
339 |
+
$headers = array_merge($this->requestHeaders, $headers);
|
340 |
+
}
|
341 |
+
$this->requestHeaders = $headers;
|
342 |
+
}
|
343 |
+
|
344 |
+
/**
|
345 |
+
*
|
346 |
+
* @param string $postBody
|
347 |
+
* the postBody to set
|
348 |
+
*/
|
349 |
+
public function setPostBody($postBody)
|
350 |
+
{
|
351 |
+
$this->postBody = $postBody;
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* Set the User-Agent Header.
|
356 |
+
*
|
357 |
+
* @param string $userAgent
|
358 |
+
* The User-Agent.
|
359 |
+
*/
|
360 |
+
public function setUserAgent($userAgent)
|
361 |
+
{
|
362 |
+
$this->userAgent = $userAgent;
|
363 |
+
if ($this->canGzip) {
|
364 |
+
$this->userAgent = $userAgent . self::GZIP_UA;
|
365 |
+
}
|
366 |
+
}
|
367 |
+
|
368 |
+
/**
|
369 |
+
*
|
370 |
+
* @return string The User-Agent.
|
371 |
+
*/
|
372 |
+
public function getUserAgent()
|
373 |
+
{
|
374 |
+
return $this->userAgent;
|
375 |
+
}
|
376 |
+
|
377 |
+
/**
|
378 |
+
* Returns a cache key depending on if this was an OAuth signed request
|
379 |
+
* in which case it will use the non-signed url and access key to make this
|
380 |
+
* cache key unique per authenticated user, else use the plain request url
|
381 |
+
*
|
382 |
+
* @return string The md5 hash of the request cache key.
|
383 |
+
*/
|
384 |
+
public function getCacheKey()
|
385 |
+
{
|
386 |
+
$key = $this->getUrl();
|
387 |
+
if (isset($this->accessKey)) {
|
388 |
+
$key .= $this->accessKey;
|
389 |
+
}
|
390 |
+
if (isset($this->requestHeaders['authorization'])) {
|
391 |
+
$key .= $this->requestHeaders['authorization'];
|
392 |
+
}
|
393 |
+
return md5($key);
|
394 |
+
}
|
395 |
+
|
396 |
+
public function getParsedCacheControl()
|
397 |
+
{
|
398 |
+
$parsed = array();
|
399 |
+
$rawCacheControl = $this->getResponseHeader('cache-control');
|
400 |
+
if ($rawCacheControl) {
|
401 |
+
$rawCacheControl = str_replace(', ', '&', $rawCacheControl);
|
402 |
+
parse_str($rawCacheControl, $parsed);
|
403 |
+
}
|
404 |
+
return $parsed;
|
405 |
+
}
|
406 |
+
|
407 |
+
/**
|
408 |
+
*
|
409 |
+
* @param string $id
|
410 |
+
* @return string A string representation of the HTTP Request.
|
411 |
+
*/
|
412 |
+
public function toBatchString($id)
|
413 |
+
{
|
414 |
+
$str = '';
|
415 |
+
$path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" . http_build_query($this->queryParams);
|
416 |
+
$str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n";
|
417 |
+
foreach ($this->getRequestHeaders() as $key => $val) {
|
418 |
+
$str .= $key . ': ' . $val . "\n";
|
419 |
+
}
|
420 |
+
if ($this->getPostBody()) {
|
421 |
+
$str .= "\n";
|
422 |
+
$str .= $this->getPostBody();
|
423 |
+
}
|
424 |
+
$headers = '';
|
425 |
+
foreach ($this->batchHeaders as $key => $val) {
|
426 |
+
$headers .= $key . ': ' . $val . "\n";
|
427 |
+
}
|
428 |
+
$headers .= "Content-ID: $id\n";
|
429 |
+
$str = $headers . "\n" . $str;
|
430 |
+
return $str;
|
431 |
+
}
|
432 |
+
|
433 |
+
/**
|
434 |
+
* Our own version of parse_str that allows for multiple variables
|
435 |
+
* with the same name.
|
436 |
+
*
|
437 |
+
* @param $string -
|
438 |
+
* the query string to parse
|
439 |
+
*/
|
440 |
+
private function parseQuery($string)
|
441 |
+
{
|
442 |
+
$return = array();
|
443 |
+
$parts = explode("&", $string);
|
444 |
+
foreach ($parts as $part) {
|
445 |
+
list ($key, $value) = explode('=', $part, 2);
|
446 |
+
$value = urldecode($value);
|
447 |
+
if (isset($return[$key])) {
|
448 |
+
if (! is_array($return[$key])) {
|
449 |
+
$return[$key] = array(
|
450 |
+
$return[$key]
|
451 |
+
);
|
452 |
+
}
|
453 |
+
$return[$key][] = $value;
|
454 |
+
} else {
|
455 |
+
$return[$key] = $value;
|
456 |
+
}
|
457 |
+
}
|
458 |
+
return $return;
|
459 |
+
}
|
460 |
+
|
461 |
+
/**
|
462 |
+
* A version of build query that allows for multiple
|
463 |
+
* duplicate keys.
|
464 |
+
*
|
465 |
+
* @param $parts array
|
466 |
+
* of key value pairs
|
467 |
+
*/
|
468 |
+
private function buildQuery($parts)
|
469 |
+
{
|
470 |
+
$return = array();
|
471 |
+
foreach ($parts as $key => $value) {
|
472 |
+
if (is_array($value)) {
|
473 |
+
foreach ($value as $v) {
|
474 |
+
$return[] = urlencode($key) . "=" . urlencode($v);
|
475 |
+
}
|
476 |
+
} else {
|
477 |
+
$return[] = urlencode($key) . "=" . urlencode($value);
|
478 |
+
}
|
479 |
+
}
|
480 |
+
return implode('&', $return);
|
481 |
+
}
|
482 |
+
|
483 |
+
/**
|
484 |
+
* If we're POSTing and have no body to send, we can send the query
|
485 |
+
* parameters in there, which avoids length issues with longer query
|
486 |
+
* params.
|
487 |
+
*/
|
488 |
+
public function maybeMoveParametersToBody()
|
489 |
+
{
|
490 |
+
if ($this->getRequestMethod() == "POST" && empty($this->postBody)) {
|
491 |
+
$this->setRequestHeaders(array(
|
492 |
+
"content-type" => "application/x-www-form-urlencoded; charset=UTF-8"
|
493 |
+
));
|
494 |
+
$this->setPostBody($this->buildQuery($this->queryParams));
|
495 |
+
$this->queryParams = array();
|
496 |
+
}
|
497 |
+
}
|
498 |
}
|
tools/src/Google/IO/Abstract.php
CHANGED
@@ -1,340 +1,340 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
/**
|
18 |
-
* Abstract IO base class
|
19 |
-
*/
|
20 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
21 |
-
|
22 |
-
abstract class Google_IO_Abstract
|
23 |
-
{
|
24 |
-
|
25 |
-
const UNKNOWN_CODE = 0;
|
26 |
-
|
27 |
-
const FORM_URLENCODED = 'application/x-www-form-urlencoded';
|
28 |
-
|
29 |
-
private static $CONNECTION_ESTABLISHED_HEADERS = array(
|
30 |
-
"HTTP/1.0 200 Connection established\r\n\r\n",
|
31 |
-
"HTTP/1.1 200 Connection established\r\n\r\n"
|
32 |
-
);
|
33 |
-
|
34 |
-
private static $ENTITY_HTTP_METHODS = array(
|
35 |
-
"POST" => null,
|
36 |
-
"PUT" => null
|
37 |
-
);
|
38 |
-
|
39 |
-
/**
|
40 |
-
*
|
41 |
-
* @var Google_Client
|
42 |
-
*/
|
43 |
-
protected $client;
|
44 |
-
|
45 |
-
public function __construct(Google_Client $client)
|
46 |
-
{
|
47 |
-
$this->client = $client;
|
48 |
-
$timeout = $client->getClassConfig('Google_IO_Abstract', 'request_timeout_seconds');
|
49 |
-
if ($timeout > 0) {
|
50 |
-
$this->setTimeout($timeout);
|
51 |
-
}
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Executes a Google_Http_Request and returns the resulting populated Google_Http_Request
|
56 |
-
*
|
57 |
-
* @param Google_Http_Request $request
|
58 |
-
* @return Google_Http_Request $request
|
59 |
-
*/
|
60 |
-
abstract public function executeRequest(Google_Http_Request $request);
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Set options that update the transport implementation's behavior.
|
64 |
-
*
|
65 |
-
* @param
|
66 |
-
* $options
|
67 |
-
*/
|
68 |
-
abstract public function setOptions($options);
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Set the maximum request time in seconds.
|
72 |
-
*
|
73 |
-
* @param $timeout in
|
74 |
-
* seconds
|
75 |
-
*/
|
76 |
-
abstract public function setTimeout($timeout);
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Get the maximum request time in seconds.
|
80 |
-
*
|
81 |
-
* @return timeout in seconds
|
82 |
-
*/
|
83 |
-
abstract public function getTimeout();
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Test for the presence of a cURL header processing bug
|
87 |
-
*
|
88 |
-
* The cURL bug was present in versions prior to 7.30.0 and caused the header
|
89 |
-
* length to be miscalculated when a "Connection established" header added by
|
90 |
-
* some proxies was present.
|
91 |
-
*
|
92 |
-
* @return boolean
|
93 |
-
*/
|
94 |
-
abstract protected function needsQuirk();
|
95 |
-
|
96 |
-
/**
|
97 |
-
* @visible for testing.
|
98 |
-
* Cache the response to an HTTP request if it is cacheable.
|
99 |
-
*
|
100 |
-
* @param Google_Http_Request $request
|
101 |
-
* @return bool Returns true if the insertion was successful.
|
102 |
-
* Otherwise, return false.
|
103 |
-
*/
|
104 |
-
public function setCachedRequest(Google_Http_Request $request)
|
105 |
-
{
|
106 |
-
// Determine if the request is cacheable.
|
107 |
-
if (Google_Http_CacheParser::isResponseCacheable($request)) {
|
108 |
-
$this->client->getCache()->set($request->getCacheKey(), $request);
|
109 |
-
return true;
|
110 |
-
}
|
111 |
-
return false;
|
112 |
-
}
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Execute an HTTP Request
|
116 |
-
*
|
117 |
-
* @param Google_HttpRequest $request
|
118 |
-
* the http request to be executed
|
119 |
-
* @return Google_HttpRequest http request with the response http code,
|
120 |
-
* response headers and response body filled in
|
121 |
-
* @throws Google_IO_Exception on curl or IO error
|
122 |
-
*/
|
123 |
-
public function makeRequest(Google_Http_Request $request)
|
124 |
-
{
|
125 |
-
// First, check to see if we have a valid cached version.
|
126 |
-
$cached = $this->getCachedRequest($request);
|
127 |
-
if ($cached !== false && $cached instanceof Google_Http_Request) {
|
128 |
-
if (! $this->checkMustRevalidateCachedRequest($cached, $request)) {
|
129 |
-
return $cached;
|
130 |
-
}
|
131 |
-
}
|
132 |
-
if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) {
|
133 |
-
$request = $this->processEntityRequest($request);
|
134 |
-
}
|
135 |
-
list ($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request);
|
136 |
-
if ($respHttpCode == 304 && $cached) {
|
137 |
-
// If the server responded NOT_MODIFIED, return the cached request.
|
138 |
-
$this->updateCachedRequest($cached, $responseHeaders);
|
139 |
-
return $cached;
|
140 |
-
}
|
141 |
-
if (! isset($responseHeaders['Date']) && ! isset($responseHeaders['date'])) {
|
142 |
-
$responseHeaders['Date'] = date("r");
|
143 |
-
}
|
144 |
-
$request->setResponseHttpCode($respHttpCode);
|
145 |
-
$request->setResponseHeaders($responseHeaders);
|
146 |
-
$request->setResponseBody($responseData);
|
147 |
-
// Store the request in cache (the function checks to see if the request
|
148 |
-
// can actually be cached)
|
149 |
-
$this->setCachedRequest($request);
|
150 |
-
return $request;
|
151 |
-
}
|
152 |
-
|
153 |
-
/**
|
154 |
-
* @visible for testing.
|
155 |
-
*
|
156 |
-
* @param Google_Http_Request $request
|
157 |
-
* @return Google_Http_Request|bool Returns the cached object or
|
158 |
-
* false if the operation was unsuccessful.
|
159 |
-
*/
|
160 |
-
public function getCachedRequest(Google_Http_Request $request)
|
161 |
-
{
|
162 |
-
if (false === Google_Http_CacheParser::isRequestCacheable($request)) {
|
163 |
-
return false;
|
164 |
-
}
|
165 |
-
return $this->client->getCache()->get($request->getCacheKey());
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* @visible for testing
|
170 |
-
* Process an http request that contains an enclosed entity.
|
171 |
-
*
|
172 |
-
* @param Google_Http_Request $request
|
173 |
-
* @return Google_Http_Request Processed request with the enclosed entity.
|
174 |
-
*/
|
175 |
-
public function processEntityRequest(Google_Http_Request $request)
|
176 |
-
{
|
177 |
-
$postBody = $request->getPostBody();
|
178 |
-
$contentType = $request->getRequestHeader("content-type");
|
179 |
-
// Set the default content-type as application/x-www-form-urlencoded.
|
180 |
-
if (false == $contentType) {
|
181 |
-
$contentType = self::FORM_URLENCODED;
|
182 |
-
$request->setRequestHeaders(array(
|
183 |
-
'content-type' => $contentType
|
184 |
-
));
|
185 |
-
}
|
186 |
-
// Force the payload to match the content-type asserted in the header.
|
187 |
-
if ($contentType == self::FORM_URLENCODED && is_array($postBody)) {
|
188 |
-
$postBody = http_build_query($postBody, '', '&');
|
189 |
-
$request->setPostBody($postBody);
|
190 |
-
}
|
191 |
-
// Make sure the content-length header is set.
|
192 |
-
if (! $postBody || is_string($postBody)) {
|
193 |
-
$postsLength = strlen($postBody);
|
194 |
-
$request->setRequestHeaders(array(
|
195 |
-
'content-length' => $postsLength
|
196 |
-
));
|
197 |
-
}
|
198 |
-
return $request;
|
199 |
-
}
|
200 |
-
|
201 |
-
/**
|
202 |
-
* Check if an already cached request must be revalidated, and if so update
|
203 |
-
* the request with the correct ETag headers.
|
204 |
-
*
|
205 |
-
* @param Google_Http_Request $cached
|
206 |
-
* A previously cached response.
|
207 |
-
* @param Google_Http_Request $request
|
208 |
-
* The outbound request.
|
209 |
-
* return bool If the cached object needs to be revalidated, false if it is
|
210 |
-
* still current and can be re-used.
|
211 |
-
*/
|
212 |
-
protected function checkMustRevalidateCachedRequest($cached, $request)
|
213 |
-
{
|
214 |
-
if (Google_Http_CacheParser::mustRevalidate($cached)) {
|
215 |
-
$addHeaders = array();
|
216 |
-
if ($cached->getResponseHeader('etag')) {
|
217 |
-
// [13.3.4] If an entity tag has been provided by the origin server,
|
218 |
-
// we must use that entity tag in any cache-conditional request.
|
219 |
-
$addHeaders['If-None-Match'] = $cached->getResponseHeader('etag');
|
220 |
-
} elseif ($cached->getResponseHeader('date')) {
|
221 |
-
$addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date');
|
222 |
-
}
|
223 |
-
$request->setRequestHeaders($addHeaders);
|
224 |
-
return true;
|
225 |
-
} else {
|
226 |
-
return false;
|
227 |
-
}
|
228 |
-
}
|
229 |
-
|
230 |
-
/**
|
231 |
-
* Update a cached request, using the headers from the last response.
|
232 |
-
*
|
233 |
-
* @param Google_HttpRequest $cached
|
234 |
-
* A previously cached response.
|
235 |
-
* @param
|
236 |
-
* mixed Associative array of response headers from the last request.
|
237 |
-
*/
|
238 |
-
protected function updateCachedRequest($cached, $responseHeaders)
|
239 |
-
{
|
240 |
-
if (isset($responseHeaders['connection'])) {
|
241 |
-
$hopByHop = array_merge(self::$HOP_BY_HOP, explode(',', $responseHeaders['connection']));
|
242 |
-
$endToEnd = array();
|
243 |
-
foreach ($hopByHop as $key) {
|
244 |
-
if (isset($responseHeaders[$key])) {
|
245 |
-
$endToEnd[$key] = $responseHeaders[$key];
|
246 |
-
}
|
247 |
-
}
|
248 |
-
$cached->setResponseHeaders($endToEnd);
|
249 |
-
}
|
250 |
-
}
|
251 |
-
|
252 |
-
/**
|
253 |
-
* Used by the IO lib and also the batch processing.
|
254 |
-
*
|
255 |
-
* @param
|
256 |
-
* $respData
|
257 |
-
* @param
|
258 |
-
* $headerSize
|
259 |
-
* @return array
|
260 |
-
*/
|
261 |
-
public function parseHttpResponse($respData, $headerSize)
|
262 |
-
{
|
263 |
-
// check proxy header
|
264 |
-
foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) {
|
265 |
-
if (stripos($respData, $established_header) !== false) {
|
266 |
-
// existed, remove it
|
267 |
-
$respData = str_ireplace($established_header, '', $respData);
|
268 |
-
// Subtract the proxy header size unless the cURL bug prior to 7.30.0
|
269 |
-
// is present which prevented the proxy header size from being taken into
|
270 |
-
// account.
|
271 |
-
if (! $this->needsQuirk()) {
|
272 |
-
$headerSize -= strlen($established_header);
|
273 |
-
}
|
274 |
-
break;
|
275 |
-
}
|
276 |
-
}
|
277 |
-
if ($headerSize) {
|
278 |
-
$responseBody = substr($respData, $headerSize);
|
279 |
-
$responseHeaders = substr($respData, 0, $headerSize);
|
280 |
-
} else {
|
281 |
-
$responseSegments = explode("\r\n\r\n", $respData, 2);
|
282 |
-
$responseHeaders = $responseSegments[0];
|
283 |
-
$responseBody = isset($responseSegments[1]) ? $responseSegments[1] : null;
|
284 |
-
}
|
285 |
-
$responseHeaders = $this->getHttpResponseHeaders($responseHeaders);
|
286 |
-
return array(
|
287 |
-
$responseHeaders,
|
288 |
-
$responseBody
|
289 |
-
);
|
290 |
-
}
|
291 |
-
|
292 |
-
/**
|
293 |
-
* Parse out headers from raw headers
|
294 |
-
*
|
295 |
-
* @param
|
296 |
-
* rawHeaders array or string
|
297 |
-
* @return array
|
298 |
-
*/
|
299 |
-
public function getHttpResponseHeaders($rawHeaders)
|
300 |
-
{
|
301 |
-
if (is_array($rawHeaders)) {
|
302 |
-
return $this->parseArrayHeaders($rawHeaders);
|
303 |
-
} else {
|
304 |
-
return $this->parseStringHeaders($rawHeaders);
|
305 |
-
}
|
306 |
-
}
|
307 |
-
|
308 |
-
private function parseStringHeaders($rawHeaders)
|
309 |
-
{
|
310 |
-
$headers = array();
|
311 |
-
$responseHeaderLines = explode("\r\n", $rawHeaders);
|
312 |
-
foreach ($responseHeaderLines as $headerLine) {
|
313 |
-
if ($headerLine && strpos($headerLine, ':') !== false) {
|
314 |
-
list ($header, $value) = explode(': ', $headerLine, 2);
|
315 |
-
$header = strtolower($header);
|
316 |
-
if (isset($headers[$header])) {
|
317 |
-
$headers[$header] .= "\n" . $value;
|
318 |
-
} else {
|
319 |
-
$headers[$header] = $value;
|
320 |
-
}
|
321 |
-
}
|
322 |
-
}
|
323 |
-
return $headers;
|
324 |
-
}
|
325 |
-
|
326 |
-
private function parseArrayHeaders($rawHeaders)
|
327 |
-
{
|
328 |
-
$header_count = count($rawHeaders);
|
329 |
-
$headers = array();
|
330 |
-
for ($i = 0; $i < $header_count; $i ++) {
|
331 |
-
$header = $rawHeaders[$i];
|
332 |
-
// Times will have colons in - so we just want the first match.
|
333 |
-
$header_parts = explode(': ', $header, 2);
|
334 |
-
if (count($header_parts) == 2) {
|
335 |
-
$headers[$header_parts[0]] = $header_parts[1];
|
336 |
-
}
|
337 |
-
}
|
338 |
-
return $headers;
|
339 |
-
}
|
340 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
/**
|
18 |
+
* Abstract IO base class
|
19 |
+
*/
|
20 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
21 |
+
|
22 |
+
abstract class Google_IO_Abstract
|
23 |
+
{
|
24 |
+
|
25 |
+
const UNKNOWN_CODE = 0;
|
26 |
+
|
27 |
+
const FORM_URLENCODED = 'application/x-www-form-urlencoded';
|
28 |
+
|
29 |
+
private static $CONNECTION_ESTABLISHED_HEADERS = array(
|
30 |
+
"HTTP/1.0 200 Connection established\r\n\r\n",
|
31 |
+
"HTTP/1.1 200 Connection established\r\n\r\n"
|
32 |
+
);
|
33 |
+
|
34 |
+
private static $ENTITY_HTTP_METHODS = array(
|
35 |
+
"POST" => null,
|
36 |
+
"PUT" => null
|
37 |
+
);
|
38 |
+
|
39 |
+
/**
|
40 |
+
*
|
41 |
+
* @var Google_Client
|
42 |
+
*/
|
43 |
+
protected $client;
|
44 |
+
|
45 |
+
public function __construct(Google_Client $client)
|
46 |
+
{
|
47 |
+
$this->client = $client;
|
48 |
+
$timeout = $client->getClassConfig('Google_IO_Abstract', 'request_timeout_seconds');
|
49 |
+
if ($timeout > 0) {
|
50 |
+
$this->setTimeout($timeout);
|
51 |
+
}
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Executes a Google_Http_Request and returns the resulting populated Google_Http_Request
|
56 |
+
*
|
57 |
+
* @param Google_Http_Request $request
|
58 |
+
* @return Google_Http_Request $request
|
59 |
+
*/
|
60 |
+
abstract public function executeRequest(Google_Http_Request $request);
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Set options that update the transport implementation's behavior.
|
64 |
+
*
|
65 |
+
* @param
|
66 |
+
* $options
|
67 |
+
*/
|
68 |
+
abstract public function setOptions($options);
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Set the maximum request time in seconds.
|
72 |
+
*
|
73 |
+
* @param $timeout in
|
74 |
+
* seconds
|
75 |
+
*/
|
76 |
+
abstract public function setTimeout($timeout);
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Get the maximum request time in seconds.
|
80 |
+
*
|
81 |
+
* @return timeout in seconds
|
82 |
+
*/
|
83 |
+
abstract public function getTimeout();
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Test for the presence of a cURL header processing bug
|
87 |
+
*
|
88 |
+
* The cURL bug was present in versions prior to 7.30.0 and caused the header
|
89 |
+
* length to be miscalculated when a "Connection established" header added by
|
90 |
+
* some proxies was present.
|
91 |
+
*
|
92 |
+
* @return boolean
|
93 |
+
*/
|
94 |
+
abstract protected function needsQuirk();
|
95 |
+
|
96 |
+
/**
|
97 |
+
* @visible for testing.
|
98 |
+
* Cache the response to an HTTP request if it is cacheable.
|
99 |
+
*
|
100 |
+
* @param Google_Http_Request $request
|
101 |
+
* @return bool Returns true if the insertion was successful.
|
102 |
+
* Otherwise, return false.
|
103 |
+
*/
|
104 |
+
public function setCachedRequest(Google_Http_Request $request)
|
105 |
+
{
|
106 |
+
// Determine if the request is cacheable.
|
107 |
+
if (Google_Http_CacheParser::isResponseCacheable($request)) {
|
108 |
+
$this->client->getCache()->set($request->getCacheKey(), $request);
|
109 |
+
return true;
|
110 |
+
}
|
111 |
+
return false;
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Execute an HTTP Request
|
116 |
+
*
|
117 |
+
* @param Google_HttpRequest $request
|
118 |
+
* the http request to be executed
|
119 |
+
* @return Google_HttpRequest http request with the response http code,
|
120 |
+
* response headers and response body filled in
|
121 |
+
* @throws Google_IO_Exception on curl or IO error
|
122 |
+
*/
|
123 |
+
public function makeRequest(Google_Http_Request $request)
|
124 |
+
{
|
125 |
+
// First, check to see if we have a valid cached version.
|
126 |
+
$cached = $this->getCachedRequest($request);
|
127 |
+
if ($cached !== false && $cached instanceof Google_Http_Request) {
|
128 |
+
if (! $this->checkMustRevalidateCachedRequest($cached, $request)) {
|
129 |
+
return $cached;
|
130 |
+
}
|
131 |
+
}
|
132 |
+
if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) {
|
133 |
+
$request = $this->processEntityRequest($request);
|
134 |
+
}
|
135 |
+
list ($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request);
|
136 |
+
if ($respHttpCode == 304 && $cached) {
|
137 |
+
// If the server responded NOT_MODIFIED, return the cached request.
|
138 |
+
$this->updateCachedRequest($cached, $responseHeaders);
|
139 |
+
return $cached;
|
140 |
+
}
|
141 |
+
if (! isset($responseHeaders['Date']) && ! isset($responseHeaders['date'])) {
|
142 |
+
$responseHeaders['Date'] = date("r");
|
143 |
+
}
|
144 |
+
$request->setResponseHttpCode($respHttpCode);
|
145 |
+
$request->setResponseHeaders($responseHeaders);
|
146 |
+
$request->setResponseBody($responseData);
|
147 |
+
// Store the request in cache (the function checks to see if the request
|
148 |
+
// can actually be cached)
|
149 |
+
$this->setCachedRequest($request);
|
150 |
+
return $request;
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* @visible for testing.
|
155 |
+
*
|
156 |
+
* @param Google_Http_Request $request
|
157 |
+
* @return Google_Http_Request|bool Returns the cached object or
|
158 |
+
* false if the operation was unsuccessful.
|
159 |
+
*/
|
160 |
+
public function getCachedRequest(Google_Http_Request $request)
|
161 |
+
{
|
162 |
+
if (false === Google_Http_CacheParser::isRequestCacheable($request)) {
|
163 |
+
return false;
|
164 |
+
}
|
165 |
+
return $this->client->getCache()->get($request->getCacheKey());
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* @visible for testing
|
170 |
+
* Process an http request that contains an enclosed entity.
|
171 |
+
*
|
172 |
+
* @param Google_Http_Request $request
|
173 |
+
* @return Google_Http_Request Processed request with the enclosed entity.
|
174 |
+
*/
|
175 |
+
public function processEntityRequest(Google_Http_Request $request)
|
176 |
+
{
|
177 |
+
$postBody = $request->getPostBody();
|
178 |
+
$contentType = $request->getRequestHeader("content-type");
|
179 |
+
// Set the default content-type as application/x-www-form-urlencoded.
|
180 |
+
if (false == $contentType) {
|
181 |
+
$contentType = self::FORM_URLENCODED;
|
182 |
+
$request->setRequestHeaders(array(
|
183 |
+
'content-type' => $contentType
|
184 |
+
));
|
185 |
+
}
|
186 |
+
// Force the payload to match the content-type asserted in the header.
|
187 |
+
if ($contentType == self::FORM_URLENCODED && is_array($postBody)) {
|
188 |
+
$postBody = http_build_query($postBody, '', '&');
|
189 |
+
$request->setPostBody($postBody);
|
190 |
+
}
|
191 |
+
// Make sure the content-length header is set.
|
192 |
+
if (! $postBody || is_string($postBody)) {
|
193 |
+
$postsLength = strlen($postBody);
|
194 |
+
$request->setRequestHeaders(array(
|
195 |
+
'content-length' => $postsLength
|
196 |
+
));
|
197 |
+
}
|
198 |
+
return $request;
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Check if an already cached request must be revalidated, and if so update
|
203 |
+
* the request with the correct ETag headers.
|
204 |
+
*
|
205 |
+
* @param Google_Http_Request $cached
|
206 |
+
* A previously cached response.
|
207 |
+
* @param Google_Http_Request $request
|
208 |
+
* The outbound request.
|
209 |
+
* return bool If the cached object needs to be revalidated, false if it is
|
210 |
+
* still current and can be re-used.
|
211 |
+
*/
|
212 |
+
protected function checkMustRevalidateCachedRequest($cached, $request)
|
213 |
+
{
|
214 |
+
if (Google_Http_CacheParser::mustRevalidate($cached)) {
|
215 |
+
$addHeaders = array();
|
216 |
+
if ($cached->getResponseHeader('etag')) {
|
217 |
+
// [13.3.4] If an entity tag has been provided by the origin server,
|
218 |
+
// we must use that entity tag in any cache-conditional request.
|
219 |
+
$addHeaders['If-None-Match'] = $cached->getResponseHeader('etag');
|
220 |
+
} elseif ($cached->getResponseHeader('date')) {
|
221 |
+
$addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date');
|
222 |
+
}
|
223 |
+
$request->setRequestHeaders($addHeaders);
|
224 |
+
return true;
|
225 |
+
} else {
|
226 |
+
return false;
|
227 |
+
}
|
228 |
+
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* Update a cached request, using the headers from the last response.
|
232 |
+
*
|
233 |
+
* @param Google_HttpRequest $cached
|
234 |
+
* A previously cached response.
|
235 |
+
* @param
|
236 |
+
* mixed Associative array of response headers from the last request.
|
237 |
+
*/
|
238 |
+
protected function updateCachedRequest($cached, $responseHeaders)
|
239 |
+
{
|
240 |
+
if (isset($responseHeaders['connection'])) {
|
241 |
+
$hopByHop = array_merge(self::$HOP_BY_HOP, explode(',', $responseHeaders['connection']));
|
242 |
+
$endToEnd = array();
|
243 |
+
foreach ($hopByHop as $key) {
|
244 |
+
if (isset($responseHeaders[$key])) {
|
245 |
+
$endToEnd[$key] = $responseHeaders[$key];
|
246 |
+
}
|
247 |
+
}
|
248 |
+
$cached->setResponseHeaders($endToEnd);
|
249 |
+
}
|
250 |
+
}
|
251 |
+
|
252 |
+
/**
|
253 |
+
* Used by the IO lib and also the batch processing.
|
254 |
+
*
|
255 |
+
* @param
|
256 |
+
* $respData
|
257 |
+
* @param
|
258 |
+
* $headerSize
|
259 |
+
* @return array
|
260 |
+
*/
|
261 |
+
public function parseHttpResponse($respData, $headerSize)
|
262 |
+
{
|
263 |
+
// check proxy header
|
264 |
+
foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) {
|
265 |
+
if (stripos($respData, $established_header) !== false) {
|
266 |
+
// existed, remove it
|
267 |
+
$respData = str_ireplace($established_header, '', $respData);
|
268 |
+
// Subtract the proxy header size unless the cURL bug prior to 7.30.0
|
269 |
+
// is present which prevented the proxy header size from being taken into
|
270 |
+
// account.
|
271 |
+
if (! $this->needsQuirk()) {
|
272 |
+
$headerSize -= strlen($established_header);
|
273 |
+
}
|
274 |
+
break;
|
275 |
+
}
|
276 |
+
}
|
277 |
+
if ($headerSize) {
|
278 |
+
$responseBody = substr($respData, $headerSize);
|
279 |
+
$responseHeaders = substr($respData, 0, $headerSize);
|
280 |
+
} else {
|
281 |
+
$responseSegments = explode("\r\n\r\n", $respData, 2);
|
282 |
+
$responseHeaders = $responseSegments[0];
|
283 |
+
$responseBody = isset($responseSegments[1]) ? $responseSegments[1] : null;
|
284 |
+
}
|
285 |
+
$responseHeaders = $this->getHttpResponseHeaders($responseHeaders);
|
286 |
+
return array(
|
287 |
+
$responseHeaders,
|
288 |
+
$responseBody
|
289 |
+
);
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Parse out headers from raw headers
|
294 |
+
*
|
295 |
+
* @param
|
296 |
+
* rawHeaders array or string
|
297 |
+
* @return array
|
298 |
+
*/
|
299 |
+
public function getHttpResponseHeaders($rawHeaders)
|
300 |
+
{
|
301 |
+
if (is_array($rawHeaders)) {
|
302 |
+
return $this->parseArrayHeaders($rawHeaders);
|
303 |
+
} else {
|
304 |
+
return $this->parseStringHeaders($rawHeaders);
|
305 |
+
}
|
306 |
+
}
|
307 |
+
|
308 |
+
private function parseStringHeaders($rawHeaders)
|
309 |
+
{
|
310 |
+
$headers = array();
|
311 |
+
$responseHeaderLines = explode("\r\n", $rawHeaders);
|
312 |
+
foreach ($responseHeaderLines as $headerLine) {
|
313 |
+
if ($headerLine && strpos($headerLine, ':') !== false) {
|
314 |
+
list ($header, $value) = explode(': ', $headerLine, 2);
|
315 |
+
$header = strtolower($header);
|
316 |
+
if (isset($headers[$header])) {
|
317 |
+
$headers[$header] .= "\n" . $value;
|
318 |
+
} else {
|
319 |
+
$headers[$header] = $value;
|
320 |
+
}
|
321 |
+
}
|
322 |
+
}
|
323 |
+
return $headers;
|
324 |
+
}
|
325 |
+
|
326 |
+
private function parseArrayHeaders($rawHeaders)
|
327 |
+
{
|
328 |
+
$header_count = count($rawHeaders);
|
329 |
+
$headers = array();
|
330 |
+
for ($i = 0; $i < $header_count; $i ++) {
|
331 |
+
$header = $rawHeaders[$i];
|
332 |
+
// Times will have colons in - so we just want the first match.
|
333 |
+
$header_parts = explode(': ', $header, 2);
|
334 |
+
if (count($header_parts) == 2) {
|
335 |
+
$headers[$header_parts[0]] = $header_parts[1];
|
336 |
+
}
|
337 |
+
}
|
338 |
+
return $headers;
|
339 |
+
}
|
340 |
}
|
tools/src/Google/IO/Curl.php
CHANGED
@@ -1,153 +1,153 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
/**
|
18 |
-
* Curl based implementation of Google_IO.
|
19 |
-
*
|
20 |
-
* @author Stuart Langley <slangley@google.com>
|
21 |
-
*/
|
22 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
23 |
-
|
24 |
-
class Google_IO_Curl extends Google_IO_Abstract
|
25 |
-
{
|
26 |
-
// cURL hex representation of version 7.30.0
|
27 |
-
const NO_QUIRK_VERSION = 0x071E00;
|
28 |
-
|
29 |
-
private $options = array();
|
30 |
-
|
31 |
-
/**
|
32 |
-
* Execute an HTTP Request
|
33 |
-
*
|
34 |
-
* @param Google_HttpRequest $request
|
35 |
-
* the http request to be executed
|
36 |
-
* @return Google_HttpRequest http request with the response http code,
|
37 |
-
* response headers and response body filled in
|
38 |
-
* @throws Google_IO_Exception on curl or IO error
|
39 |
-
*/
|
40 |
-
public function executeRequest(Google_Http_Request $request)
|
41 |
-
{
|
42 |
-
$curl = curl_init();
|
43 |
-
if ($request->getPostBody()) {
|
44 |
-
curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody());
|
45 |
-
}
|
46 |
-
$requestHeaders = $request->getRequestHeaders();
|
47 |
-
if ($requestHeaders && is_array($requestHeaders)) {
|
48 |
-
$curlHeaders = array();
|
49 |
-
foreach ($requestHeaders as $k => $v) {
|
50 |
-
$curlHeaders[] = "$k: $v";
|
51 |
-
}
|
52 |
-
curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
|
53 |
-
}
|
54 |
-
curl_setopt($curl, CURLOPT_URL, $request->getUrl());
|
55 |
-
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
|
56 |
-
curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent());
|
57 |
-
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
|
58 |
-
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
|
59 |
-
// 1 is CURL_SSLVERSION_TLSv1, which is not always defined in PHP.
|
60 |
-
curl_setopt($curl, CURLOPT_SSLVERSION, 1);
|
61 |
-
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
62 |
-
curl_setopt($curl, CURLOPT_HEADER, true);
|
63 |
-
if ($request->canGzip()) {
|
64 |
-
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
|
65 |
-
}
|
66 |
-
$options = $this->client->getClassConfig('Google_IO_Curl', 'options');
|
67 |
-
if (is_array($options)) {
|
68 |
-
$this->setOptions($options);
|
69 |
-
}
|
70 |
-
foreach ($this->options as $key => $var) {
|
71 |
-
curl_setopt($curl, $key, $var);
|
72 |
-
}
|
73 |
-
if (! isset($this->options[CURLOPT_CAINFO])) {
|
74 |
-
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
|
75 |
-
}
|
76 |
-
$this->client->getLogger()->debug('cURL request', array(
|
77 |
-
'url' => $request->getUrl(),
|
78 |
-
'method' => $request->getRequestMethod(),
|
79 |
-
'headers' => $requestHeaders,
|
80 |
-
'body' => $request->getPostBody()
|
81 |
-
));
|
82 |
-
$response = curl_exec($curl);
|
83 |
-
if ($response === false) {
|
84 |
-
$error = curl_error($curl);
|
85 |
-
$this->client->getLogger()->error('cURL ' . $error);
|
86 |
-
throw new Google_IO_Exception($error);
|
87 |
-
}
|
88 |
-
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
|
89 |
-
list ($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize);
|
90 |
-
$responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
91 |
-
$this->client->getLogger()->debug('cURL response', array(
|
92 |
-
'code' => $responseCode,
|
93 |
-
'headers' => $responseHeaders,
|
94 |
-
'body' => $responseBody
|
95 |
-
));
|
96 |
-
return array(
|
97 |
-
$responseBody,
|
98 |
-
$responseHeaders,
|
99 |
-
$responseCode
|
100 |
-
);
|
101 |
-
}
|
102 |
-
|
103 |
-
/**
|
104 |
-
* Set options that update the transport implementation's behavior.
|
105 |
-
*
|
106 |
-
* @param
|
107 |
-
* $options
|
108 |
-
*/
|
109 |
-
public function setOptions($options)
|
110 |
-
{
|
111 |
-
$this->options = $options + $this->options;
|
112 |
-
}
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Set the maximum request time in seconds.
|
116 |
-
*
|
117 |
-
* @param $timeout in
|
118 |
-
* seconds
|
119 |
-
*/
|
120 |
-
public function setTimeout($timeout)
|
121 |
-
{
|
122 |
-
// Since this timeout is really for putting a bound on the time
|
123 |
-
// we'll set them both to the same. If you need to specify a longer
|
124 |
-
// CURLOPT_TIMEOUT, or a tigher CONNECTTIMEOUT, the best thing to
|
125 |
-
// do is use the setOptions method for the values individually.
|
126 |
-
$this->options[CURLOPT_CONNECTTIMEOUT] = $timeout;
|
127 |
-
$this->options[CURLOPT_TIMEOUT] = $timeout;
|
128 |
-
}
|
129 |
-
|
130 |
-
/**
|
131 |
-
* Get the maximum request time in seconds.
|
132 |
-
*
|
133 |
-
* @return timeout in seconds
|
134 |
-
*/
|
135 |
-
public function getTimeout()
|
136 |
-
{
|
137 |
-
return $this->options[CURLOPT_TIMEOUT];
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* Test for the presence of a cURL header processing bug
|
142 |
-
*
|
143 |
-
* {@inheritDoc}
|
144 |
-
*
|
145 |
-
* @return boolean
|
146 |
-
*/
|
147 |
-
protected function needsQuirk()
|
148 |
-
{
|
149 |
-
$ver = curl_version();
|
150 |
-
$versionNum = $ver['version_number'];
|
151 |
-
return $versionNum < Google_IO_Curl::NO_QUIRK_VERSION;
|
152 |
-
}
|
153 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
/**
|
18 |
+
* Curl based implementation of Google_IO.
|
19 |
+
*
|
20 |
+
* @author Stuart Langley <slangley@google.com>
|
21 |
+
*/
|
22 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
23 |
+
|
24 |
+
class Google_IO_Curl extends Google_IO_Abstract
|
25 |
+
{
|
26 |
+
// cURL hex representation of version 7.30.0
|
27 |
+
const NO_QUIRK_VERSION = 0x071E00;
|
28 |
+
|
29 |
+
private $options = array();
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Execute an HTTP Request
|
33 |
+
*
|
34 |
+
* @param Google_HttpRequest $request
|
35 |
+
* the http request to be executed
|
36 |
+
* @return Google_HttpRequest http request with the response http code,
|
37 |
+
* response headers and response body filled in
|
38 |
+
* @throws Google_IO_Exception on curl or IO error
|
39 |
+
*/
|
40 |
+
public function executeRequest(Google_Http_Request $request)
|
41 |
+
{
|
42 |
+
$curl = curl_init();
|
43 |
+
if ($request->getPostBody()) {
|
44 |
+
curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody());
|
45 |
+
}
|
46 |
+
$requestHeaders = $request->getRequestHeaders();
|
47 |
+
if ($requestHeaders && is_array($requestHeaders)) {
|
48 |
+
$curlHeaders = array();
|
49 |
+
foreach ($requestHeaders as $k => $v) {
|
50 |
+
$curlHeaders[] = "$k: $v";
|
51 |
+
}
|
52 |
+
curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
|
53 |
+
}
|
54 |
+
curl_setopt($curl, CURLOPT_URL, $request->getUrl());
|
55 |
+
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
|
56 |
+
curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent());
|
57 |
+
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
|
58 |
+
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
|
59 |
+
// 1 is CURL_SSLVERSION_TLSv1, which is not always defined in PHP.
|
60 |
+
curl_setopt($curl, CURLOPT_SSLVERSION, 1);
|
61 |
+
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
62 |
+
curl_setopt($curl, CURLOPT_HEADER, true);
|
63 |
+
if ($request->canGzip()) {
|
64 |
+
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
|
65 |
+
}
|
66 |
+
$options = $this->client->getClassConfig('Google_IO_Curl', 'options');
|
67 |
+
if (is_array($options)) {
|
68 |
+
$this->setOptions($options);
|
69 |
+
}
|
70 |
+
foreach ($this->options as $key => $var) {
|
71 |
+
curl_setopt($curl, $key, $var);
|
72 |
+
}
|
73 |
+
if (! isset($this->options[CURLOPT_CAINFO])) {
|
74 |
+
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
|
75 |
+
}
|
76 |
+
$this->client->getLogger()->debug('cURL request', array(
|
77 |
+
'url' => $request->getUrl(),
|
78 |
+
'method' => $request->getRequestMethod(),
|
79 |
+
'headers' => $requestHeaders,
|
80 |
+
'body' => $request->getPostBody()
|
81 |
+
));
|
82 |
+
$response = curl_exec($curl);
|
83 |
+
if ($response === false) {
|
84 |
+
$error = curl_error($curl);
|
85 |
+
$this->client->getLogger()->error('cURL ' . $error);
|
86 |
+
throw new Google_IO_Exception($error);
|
87 |
+
}
|
88 |
+
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
|
89 |
+
list ($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize);
|
90 |
+
$responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
91 |
+
$this->client->getLogger()->debug('cURL response', array(
|
92 |
+
'code' => $responseCode,
|
93 |
+
'headers' => $responseHeaders,
|
94 |
+
'body' => $responseBody
|
95 |
+
));
|
96 |
+
return array(
|
97 |
+
$responseBody,
|
98 |
+
$responseHeaders,
|
99 |
+
$responseCode
|
100 |
+
);
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Set options that update the transport implementation's behavior.
|
105 |
+
*
|
106 |
+
* @param
|
107 |
+
* $options
|
108 |
+
*/
|
109 |
+
public function setOptions($options)
|
110 |
+
{
|
111 |
+
$this->options = $options + $this->options;
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Set the maximum request time in seconds.
|
116 |
+
*
|
117 |
+
* @param $timeout in
|
118 |
+
* seconds
|
119 |
+
*/
|
120 |
+
public function setTimeout($timeout)
|
121 |
+
{
|
122 |
+
// Since this timeout is really for putting a bound on the time
|
123 |
+
// we'll set them both to the same. If you need to specify a longer
|
124 |
+
// CURLOPT_TIMEOUT, or a tigher CONNECTTIMEOUT, the best thing to
|
125 |
+
// do is use the setOptions method for the values individually.
|
126 |
+
$this->options[CURLOPT_CONNECTTIMEOUT] = $timeout;
|
127 |
+
$this->options[CURLOPT_TIMEOUT] = $timeout;
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Get the maximum request time in seconds.
|
132 |
+
*
|
133 |
+
* @return timeout in seconds
|
134 |
+
*/
|
135 |
+
public function getTimeout()
|
136 |
+
{
|
137 |
+
return $this->options[CURLOPT_TIMEOUT];
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Test for the presence of a cURL header processing bug
|
142 |
+
*
|
143 |
+
* {@inheritDoc}
|
144 |
+
*
|
145 |
+
* @return boolean
|
146 |
+
*/
|
147 |
+
protected function needsQuirk()
|
148 |
+
{
|
149 |
+
$ver = curl_version();
|
150 |
+
$versionNum = $ver['version_number'];
|
151 |
+
return $versionNum < Google_IO_Curl::NO_QUIRK_VERSION;
|
152 |
+
}
|
153 |
}
|
tools/src/Google/IO/Exception.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
class Google_IO_Exception extends Google_Exception
|
20 |
-
{
|
21 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
class Google_IO_Exception extends Google_Exception
|
20 |
+
{
|
21 |
}
|
tools/src/Google/IO/Stream.php
CHANGED
@@ -1,202 +1,202 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
/**
|
18 |
-
* Http Streams based implementation of Google_IO.
|
19 |
-
*
|
20 |
-
* @author Stuart Langley <slangley@google.com>
|
21 |
-
*/
|
22 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
23 |
-
|
24 |
-
class Google_IO_Stream extends Google_IO_Abstract
|
25 |
-
{
|
26 |
-
|
27 |
-
const TIMEOUT = "timeout";
|
28 |
-
|
29 |
-
const ZLIB = "compress.zlib://";
|
30 |
-
|
31 |
-
private $options = array();
|
32 |
-
|
33 |
-
private $trappedErrorNumber;
|
34 |
-
|
35 |
-
private $trappedErrorString;
|
36 |
-
|
37 |
-
private static $DEFAULT_HTTP_CONTEXT = array(
|
38 |
-
"follow_location" => 0,
|
39 |
-
"ignore_errors" => 1
|
40 |
-
);
|
41 |
-
|
42 |
-
private static $DEFAULT_SSL_CONTEXT = array(
|
43 |
-
"verify_peer" => true
|
44 |
-
);
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Execute an HTTP Request
|
48 |
-
*
|
49 |
-
* @param Google_HttpRequest $request
|
50 |
-
* the http request to be executed
|
51 |
-
* @return Google_HttpRequest http request with the response http code,
|
52 |
-
* response headers and response body filled in
|
53 |
-
* @throws Google_IO_Exception on curl or IO error
|
54 |
-
*/
|
55 |
-
public function executeRequest(Google_Http_Request $request)
|
56 |
-
{
|
57 |
-
$default_options = stream_context_get_options(stream_context_get_default());
|
58 |
-
$requestHttpContext = array_key_exists('http', $default_options) ? $default_options['http'] : array();
|
59 |
-
if ($request->getPostBody()) {
|
60 |
-
$requestHttpContext["content"] = $request->getPostBody();
|
61 |
-
}
|
62 |
-
$requestHeaders = $request->getRequestHeaders();
|
63 |
-
if ($requestHeaders && is_array($requestHeaders)) {
|
64 |
-
$headers = "";
|
65 |
-
foreach ($requestHeaders as $k => $v) {
|
66 |
-
$headers .= "$k: $v\r\n";
|
67 |
-
}
|
68 |
-
$requestHttpContext["header"] = $headers;
|
69 |
-
}
|
70 |
-
$requestHttpContext["method"] = $request->getRequestMethod();
|
71 |
-
$requestHttpContext["user_agent"] = $request->getUserAgent();
|
72 |
-
$requestSslContext = array_key_exists('ssl', $default_options) ? $default_options['ssl'] : array();
|
73 |
-
if (! array_key_exists("cafile", $requestSslContext)) {
|
74 |
-
$requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
|
75 |
-
}
|
76 |
-
$options = array(
|
77 |
-
"http" => array_merge(self::$DEFAULT_HTTP_CONTEXT, $requestHttpContext),
|
78 |
-
"ssl" => array_merge(self::$DEFAULT_SSL_CONTEXT, $requestSslContext)
|
79 |
-
);
|
80 |
-
$context = stream_context_create($options);
|
81 |
-
$url = $request->getUrl();
|
82 |
-
if ($request->canGzip()) {
|
83 |
-
$url = self::ZLIB . $url;
|
84 |
-
}
|
85 |
-
$this->client->getLogger()->debug('Stream request', array(
|
86 |
-
'url' => $url,
|
87 |
-
'method' => $request->getRequestMethod(),
|
88 |
-
'headers' => $requestHeaders,
|
89 |
-
'body' => $request->getPostBody()
|
90 |
-
));
|
91 |
-
// We are trapping any thrown errors in this method only and
|
92 |
-
// throwing an exception.
|
93 |
-
$this->trappedErrorNumber = null;
|
94 |
-
$this->trappedErrorString = null;
|
95 |
-
// START - error trap.
|
96 |
-
set_error_handler(array(
|
97 |
-
$this,
|
98 |
-
'trapError'
|
99 |
-
));
|
100 |
-
$fh = fopen($url, 'r', false, $context);
|
101 |
-
restore_error_handler();
|
102 |
-
// END - error trap.
|
103 |
-
if ($this->trappedErrorNumber) {
|
104 |
-
$error = sprintf("HTTP Error: Unable to connect: '%s'", $this->trappedErrorString);
|
105 |
-
$this->client->getLogger()->error('Stream ' . $error);
|
106 |
-
throw new Google_IO_Exception($error, $this->trappedErrorNumber);
|
107 |
-
}
|
108 |
-
$response_data = false;
|
109 |
-
$respHttpCode = self::UNKNOWN_CODE;
|
110 |
-
if ($fh) {
|
111 |
-
if (isset($this->options[self::TIMEOUT])) {
|
112 |
-
stream_set_timeout($fh, $this->options[self::TIMEOUT]);
|
113 |
-
}
|
114 |
-
$response_data = stream_get_contents($fh);
|
115 |
-
fclose($fh);
|
116 |
-
$respHttpCode = $this->getHttpResponseCode($http_response_header);
|
117 |
-
}
|
118 |
-
if (false === $response_data) {
|
119 |
-
$error = sprintf("HTTP Error: Unable to connect: '%s'", $respHttpCode);
|
120 |
-
$this->client->getLogger()->error('Stream ' . $error);
|
121 |
-
throw new Google_IO_Exception($error, $respHttpCode);
|
122 |
-
}
|
123 |
-
$responseHeaders = $this->getHttpResponseHeaders($http_response_header);
|
124 |
-
$this->client->getLogger()->debug('Stream response', array(
|
125 |
-
'code' => $respHttpCode,
|
126 |
-
'headers' => $responseHeaders,
|
127 |
-
'body' => $response_data
|
128 |
-
));
|
129 |
-
return array(
|
130 |
-
$response_data,
|
131 |
-
$responseHeaders,
|
132 |
-
$respHttpCode
|
133 |
-
);
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* Set options that update the transport implementation's behavior.
|
138 |
-
*
|
139 |
-
* @param
|
140 |
-
* $options
|
141 |
-
*/
|
142 |
-
public function setOptions($options)
|
143 |
-
{
|
144 |
-
$this->options = $options + $this->options;
|
145 |
-
}
|
146 |
-
|
147 |
-
/**
|
148 |
-
* Method to handle errors, used for error handling around
|
149 |
-
* stream connection methods.
|
150 |
-
*/
|
151 |
-
public function trapError($errno, $errstr)
|
152 |
-
{
|
153 |
-
$this->trappedErrorNumber = $errno;
|
154 |
-
$this->trappedErrorString = $errstr;
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Set the maximum request time in seconds.
|
159 |
-
*
|
160 |
-
* @param $timeout in
|
161 |
-
* seconds
|
162 |
-
*/
|
163 |
-
public function setTimeout($timeout)
|
164 |
-
{
|
165 |
-
$this->options[self::TIMEOUT] = $timeout;
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* Get the maximum request time in seconds.
|
170 |
-
*
|
171 |
-
* @return timeout in seconds
|
172 |
-
*/
|
173 |
-
public function getTimeout()
|
174 |
-
{
|
175 |
-
return $this->options[self::TIMEOUT];
|
176 |
-
}
|
177 |
-
|
178 |
-
/**
|
179 |
-
* Test for the presence of a cURL header processing bug
|
180 |
-
*
|
181 |
-
* {@inheritDoc}
|
182 |
-
*
|
183 |
-
* @return boolean
|
184 |
-
*/
|
185 |
-
protected function needsQuirk()
|
186 |
-
{
|
187 |
-
return false;
|
188 |
-
}
|
189 |
-
|
190 |
-
protected function getHttpResponseCode($response_headers)
|
191 |
-
{
|
192 |
-
$header_count = count($response_headers);
|
193 |
-
for ($i = 0; $i < $header_count; $i ++) {
|
194 |
-
$header = $response_headers[$i];
|
195 |
-
if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) {
|
196 |
-
$response = explode(' ', $header);
|
197 |
-
return $response[1];
|
198 |
-
}
|
199 |
-
}
|
200 |
-
return self::UNKNOWN_CODE;
|
201 |
-
}
|
202 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
/**
|
18 |
+
* Http Streams based implementation of Google_IO.
|
19 |
+
*
|
20 |
+
* @author Stuart Langley <slangley@google.com>
|
21 |
+
*/
|
22 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
23 |
+
|
24 |
+
class Google_IO_Stream extends Google_IO_Abstract
|
25 |
+
{
|
26 |
+
|
27 |
+
const TIMEOUT = "timeout";
|
28 |
+
|
29 |
+
const ZLIB = "compress.zlib://";
|
30 |
+
|
31 |
+
private $options = array();
|
32 |
+
|
33 |
+
private $trappedErrorNumber;
|
34 |
+
|
35 |
+
private $trappedErrorString;
|
36 |
+
|
37 |
+
private static $DEFAULT_HTTP_CONTEXT = array(
|
38 |
+
"follow_location" => 0,
|
39 |
+
"ignore_errors" => 1
|
40 |
+
);
|
41 |
+
|
42 |
+
private static $DEFAULT_SSL_CONTEXT = array(
|
43 |
+
"verify_peer" => true
|
44 |
+
);
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Execute an HTTP Request
|
48 |
+
*
|
49 |
+
* @param Google_HttpRequest $request
|
50 |
+
* the http request to be executed
|
51 |
+
* @return Google_HttpRequest http request with the response http code,
|
52 |
+
* response headers and response body filled in
|
53 |
+
* @throws Google_IO_Exception on curl or IO error
|
54 |
+
*/
|
55 |
+
public function executeRequest(Google_Http_Request $request)
|
56 |
+
{
|
57 |
+
$default_options = stream_context_get_options(stream_context_get_default());
|
58 |
+
$requestHttpContext = array_key_exists('http', $default_options) ? $default_options['http'] : array();
|
59 |
+
if ($request->getPostBody()) {
|
60 |
+
$requestHttpContext["content"] = $request->getPostBody();
|
61 |
+
}
|
62 |
+
$requestHeaders = $request->getRequestHeaders();
|
63 |
+
if ($requestHeaders && is_array($requestHeaders)) {
|
64 |
+
$headers = "";
|
65 |
+
foreach ($requestHeaders as $k => $v) {
|
66 |
+
$headers .= "$k: $v\r\n";
|
67 |
+
}
|
68 |
+
$requestHttpContext["header"] = $headers;
|
69 |
+
}
|
70 |
+
$requestHttpContext["method"] = $request->getRequestMethod();
|
71 |
+
$requestHttpContext["user_agent"] = $request->getUserAgent();
|
72 |
+
$requestSslContext = array_key_exists('ssl', $default_options) ? $default_options['ssl'] : array();
|
73 |
+
if (! array_key_exists("cafile", $requestSslContext)) {
|
74 |
+
$requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
|
75 |
+
}
|
76 |
+
$options = array(
|
77 |
+
"http" => array_merge(self::$DEFAULT_HTTP_CONTEXT, $requestHttpContext),
|
78 |
+
"ssl" => array_merge(self::$DEFAULT_SSL_CONTEXT, $requestSslContext)
|
79 |
+
);
|
80 |
+
$context = stream_context_create($options);
|
81 |
+
$url = $request->getUrl();
|
82 |
+
if ($request->canGzip()) {
|
83 |
+
$url = self::ZLIB . $url;
|
84 |
+
}
|
85 |
+
$this->client->getLogger()->debug('Stream request', array(
|
86 |
+
'url' => $url,
|
87 |
+
'method' => $request->getRequestMethod(),
|
88 |
+
'headers' => $requestHeaders,
|
89 |
+
'body' => $request->getPostBody()
|
90 |
+
));
|
91 |
+
// We are trapping any thrown errors in this method only and
|
92 |
+
// throwing an exception.
|
93 |
+
$this->trappedErrorNumber = null;
|
94 |
+
$this->trappedErrorString = null;
|
95 |
+
// START - error trap.
|
96 |
+
set_error_handler(array(
|
97 |
+
$this,
|
98 |
+
'trapError'
|
99 |
+
));
|
100 |
+
$fh = fopen($url, 'r', false, $context);
|
101 |
+
restore_error_handler();
|
102 |
+
// END - error trap.
|
103 |
+
if ($this->trappedErrorNumber) {
|
104 |
+
$error = sprintf("HTTP Error: Unable to connect: '%s'", $this->trappedErrorString);
|
105 |
+
$this->client->getLogger()->error('Stream ' . $error);
|
106 |
+
throw new Google_IO_Exception($error, $this->trappedErrorNumber);
|
107 |
+
}
|
108 |
+
$response_data = false;
|
109 |
+
$respHttpCode = self::UNKNOWN_CODE;
|
110 |
+
if ($fh) {
|
111 |
+
if (isset($this->options[self::TIMEOUT])) {
|
112 |
+
stream_set_timeout($fh, $this->options[self::TIMEOUT]);
|
113 |
+
}
|
114 |
+
$response_data = stream_get_contents($fh);
|
115 |
+
fclose($fh);
|
116 |
+
$respHttpCode = $this->getHttpResponseCode($http_response_header);
|
117 |
+
}
|
118 |
+
if (false === $response_data) {
|
119 |
+
$error = sprintf("HTTP Error: Unable to connect: '%s'", $respHttpCode);
|
120 |
+
$this->client->getLogger()->error('Stream ' . $error);
|
121 |
+
throw new Google_IO_Exception($error, $respHttpCode);
|
122 |
+
}
|
123 |
+
$responseHeaders = $this->getHttpResponseHeaders($http_response_header);
|
124 |
+
$this->client->getLogger()->debug('Stream response', array(
|
125 |
+
'code' => $respHttpCode,
|
126 |
+
'headers' => $responseHeaders,
|
127 |
+
'body' => $response_data
|
128 |
+
));
|
129 |
+
return array(
|
130 |
+
$response_data,
|
131 |
+
$responseHeaders,
|
132 |
+
$respHttpCode
|
133 |
+
);
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Set options that update the transport implementation's behavior.
|
138 |
+
*
|
139 |
+
* @param
|
140 |
+
* $options
|
141 |
+
*/
|
142 |
+
public function setOptions($options)
|
143 |
+
{
|
144 |
+
$this->options = $options + $this->options;
|
145 |
+
}
|
146 |
+
|
147 |
+
/**
|
148 |
+
* Method to handle errors, used for error handling around
|
149 |
+
* stream connection methods.
|
150 |
+
*/
|
151 |
+
public function trapError($errno, $errstr)
|
152 |
+
{
|
153 |
+
$this->trappedErrorNumber = $errno;
|
154 |
+
$this->trappedErrorString = $errstr;
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Set the maximum request time in seconds.
|
159 |
+
*
|
160 |
+
* @param $timeout in
|
161 |
+
* seconds
|
162 |
+
*/
|
163 |
+
public function setTimeout($timeout)
|
164 |
+
{
|
165 |
+
$this->options[self::TIMEOUT] = $timeout;
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Get the maximum request time in seconds.
|
170 |
+
*
|
171 |
+
* @return timeout in seconds
|
172 |
+
*/
|
173 |
+
public function getTimeout()
|
174 |
+
{
|
175 |
+
return $this->options[self::TIMEOUT];
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* Test for the presence of a cURL header processing bug
|
180 |
+
*
|
181 |
+
* {@inheritDoc}
|
182 |
+
*
|
183 |
+
* @return boolean
|
184 |
+
*/
|
185 |
+
protected function needsQuirk()
|
186 |
+
{
|
187 |
+
return false;
|
188 |
+
}
|
189 |
+
|
190 |
+
protected function getHttpResponseCode($response_headers)
|
191 |
+
{
|
192 |
+
$header_count = count($response_headers);
|
193 |
+
for ($i = 0; $i < $header_count; $i ++) {
|
194 |
+
$header = $response_headers[$i];
|
195 |
+
if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) {
|
196 |
+
$response = explode(' ', $header);
|
197 |
+
return $response[1];
|
198 |
+
}
|
199 |
+
}
|
200 |
+
return self::UNKNOWN_CODE;
|
201 |
+
}
|
202 |
}
|
tools/src/Google/Logger/Abstract.php
CHANGED
@@ -1,410 +1,410 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Abstract logging class based on the PSR-3 standard.
|
21 |
-
*
|
22 |
-
* NOTE: We don't implement `Psr\Log\LoggerInterface` because we need to
|
23 |
-
* maintain PHP 5.2 support.
|
24 |
-
*
|
25 |
-
* @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
|
26 |
-
*/
|
27 |
-
abstract class Google_Logger_Abstract
|
28 |
-
{
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Default log format
|
32 |
-
*/
|
33 |
-
const DEFAULT_LOG_FORMAT = "[%datetime%] %level%: %message% %context%\n";
|
34 |
-
|
35 |
-
/**
|
36 |
-
* Default date format
|
37 |
-
*
|
38 |
-
* Example: 16/Nov/2014:03:26:16 -0500
|
39 |
-
*/
|
40 |
-
const DEFAULT_DATE_FORMAT = 'd/M/Y:H:i:s O';
|
41 |
-
|
42 |
-
/**
|
43 |
-
* System is unusable
|
44 |
-
*/
|
45 |
-
const EMERGENCY = 'emergency';
|
46 |
-
|
47 |
-
/**
|
48 |
-
* Action must be taken immediately
|
49 |
-
*
|
50 |
-
* Example: Entire website down, database unavailable, etc. This should
|
51 |
-
* trigger the SMS alerts and wake you up.
|
52 |
-
*/
|
53 |
-
const ALERT = 'alert';
|
54 |
-
|
55 |
-
/**
|
56 |
-
* Critical conditions
|
57 |
-
*
|
58 |
-
* Example: Application component unavailable, unexpected exception.
|
59 |
-
*/
|
60 |
-
const CRITICAL = 'critical';
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Runtime errors that do not require immediate action but should typically
|
64 |
-
* be logged and monitored.
|
65 |
-
*/
|
66 |
-
const ERROR = 'error';
|
67 |
-
|
68 |
-
/**
|
69 |
-
* Exceptional occurrences that are not errors.
|
70 |
-
*
|
71 |
-
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
72 |
-
* that are not necessarily wrong.
|
73 |
-
*/
|
74 |
-
const WARNING = 'warning';
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Normal but significant events.
|
78 |
-
*/
|
79 |
-
const NOTICE = 'notice';
|
80 |
-
|
81 |
-
/**
|
82 |
-
* Interesting events.
|
83 |
-
*
|
84 |
-
* Example: User logs in, SQL logs.
|
85 |
-
*/
|
86 |
-
const INFO = 'info';
|
87 |
-
|
88 |
-
/**
|
89 |
-
* Detailed debug information.
|
90 |
-
*/
|
91 |
-
const DEBUG = 'debug';
|
92 |
-
|
93 |
-
/**
|
94 |
-
*
|
95 |
-
* @var array $levels Logging levels
|
96 |
-
*/
|
97 |
-
protected static $levels = array(
|
98 |
-
self::EMERGENCY => 600,
|
99 |
-
self::ALERT => 550,
|
100 |
-
self::CRITICAL => 500,
|
101 |
-
self::ERROR => 400,
|
102 |
-
self::WARNING => 300,
|
103 |
-
self::NOTICE => 250,
|
104 |
-
self::INFO => 200,
|
105 |
-
self::DEBUG => 100
|
106 |
-
);
|
107 |
-
|
108 |
-
/**
|
109 |
-
*
|
110 |
-
* @var integer $level The minimum logging level
|
111 |
-
*/
|
112 |
-
protected $level = self::DEBUG;
|
113 |
-
|
114 |
-
/**
|
115 |
-
*
|
116 |
-
* @var string $logFormat The current log format
|
117 |
-
*/
|
118 |
-
protected $logFormat = self::DEFAULT_LOG_FORMAT;
|
119 |
-
|
120 |
-
/**
|
121 |
-
*
|
122 |
-
* @var string $dateFormat The current date format
|
123 |
-
*/
|
124 |
-
protected $dateFormat = self::DEFAULT_DATE_FORMAT;
|
125 |
-
|
126 |
-
/**
|
127 |
-
*
|
128 |
-
* @var boolean $allowNewLines If newlines are allowed
|
129 |
-
*/
|
130 |
-
protected $allowNewLines = false;
|
131 |
-
|
132 |
-
/**
|
133 |
-
*
|
134 |
-
* @param Google_Client $client
|
135 |
-
* The current Google client
|
136 |
-
*/
|
137 |
-
public function __construct(Google_Client $client)
|
138 |
-
{
|
139 |
-
$this->setLevel($client->getClassConfig('Google_Logger_Abstract', 'level'));
|
140 |
-
$format = $client->getClassConfig('Google_Logger_Abstract', 'log_format');
|
141 |
-
$this->logFormat = $format ? $format : self::DEFAULT_LOG_FORMAT;
|
142 |
-
$format = $client->getClassConfig('Google_Logger_Abstract', 'date_format');
|
143 |
-
$this->dateFormat = $format ? $format : self::DEFAULT_DATE_FORMAT;
|
144 |
-
$this->allowNewLines = (bool) $client->getClassConfig('Google_Logger_Abstract', 'allow_newlines');
|
145 |
-
}
|
146 |
-
|
147 |
-
/**
|
148 |
-
* Sets the minimum logging level that this logger handles.
|
149 |
-
*
|
150 |
-
* @param integer $level
|
151 |
-
*/
|
152 |
-
public function setLevel($level)
|
153 |
-
{
|
154 |
-
$this->level = $this->normalizeLevel($level);
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Checks if the logger should handle messages at the provided level.
|
159 |
-
*
|
160 |
-
* @param integer $level
|
161 |
-
* @return boolean
|
162 |
-
*/
|
163 |
-
public function shouldHandle($level)
|
164 |
-
{
|
165 |
-
return $this->normalizeLevel($level) >= $this->level;
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* System is unusable.
|
170 |
-
*
|
171 |
-
* @param string $message
|
172 |
-
* The log message
|
173 |
-
* @param array $context
|
174 |
-
* The log context
|
175 |
-
*/
|
176 |
-
public function emergency($message, array $context = array())
|
177 |
-
{
|
178 |
-
$this->log(self::EMERGENCY, $message, $context);
|
179 |
-
}
|
180 |
-
|
181 |
-
/**
|
182 |
-
* Action must be taken immediately.
|
183 |
-
*
|
184 |
-
* Example: Entire website down, database unavailable, etc. This should
|
185 |
-
* trigger the SMS alerts and wake you up.
|
186 |
-
*
|
187 |
-
* @param string $message
|
188 |
-
* The log message
|
189 |
-
* @param array $context
|
190 |
-
* The log context
|
191 |
-
*/
|
192 |
-
public function alert($message, array $context = array())
|
193 |
-
{
|
194 |
-
$this->log(self::ALERT, $message, $context);
|
195 |
-
}
|
196 |
-
|
197 |
-
/**
|
198 |
-
* Critical conditions.
|
199 |
-
*
|
200 |
-
* Example: Application component unavailable, unexpected exception.
|
201 |
-
*
|
202 |
-
* @param string $message
|
203 |
-
* The log message
|
204 |
-
* @param array $context
|
205 |
-
* The log context
|
206 |
-
*/
|
207 |
-
public function critical($message, array $context = array())
|
208 |
-
{
|
209 |
-
$this->log(self::CRITICAL, $message, $context);
|
210 |
-
}
|
211 |
-
|
212 |
-
/**
|
213 |
-
* Runtime errors that do not require immediate action but should typically
|
214 |
-
* be logged and monitored.
|
215 |
-
*
|
216 |
-
* @param string $message
|
217 |
-
* The log message
|
218 |
-
* @param array $context
|
219 |
-
* The log context
|
220 |
-
*/
|
221 |
-
public function error($message, array $context = array())
|
222 |
-
{
|
223 |
-
$this->log(self::ERROR, $message, $context);
|
224 |
-
}
|
225 |
-
|
226 |
-
/**
|
227 |
-
* Exceptional occurrences that are not errors.
|
228 |
-
*
|
229 |
-
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
230 |
-
* that are not necessarily wrong.
|
231 |
-
*
|
232 |
-
* @param string $message
|
233 |
-
* The log message
|
234 |
-
* @param array $context
|
235 |
-
* The log context
|
236 |
-
*/
|
237 |
-
public function warning($message, array $context = array())
|
238 |
-
{
|
239 |
-
$this->log(self::WARNING, $message, $context);
|
240 |
-
}
|
241 |
-
|
242 |
-
/**
|
243 |
-
* Normal but significant events.
|
244 |
-
*
|
245 |
-
* @param string $message
|
246 |
-
* The log message
|
247 |
-
* @param array $context
|
248 |
-
* The log context
|
249 |
-
*/
|
250 |
-
public function notice($message, array $context = array())
|
251 |
-
{
|
252 |
-
$this->log(self::NOTICE, $message, $context);
|
253 |
-
}
|
254 |
-
|
255 |
-
/**
|
256 |
-
* Interesting events.
|
257 |
-
*
|
258 |
-
* Example: User logs in, SQL logs.
|
259 |
-
*
|
260 |
-
* @param string $message
|
261 |
-
* The log message
|
262 |
-
* @param array $context
|
263 |
-
* The log context
|
264 |
-
*/
|
265 |
-
public function info($message, array $context = array())
|
266 |
-
{
|
267 |
-
$this->log(self::INFO, $message, $context);
|
268 |
-
}
|
269 |
-
|
270 |
-
/**
|
271 |
-
* Detailed debug information.
|
272 |
-
*
|
273 |
-
* @param string $message
|
274 |
-
* The log message
|
275 |
-
* @param array $context
|
276 |
-
* The log context
|
277 |
-
*/
|
278 |
-
public function debug($message, array $context = array())
|
279 |
-
{
|
280 |
-
$this->log(self::DEBUG, $message, $context);
|
281 |
-
}
|
282 |
-
|
283 |
-
/**
|
284 |
-
* Logs with an arbitrary level.
|
285 |
-
*
|
286 |
-
* @param mixed $level
|
287 |
-
* The log level
|
288 |
-
* @param string $message
|
289 |
-
* The log message
|
290 |
-
* @param array $context
|
291 |
-
* The log context
|
292 |
-
*/
|
293 |
-
public function log($level, $message, array $context = array())
|
294 |
-
{
|
295 |
-
if (! $this->shouldHandle($level)) {
|
296 |
-
return false;
|
297 |
-
}
|
298 |
-
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
299 |
-
$message = $this->interpolate(array(
|
300 |
-
'message' => $message,
|
301 |
-
'context' => $context,
|
302 |
-
'level' => strtoupper($levelName),
|
303 |
-
'datetime' => new DateTime()
|
304 |
-
));
|
305 |
-
$this->write($message);
|
306 |
-
}
|
307 |
-
|
308 |
-
/**
|
309 |
-
* Interpolates log variables into the defined log format.
|
310 |
-
*
|
311 |
-
* @param array $variables
|
312 |
-
* The log variables.
|
313 |
-
* @return string
|
314 |
-
*/
|
315 |
-
protected function interpolate(array $variables = array())
|
316 |
-
{
|
317 |
-
$template = $this->logFormat;
|
318 |
-
if (! $variables['context']) {
|
319 |
-
$template = str_replace('%context%', '', $template);
|
320 |
-
unset($variables['context']);
|
321 |
-
} else {
|
322 |
-
$this->reverseJsonInContext($variables['context']);
|
323 |
-
}
|
324 |
-
foreach ($variables as $key => $value) {
|
325 |
-
if (strpos($template, '%' . $key . '%') !== false) {
|
326 |
-
$template = str_replace('%' . $key . '%', $this->export($value), $template);
|
327 |
-
}
|
328 |
-
}
|
329 |
-
return $template;
|
330 |
-
}
|
331 |
-
|
332 |
-
/**
|
333 |
-
* Reverses JSON encoded PHP arrays and objects so that they log better.
|
334 |
-
*
|
335 |
-
* @param array $context
|
336 |
-
* The log context
|
337 |
-
*/
|
338 |
-
protected function reverseJsonInContext(array &$context)
|
339 |
-
{
|
340 |
-
if (! $context) {
|
341 |
-
return;
|
342 |
-
}
|
343 |
-
foreach ($context as $key => $val) {
|
344 |
-
if (! $val || ! is_string($val) || ! ($val[0] == '{' || $val[0] == '[')) {
|
345 |
-
continue;
|
346 |
-
}
|
347 |
-
$json = @json_decode($val);
|
348 |
-
if (is_object($json) || is_array($json)) {
|
349 |
-
$context[$key] = $json;
|
350 |
-
}
|
351 |
-
}
|
352 |
-
}
|
353 |
-
|
354 |
-
/**
|
355 |
-
* Exports a PHP value for logging to a string.
|
356 |
-
*
|
357 |
-
* @param mixed $value
|
358 |
-
* The value to
|
359 |
-
*/
|
360 |
-
protected function export($value)
|
361 |
-
{
|
362 |
-
if (is_string($value)) {
|
363 |
-
if ($this->allowNewLines) {
|
364 |
-
return $value;
|
365 |
-
}
|
366 |
-
return preg_replace('/[\r\n]+/', ' ', $value);
|
367 |
-
}
|
368 |
-
if (is_resource($value)) {
|
369 |
-
return sprintf('resource(%d) of type (%s)', $value, get_resource_type($value));
|
370 |
-
}
|
371 |
-
if ($value instanceof DateTime) {
|
372 |
-
return $value->format($this->dateFormat);
|
373 |
-
}
|
374 |
-
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
|
375 |
-
$options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
|
376 |
-
if ($this->allowNewLines) {
|
377 |
-
$options |= JSON_PRETTY_PRINT;
|
378 |
-
}
|
379 |
-
return @json_encode($value, $options);
|
380 |
-
}
|
381 |
-
return str_replace('\\/', '/', @json_encode($value));
|
382 |
-
}
|
383 |
-
|
384 |
-
/**
|
385 |
-
* Converts a given log level to the integer form.
|
386 |
-
*
|
387 |
-
* @param mixed $level
|
388 |
-
* The logging level
|
389 |
-
* @return integer $level The normalized level
|
390 |
-
* @throws Google_Logger_Exception If $level is invalid
|
391 |
-
*/
|
392 |
-
protected function normalizeLevel($level)
|
393 |
-
{
|
394 |
-
if (is_int($level) && array_search($level, self::$levels) !== false) {
|
395 |
-
return $level;
|
396 |
-
}
|
397 |
-
if (is_string($level) && isset(self::$levels[$level])) {
|
398 |
-
return self::$levels[$level];
|
399 |
-
}
|
400 |
-
throw new Google_Logger_Exception(sprintf("Unknown LogLevel: '%s'", $level));
|
401 |
-
}
|
402 |
-
|
403 |
-
/**
|
404 |
-
* Writes a message to the current log implementation.
|
405 |
-
*
|
406 |
-
* @param string $message
|
407 |
-
* The message
|
408 |
-
*/
|
409 |
-
abstract protected function write($message);
|
410 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Abstract logging class based on the PSR-3 standard.
|
21 |
+
*
|
22 |
+
* NOTE: We don't implement `Psr\Log\LoggerInterface` because we need to
|
23 |
+
* maintain PHP 5.2 support.
|
24 |
+
*
|
25 |
+
* @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
|
26 |
+
*/
|
27 |
+
abstract class Google_Logger_Abstract
|
28 |
+
{
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Default log format
|
32 |
+
*/
|
33 |
+
const DEFAULT_LOG_FORMAT = "[%datetime%] %level%: %message% %context%\n";
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Default date format
|
37 |
+
*
|
38 |
+
* Example: 16/Nov/2014:03:26:16 -0500
|
39 |
+
*/
|
40 |
+
const DEFAULT_DATE_FORMAT = 'd/M/Y:H:i:s O';
|
41 |
+
|
42 |
+
/**
|
43 |
+
* System is unusable
|
44 |
+
*/
|
45 |
+
const EMERGENCY = 'emergency';
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Action must be taken immediately
|
49 |
+
*
|
50 |
+
* Example: Entire website down, database unavailable, etc. This should
|
51 |
+
* trigger the SMS alerts and wake you up.
|
52 |
+
*/
|
53 |
+
const ALERT = 'alert';
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Critical conditions
|
57 |
+
*
|
58 |
+
* Example: Application component unavailable, unexpected exception.
|
59 |
+
*/
|
60 |
+
const CRITICAL = 'critical';
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Runtime errors that do not require immediate action but should typically
|
64 |
+
* be logged and monitored.
|
65 |
+
*/
|
66 |
+
const ERROR = 'error';
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Exceptional occurrences that are not errors.
|
70 |
+
*
|
71 |
+
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
72 |
+
* that are not necessarily wrong.
|
73 |
+
*/
|
74 |
+
const WARNING = 'warning';
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Normal but significant events.
|
78 |
+
*/
|
79 |
+
const NOTICE = 'notice';
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Interesting events.
|
83 |
+
*
|
84 |
+
* Example: User logs in, SQL logs.
|
85 |
+
*/
|
86 |
+
const INFO = 'info';
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Detailed debug information.
|
90 |
+
*/
|
91 |
+
const DEBUG = 'debug';
|
92 |
+
|
93 |
+
/**
|
94 |
+
*
|
95 |
+
* @var array $levels Logging levels
|
96 |
+
*/
|
97 |
+
protected static $levels = array(
|
98 |
+
self::EMERGENCY => 600,
|
99 |
+
self::ALERT => 550,
|
100 |
+
self::CRITICAL => 500,
|
101 |
+
self::ERROR => 400,
|
102 |
+
self::WARNING => 300,
|
103 |
+
self::NOTICE => 250,
|
104 |
+
self::INFO => 200,
|
105 |
+
self::DEBUG => 100
|
106 |
+
);
|
107 |
+
|
108 |
+
/**
|
109 |
+
*
|
110 |
+
* @var integer $level The minimum logging level
|
111 |
+
*/
|
112 |
+
protected $level = self::DEBUG;
|
113 |
+
|
114 |
+
/**
|
115 |
+
*
|
116 |
+
* @var string $logFormat The current log format
|
117 |
+
*/
|
118 |
+
protected $logFormat = self::DEFAULT_LOG_FORMAT;
|
119 |
+
|
120 |
+
/**
|
121 |
+
*
|
122 |
+
* @var string $dateFormat The current date format
|
123 |
+
*/
|
124 |
+
protected $dateFormat = self::DEFAULT_DATE_FORMAT;
|
125 |
+
|
126 |
+
/**
|
127 |
+
*
|
128 |
+
* @var boolean $allowNewLines If newlines are allowed
|
129 |
+
*/
|
130 |
+
protected $allowNewLines = false;
|
131 |
+
|
132 |
+
/**
|
133 |
+
*
|
134 |
+
* @param Google_Client $client
|
135 |
+
* The current Google client
|
136 |
+
*/
|
137 |
+
public function __construct(Google_Client $client)
|
138 |
+
{
|
139 |
+
$this->setLevel($client->getClassConfig('Google_Logger_Abstract', 'level'));
|
140 |
+
$format = $client->getClassConfig('Google_Logger_Abstract', 'log_format');
|
141 |
+
$this->logFormat = $format ? $format : self::DEFAULT_LOG_FORMAT;
|
142 |
+
$format = $client->getClassConfig('Google_Logger_Abstract', 'date_format');
|
143 |
+
$this->dateFormat = $format ? $format : self::DEFAULT_DATE_FORMAT;
|
144 |
+
$this->allowNewLines = (bool) $client->getClassConfig('Google_Logger_Abstract', 'allow_newlines');
|
145 |
+
}
|
146 |
+
|
147 |
+
/**
|
148 |
+
* Sets the minimum logging level that this logger handles.
|
149 |
+
*
|
150 |
+
* @param integer $level
|
151 |
+
*/
|
152 |
+
public function setLevel($level)
|
153 |
+
{
|
154 |
+
$this->level = $this->normalizeLevel($level);
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Checks if the logger should handle messages at the provided level.
|
159 |
+
*
|
160 |
+
* @param integer $level
|
161 |
+
* @return boolean
|
162 |
+
*/
|
163 |
+
public function shouldHandle($level)
|
164 |
+
{
|
165 |
+
return $this->normalizeLevel($level) >= $this->level;
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* System is unusable.
|
170 |
+
*
|
171 |
+
* @param string $message
|
172 |
+
* The log message
|
173 |
+
* @param array $context
|
174 |
+
* The log context
|
175 |
+
*/
|
176 |
+
public function emergency($message, array $context = array())
|
177 |
+
{
|
178 |
+
$this->log(self::EMERGENCY, $message, $context);
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* Action must be taken immediately.
|
183 |
+
*
|
184 |
+
* Example: Entire website down, database unavailable, etc. This should
|
185 |
+
* trigger the SMS alerts and wake you up.
|
186 |
+
*
|
187 |
+
* @param string $message
|
188 |
+
* The log message
|
189 |
+
* @param array $context
|
190 |
+
* The log context
|
191 |
+
*/
|
192 |
+
public function alert($message, array $context = array())
|
193 |
+
{
|
194 |
+
$this->log(self::ALERT, $message, $context);
|
195 |
+
}
|
196 |
+
|
197 |
+
/**
|
198 |
+
* Critical conditions.
|
199 |
+
*
|
200 |
+
* Example: Application component unavailable, unexpected exception.
|
201 |
+
*
|
202 |
+
* @param string $message
|
203 |
+
* The log message
|
204 |
+
* @param array $context
|
205 |
+
* The log context
|
206 |
+
*/
|
207 |
+
public function critical($message, array $context = array())
|
208 |
+
{
|
209 |
+
$this->log(self::CRITICAL, $message, $context);
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Runtime errors that do not require immediate action but should typically
|
214 |
+
* be logged and monitored.
|
215 |
+
*
|
216 |
+
* @param string $message
|
217 |
+
* The log message
|
218 |
+
* @param array $context
|
219 |
+
* The log context
|
220 |
+
*/
|
221 |
+
public function error($message, array $context = array())
|
222 |
+
{
|
223 |
+
$this->log(self::ERROR, $message, $context);
|
224 |
+
}
|
225 |
+
|
226 |
+
/**
|
227 |
+
* Exceptional occurrences that are not errors.
|
228 |
+
*
|
229 |
+
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
230 |
+
* that are not necessarily wrong.
|
231 |
+
*
|
232 |
+
* @param string $message
|
233 |
+
* The log message
|
234 |
+
* @param array $context
|
235 |
+
* The log context
|
236 |
+
*/
|
237 |
+
public function warning($message, array $context = array())
|
238 |
+
{
|
239 |
+
$this->log(self::WARNING, $message, $context);
|
240 |
+
}
|
241 |
+
|
242 |
+
/**
|
243 |
+
* Normal but significant events.
|
244 |
+
*
|
245 |
+
* @param string $message
|
246 |
+
* The log message
|
247 |
+
* @param array $context
|
248 |
+
* The log context
|
249 |
+
*/
|
250 |
+
public function notice($message, array $context = array())
|
251 |
+
{
|
252 |
+
$this->log(self::NOTICE, $message, $context);
|
253 |
+
}
|
254 |
+
|
255 |
+
/**
|
256 |
+
* Interesting events.
|
257 |
+
*
|
258 |
+
* Example: User logs in, SQL logs.
|
259 |
+
*
|
260 |
+
* @param string $message
|
261 |
+
* The log message
|
262 |
+
* @param array $context
|
263 |
+
* The log context
|
264 |
+
*/
|
265 |
+
public function info($message, array $context = array())
|
266 |
+
{
|
267 |
+
$this->log(self::INFO, $message, $context);
|
268 |
+
}
|
269 |
+
|
270 |
+
/**
|
271 |
+
* Detailed debug information.
|
272 |
+
*
|
273 |
+
* @param string $message
|
274 |
+
* The log message
|
275 |
+
* @param array $context
|
276 |
+
* The log context
|
277 |
+
*/
|
278 |
+
public function debug($message, array $context = array())
|
279 |
+
{
|
280 |
+
$this->log(self::DEBUG, $message, $context);
|
281 |
+
}
|
282 |
+
|
283 |
+
/**
|
284 |
+
* Logs with an arbitrary level.
|
285 |
+
*
|
286 |
+
* @param mixed $level
|
287 |
+
* The log level
|
288 |
+
* @param string $message
|
289 |
+
* The log message
|
290 |
+
* @param array $context
|
291 |
+
* The log context
|
292 |
+
*/
|
293 |
+
public function log($level, $message, array $context = array())
|
294 |
+
{
|
295 |
+
if (! $this->shouldHandle($level)) {
|
296 |
+
return false;
|
297 |
+
}
|
298 |
+
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
299 |
+
$message = $this->interpolate(array(
|
300 |
+
'message' => $message,
|
301 |
+
'context' => $context,
|
302 |
+
'level' => strtoupper($levelName),
|
303 |
+
'datetime' => new DateTime()
|
304 |
+
));
|
305 |
+
$this->write($message);
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
* Interpolates log variables into the defined log format.
|
310 |
+
*
|
311 |
+
* @param array $variables
|
312 |
+
* The log variables.
|
313 |
+
* @return string
|
314 |
+
*/
|
315 |
+
protected function interpolate(array $variables = array())
|
316 |
+
{
|
317 |
+
$template = $this->logFormat;
|
318 |
+
if (! $variables['context']) {
|
319 |
+
$template = str_replace('%context%', '', $template);
|
320 |
+
unset($variables['context']);
|
321 |
+
} else {
|
322 |
+
$this->reverseJsonInContext($variables['context']);
|
323 |
+
}
|
324 |
+
foreach ($variables as $key => $value) {
|
325 |
+
if (strpos($template, '%' . $key . '%') !== false) {
|
326 |
+
$template = str_replace('%' . $key . '%', $this->export($value), $template);
|
327 |
+
}
|
328 |
+
}
|
329 |
+
return $template;
|
330 |
+
}
|
331 |
+
|
332 |
+
/**
|
333 |
+
* Reverses JSON encoded PHP arrays and objects so that they log better.
|
334 |
+
*
|
335 |
+
* @param array $context
|
336 |
+
* The log context
|
337 |
+
*/
|
338 |
+
protected function reverseJsonInContext(array &$context)
|
339 |
+
{
|
340 |
+
if (! $context) {
|
341 |
+
return;
|
342 |
+
}
|
343 |
+
foreach ($context as $key => $val) {
|
344 |
+
if (! $val || ! is_string($val) || ! ($val[0] == '{' || $val[0] == '[')) {
|
345 |
+
continue;
|
346 |
+
}
|
347 |
+
$json = @json_decode($val);
|
348 |
+
if (is_object($json) || is_array($json)) {
|
349 |
+
$context[$key] = $json;
|
350 |
+
}
|
351 |
+
}
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* Exports a PHP value for logging to a string.
|
356 |
+
*
|
357 |
+
* @param mixed $value
|
358 |
+
* The value to
|
359 |
+
*/
|
360 |
+
protected function export($value)
|
361 |
+
{
|
362 |
+
if (is_string($value)) {
|
363 |
+
if ($this->allowNewLines) {
|
364 |
+
return $value;
|
365 |
+
}
|
366 |
+
return preg_replace('/[\r\n]+/', ' ', $value);
|
367 |
+
}
|
368 |
+
if (is_resource($value)) {
|
369 |
+
return sprintf('resource(%d) of type (%s)', $value, get_resource_type($value));
|
370 |
+
}
|
371 |
+
if ($value instanceof DateTime) {
|
372 |
+
return $value->format($this->dateFormat);
|
373 |
+
}
|
374 |
+
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
|
375 |
+
$options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
|
376 |
+
if ($this->allowNewLines) {
|
377 |
+
$options |= JSON_PRETTY_PRINT;
|
378 |
+
}
|
379 |
+
return @json_encode($value, $options);
|
380 |
+
}
|
381 |
+
return str_replace('\\/', '/', @json_encode($value));
|
382 |
+
}
|
383 |
+
|
384 |
+
/**
|
385 |
+
* Converts a given log level to the integer form.
|
386 |
+
*
|
387 |
+
* @param mixed $level
|
388 |
+
* The logging level
|
389 |
+
* @return integer $level The normalized level
|
390 |
+
* @throws Google_Logger_Exception If $level is invalid
|
391 |
+
*/
|
392 |
+
protected function normalizeLevel($level)
|
393 |
+
{
|
394 |
+
if (is_int($level) && array_search($level, self::$levels) !== false) {
|
395 |
+
return $level;
|
396 |
+
}
|
397 |
+
if (is_string($level) && isset(self::$levels[$level])) {
|
398 |
+
return self::$levels[$level];
|
399 |
+
}
|
400 |
+
throw new Google_Logger_Exception(sprintf("Unknown LogLevel: '%s'", $level));
|
401 |
+
}
|
402 |
+
|
403 |
+
/**
|
404 |
+
* Writes a message to the current log implementation.
|
405 |
+
*
|
406 |
+
* @param string $message
|
407 |
+
* The message
|
408 |
+
*/
|
409 |
+
abstract protected function write($message);
|
410 |
}
|
tools/src/Google/Logger/Exception.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
class Google_Logger_Exception extends Google_Exception
|
20 |
-
{
|
21 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
class Google_Logger_Exception extends Google_Exception
|
20 |
+
{
|
21 |
}
|
tools/src/Google/Logger/File.php
CHANGED
@@ -1,149 +1,149 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* File logging class based on the PSR-3 standard.
|
21 |
-
*
|
22 |
-
* This logger writes to a PHP stream resource.
|
23 |
-
*/
|
24 |
-
class Google_Logger_File extends Google_Logger_Abstract
|
25 |
-
{
|
26 |
-
|
27 |
-
/**
|
28 |
-
*
|
29 |
-
* @var string|resource $file Where logs are written
|
30 |
-
*/
|
31 |
-
private $file;
|
32 |
-
|
33 |
-
/**
|
34 |
-
*
|
35 |
-
* @var integer $mode The mode to use if the log file needs to be created
|
36 |
-
*/
|
37 |
-
private $mode = 0640;
|
38 |
-
|
39 |
-
/**
|
40 |
-
*
|
41 |
-
* @var boolean $lock If a lock should be attempted before writing to the log
|
42 |
-
*/
|
43 |
-
private $lock = false;
|
44 |
-
|
45 |
-
/**
|
46 |
-
*
|
47 |
-
* @var integer $trappedErrorNumber Trapped error number
|
48 |
-
*/
|
49 |
-
private $trappedErrorNumber;
|
50 |
-
|
51 |
-
/**
|
52 |
-
*
|
53 |
-
* @var string $trappedErrorString Trapped error string
|
54 |
-
*/
|
55 |
-
private $trappedErrorString;
|
56 |
-
|
57 |
-
/**
|
58 |
-
* @ERROR!!!
|
59 |
-
*/
|
60 |
-
public function __construct(Google_Client $client)
|
61 |
-
{
|
62 |
-
parent::__construct($client);
|
63 |
-
$file = $client->getClassConfig('Google_Logger_File', 'file');
|
64 |
-
if (! is_string($file) && ! is_resource($file)) {
|
65 |
-
throw new Google_Logger_Exception('File logger requires a filename or a valid file pointer');
|
66 |
-
}
|
67 |
-
$mode = $client->getClassConfig('Google_Logger_File', 'mode');
|
68 |
-
if (! $mode) {
|
69 |
-
$this->mode = $mode;
|
70 |
-
}
|
71 |
-
$this->lock = (bool) $client->getClassConfig('Google_Logger_File', 'lock');
|
72 |
-
$this->file = $file;
|
73 |
-
}
|
74 |
-
|
75 |
-
/**
|
76 |
-
* @ERROR!!!
|
77 |
-
*/
|
78 |
-
protected function write($message)
|
79 |
-
{
|
80 |
-
if (is_string($this->file)) {
|
81 |
-
$this->open();
|
82 |
-
} elseif (! is_resource($this->file)) {
|
83 |
-
throw new Google_Logger_Exception('File pointer is no longer available');
|
84 |
-
}
|
85 |
-
if ($this->lock) {
|
86 |
-
flock($this->file, LOCK_EX);
|
87 |
-
}
|
88 |
-
fwrite($this->file, (string) $message);
|
89 |
-
if ($this->lock) {
|
90 |
-
flock($this->file, LOCK_UN);
|
91 |
-
}
|
92 |
-
}
|
93 |
-
|
94 |
-
/**
|
95 |
-
* Opens the log for writing.
|
96 |
-
*
|
97 |
-
* @return resource
|
98 |
-
*/
|
99 |
-
private function open()
|
100 |
-
{
|
101 |
-
// Used for trapping `fopen()` errors.
|
102 |
-
$this->trappedErrorNumber = null;
|
103 |
-
$this->trappedErrorString = null;
|
104 |
-
$old = set_error_handler(array(
|
105 |
-
$this,
|
106 |
-
'trapError'
|
107 |
-
));
|
108 |
-
$needsChmod = ! file_exists($this->file);
|
109 |
-
$fh = fopen($this->file, 'a');
|
110 |
-
restore_error_handler();
|
111 |
-
// Handles trapped `fopen()` errors.
|
112 |
-
if ($this->trappedErrorNumber) {
|
113 |
-
throw new Google_Logger_Exception(sprintf("Logger Error: '%s'", $this->trappedErrorString), $this->trappedErrorNumber);
|
114 |
-
}
|
115 |
-
if ($needsChmod) {
|
116 |
-
@chmod($this->file, $this->mode & ~ umask());
|
117 |
-
}
|
118 |
-
return $this->file = $fh;
|
119 |
-
}
|
120 |
-
|
121 |
-
/**
|
122 |
-
* Closes the log stream resource.
|
123 |
-
*/
|
124 |
-
private function close()
|
125 |
-
{
|
126 |
-
if (is_resource($this->file)) {
|
127 |
-
fclose($this->file);
|
128 |
-
}
|
129 |
-
}
|
130 |
-
|
131 |
-
/**
|
132 |
-
* Traps `fopen()` errors.
|
133 |
-
*
|
134 |
-
* @param integer $errno
|
135 |
-
* The error number
|
136 |
-
* @param string $errstr
|
137 |
-
* The error string
|
138 |
-
*/
|
139 |
-
private function trapError($errno, $errstr)
|
140 |
-
{
|
141 |
-
$this->trappedErrorNumber = $errno;
|
142 |
-
$this->trappedErrorString = $errstr;
|
143 |
-
}
|
144 |
-
|
145 |
-
public function __destruct()
|
146 |
-
{
|
147 |
-
$this->close();
|
148 |
-
}
|
149 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* File logging class based on the PSR-3 standard.
|
21 |
+
*
|
22 |
+
* This logger writes to a PHP stream resource.
|
23 |
+
*/
|
24 |
+
class Google_Logger_File extends Google_Logger_Abstract
|
25 |
+
{
|
26 |
+
|
27 |
+
/**
|
28 |
+
*
|
29 |
+
* @var string|resource $file Where logs are written
|
30 |
+
*/
|
31 |
+
private $file;
|
32 |
+
|
33 |
+
/**
|
34 |
+
*
|
35 |
+
* @var integer $mode The mode to use if the log file needs to be created
|
36 |
+
*/
|
37 |
+
private $mode = 0640;
|
38 |
+
|
39 |
+
/**
|
40 |
+
*
|
41 |
+
* @var boolean $lock If a lock should be attempted before writing to the log
|
42 |
+
*/
|
43 |
+
private $lock = false;
|
44 |
+
|
45 |
+
/**
|
46 |
+
*
|
47 |
+
* @var integer $trappedErrorNumber Trapped error number
|
48 |
+
*/
|
49 |
+
private $trappedErrorNumber;
|
50 |
+
|
51 |
+
/**
|
52 |
+
*
|
53 |
+
* @var string $trappedErrorString Trapped error string
|
54 |
+
*/
|
55 |
+
private $trappedErrorString;
|
56 |
+
|
57 |
+
/**
|
58 |
+
* @ERROR!!!
|
59 |
+
*/
|
60 |
+
public function __construct(Google_Client $client)
|
61 |
+
{
|
62 |
+
parent::__construct($client);
|
63 |
+
$file = $client->getClassConfig('Google_Logger_File', 'file');
|
64 |
+
if (! is_string($file) && ! is_resource($file)) {
|
65 |
+
throw new Google_Logger_Exception('File logger requires a filename or a valid file pointer');
|
66 |
+
}
|
67 |
+
$mode = $client->getClassConfig('Google_Logger_File', 'mode');
|
68 |
+
if (! $mode) {
|
69 |
+
$this->mode = $mode;
|
70 |
+
}
|
71 |
+
$this->lock = (bool) $client->getClassConfig('Google_Logger_File', 'lock');
|
72 |
+
$this->file = $file;
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* @ERROR!!!
|
77 |
+
*/
|
78 |
+
protected function write($message)
|
79 |
+
{
|
80 |
+
if (is_string($this->file)) {
|
81 |
+
$this->open();
|
82 |
+
} elseif (! is_resource($this->file)) {
|
83 |
+
throw new Google_Logger_Exception('File pointer is no longer available');
|
84 |
+
}
|
85 |
+
if ($this->lock) {
|
86 |
+
flock($this->file, LOCK_EX);
|
87 |
+
}
|
88 |
+
fwrite($this->file, (string) $message);
|
89 |
+
if ($this->lock) {
|
90 |
+
flock($this->file, LOCK_UN);
|
91 |
+
}
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Opens the log for writing.
|
96 |
+
*
|
97 |
+
* @return resource
|
98 |
+
*/
|
99 |
+
private function open()
|
100 |
+
{
|
101 |
+
// Used for trapping `fopen()` errors.
|
102 |
+
$this->trappedErrorNumber = null;
|
103 |
+
$this->trappedErrorString = null;
|
104 |
+
$old = set_error_handler(array(
|
105 |
+
$this,
|
106 |
+
'trapError'
|
107 |
+
));
|
108 |
+
$needsChmod = ! file_exists($this->file);
|
109 |
+
$fh = fopen($this->file, 'a');
|
110 |
+
restore_error_handler();
|
111 |
+
// Handles trapped `fopen()` errors.
|
112 |
+
if ($this->trappedErrorNumber) {
|
113 |
+
throw new Google_Logger_Exception(sprintf("Logger Error: '%s'", $this->trappedErrorString), $this->trappedErrorNumber);
|
114 |
+
}
|
115 |
+
if ($needsChmod) {
|
116 |
+
@chmod($this->file, $this->mode & ~ umask());
|
117 |
+
}
|
118 |
+
return $this->file = $fh;
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Closes the log stream resource.
|
123 |
+
*/
|
124 |
+
private function close()
|
125 |
+
{
|
126 |
+
if (is_resource($this->file)) {
|
127 |
+
fclose($this->file);
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Traps `fopen()` errors.
|
133 |
+
*
|
134 |
+
* @param integer $errno
|
135 |
+
* The error number
|
136 |
+
* @param string $errstr
|
137 |
+
* The error string
|
138 |
+
*/
|
139 |
+
private function trapError($errno, $errstr)
|
140 |
+
{
|
141 |
+
$this->trappedErrorNumber = $errno;
|
142 |
+
$this->trappedErrorString = $errstr;
|
143 |
+
}
|
144 |
+
|
145 |
+
public function __destruct()
|
146 |
+
{
|
147 |
+
$this->close();
|
148 |
+
}
|
149 |
}
|
tools/src/Google/Logger/Null.php
CHANGED
@@ -1,40 +1,40 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Null logger based on the PSR-3 standard.
|
21 |
-
*
|
22 |
-
* This logger simply discards all messages.
|
23 |
-
*/
|
24 |
-
class Google_Logger_Null extends Google_Logger_Abstract
|
25 |
-
{
|
26 |
-
|
27 |
-
/**
|
28 |
-
* @ERROR!!!
|
29 |
-
*/
|
30 |
-
public function shouldHandle($level)
|
31 |
-
{
|
32 |
-
return false;
|
33 |
-
}
|
34 |
-
|
35 |
-
/**
|
36 |
-
* @ERROR!!!
|
37 |
-
*/
|
38 |
-
protected function write($message, array $context = array())
|
39 |
-
{}
|
40 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Null logger based on the PSR-3 standard.
|
21 |
+
*
|
22 |
+
* This logger simply discards all messages.
|
23 |
+
*/
|
24 |
+
class Google_Logger_Null extends Google_Logger_Abstract
|
25 |
+
{
|
26 |
+
|
27 |
+
/**
|
28 |
+
* @ERROR!!!
|
29 |
+
*/
|
30 |
+
public function shouldHandle($level)
|
31 |
+
{
|
32 |
+
return false;
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @ERROR!!!
|
37 |
+
*/
|
38 |
+
protected function write($message, array $context = array())
|
39 |
+
{}
|
40 |
}
|
tools/src/Google/Logger/Psr.php
CHANGED
@@ -1,93 +1,93 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Psr logging class based on the PSR-3 standard.
|
21 |
-
*
|
22 |
-
* This logger will delegate all logging to a PSR-3 compatible logger specified
|
23 |
-
* with the `Google_Logger_Psr::setLogger()` method.
|
24 |
-
*/
|
25 |
-
class Google_Logger_Psr extends Google_Logger_Abstract
|
26 |
-
{
|
27 |
-
|
28 |
-
/**
|
29 |
-
*
|
30 |
-
* @param Psr\Log\LoggerInterface $logger
|
31 |
-
* The PSR-3 logger
|
32 |
-
*/
|
33 |
-
private $logger;
|
34 |
-
|
35 |
-
/**
|
36 |
-
*
|
37 |
-
* @param Google_Client $client
|
38 |
-
* The current Google client
|
39 |
-
* @param Psr\Log\LoggerInterface $logger
|
40 |
-
* PSR-3 logger where logging will be delegated.
|
41 |
-
*/
|
42 |
-
public function __construct(Google_Client $client, /*Psr\Log\LoggerInterface*/ $logger = null)
|
43 |
-
{
|
44 |
-
parent::__construct($client);
|
45 |
-
if ($logger) {
|
46 |
-
$this->setLogger($logger);
|
47 |
-
}
|
48 |
-
}
|
49 |
-
|
50 |
-
/**
|
51 |
-
* Sets the PSR-3 logger where logging will be delegated.
|
52 |
-
*
|
53 |
-
* NOTE: The `$logger` should technically implement
|
54 |
-
* `Psr\Log\LoggerInterface`, but we don't explicitly require this so that
|
55 |
-
* we can be compatible with PHP 5.2.
|
56 |
-
*
|
57 |
-
* @param Psr\Log\LoggerInterface $logger
|
58 |
-
* The PSR-3 logger
|
59 |
-
*/
|
60 |
-
public function setLogger(/*Psr\Log\LoggerInterface*/ $logger)
|
61 |
-
{
|
62 |
-
$this->logger = $logger;
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* @ERROR!!!
|
67 |
-
*/
|
68 |
-
public function shouldHandle($level)
|
69 |
-
{
|
70 |
-
return isset($this->logger) && parent::shouldHandle($level);
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* @ERROR!!!
|
75 |
-
*/
|
76 |
-
public function log($level, $message, array $context = array())
|
77 |
-
{
|
78 |
-
if (! $this->shouldHandle($level)) {
|
79 |
-
return false;
|
80 |
-
}
|
81 |
-
if ($context) {
|
82 |
-
$this->reverseJsonInContext($context);
|
83 |
-
}
|
84 |
-
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
85 |
-
$this->logger->log($levelName, $message, $context);
|
86 |
-
}
|
87 |
-
|
88 |
-
/**
|
89 |
-
* @ERROR!!!
|
90 |
-
*/
|
91 |
-
protected function write($message, array $context = array())
|
92 |
-
{}
|
93 |
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
require_once realpath(dirname(__FILE__) . '/../../../autoload.php');
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Psr logging class based on the PSR-3 standard.
|
21 |
+
*
|
22 |
+
* This logger will delegate all logging to a PSR-3 compatible logger specified
|
23 |
+
* with the `Google_Logger_Psr::setLogger()` method.
|
24 |
+
*/
|
25 |
+
class Google_Logger_Psr extends Google_Logger_Abstract
|
26 |
+
{
|
27 |
+
|
28 |
+
/**
|
29 |
+
*
|
30 |
+
* @param Psr\Log\LoggerInterface $logger
|
31 |
+
* The PSR-3 logger
|
32 |
+
*/
|
33 |
+
private $logger;
|
34 |
+
|
35 |
+
/**
|
36 |
+
*
|
37 |
+
* @param Google_Client $client
|
38 |
+
* The current Google client
|
39 |
+
* @param Psr\Log\LoggerInterface $logger
|
40 |
+
* PSR-3 logger where logging will be delegated.
|
41 |
+
*/
|
42 |
+
public function __construct(Google_Client $client, /*Psr\Log\LoggerInterface*/ $logger = null)
|
43 |
+
{
|
44 |
+
parent::__construct($client);
|
45 |
+
if ($logger) {
|
46 |
+
$this->setLogger($logger);
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Sets the PSR-3 logger where logging will be delegated.
|
52 |
+
*
|
53 |
+
* NOTE: The `$logger` should technically implement
|
54 |
+
* `Psr\Log\LoggerInterface`, but we don't explicitly require this so that
|
55 |
+
* we can be compatible with PHP 5.2.
|
56 |
+
*
|
57 |
+
* @param Psr\Log\LoggerInterface $logger
|
58 |
+
* The PSR-3 logger
|
59 |
+
*/
|
60 |
+
public function setLogger(/*Psr\Log\LoggerInterface*/ $logger)
|
61 |
+
{
|
62 |
+
$this->logger = $logger;
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @ERROR!!!
|
67 |
+
*/
|
68 |
+
public function shouldHandle($level)
|
69 |
+
{
|
70 |
+
return isset($this->logger) && parent::shouldHandle($level);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* @ERROR!!!
|
75 |
+
*/
|
76 |
+
public function log($level, $message, array $context = array())
|
77 |
+
{
|
78 |
+
if (! $this->shouldHandle($level)) {
|
79 |
+
return false;
|
80 |
+
}
|
81 |
+
if ($context) {
|
82 |
+
$this->reverseJsonInContext($context);
|
83 |
+
}
|
84 |
+
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
85 |
+
$this->logger->log($levelName, $message, $context);
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* @ERROR!!!
|
90 |
+
*/
|
91 |
+
protected function write($message, array $context = array())
|
92 |
+
{}
|
93 |
}
|
tools/src/Google/Model.php
CHANGED
@@ -1,283 +1,283 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
* Copyright 2011 Google Inc.
|
5 |
-
*
|
6 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
-
* you may not use this file except in compliance with the License.
|
8 |
-
* You may obtain a copy of the License at
|
9 |
-
*
|
10 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
-
*
|
12 |
-
* Unless required by applicable law or agreed to in writing, software
|
13 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
-
* See the License for the specific language governing permissions and
|
16 |
-
* limitations under the License.
|
17 |
-
*/
|
18 |
-
/**
|
19 |
-
* This class defines attributes, valid values, and usage which is generated
|
20 |
-
* from a given json schema.
|
21 |
-
* http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5
|
22 |
-
*
|
23 |
-
* @author Chirag Shah <chirags@google.com>
|
24 |
-
*
|
25 |
-
*/
|
26 |
-
class Google_Model implements ArrayAccess
|
27 |
-
{
|
28 |
-
|
29 |
-
protected $internal_gapi_mappings = array();
|
30 |
-
|
31 |
-
protected $modelData = array();
|
32 |
-
|
33 |
-
protected $processed = array();
|
34 |
-
|
35 |
-
/**
|
36 |
-
* Polymorphic - accepts a variable number of arguments dependent
|
37 |
-
* on the type of the model subclass.
|
38 |
-
*/
|
39 |
-
final public function __construct()
|
40 |
-
{
|
41 |
-
if (func_num_args() == 1 && is_array(func_get_arg(0))) {
|
42 |
-
// Initialize the model with the array's contents.
|
43 |
-
$array = func_get_arg(0);
|
44 |
-
$this->mapTypes($array);
|
45 |
-
}
|
46 |
-
$this->gapiInit();
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Getter that handles passthrough access to the data array, and lazy object creation.
|
51 |
-
*
|
52 |
-
* @param string $key
|
53 |
-
* Property name.
|
54 |
-
* @return mixed The value if any, or null.
|
55 |
-
*/
|
56 |
-
public function __get($key)
|
57 |
-
{
|
58 |
-
$keyTypeName = $this->keyType($key);
|
59 |
-
$keyDataType = $this->dataType($key);
|
60 |
-
if (isset($this->$keyTypeName) && ! isset($this->processed[$key])) {
|
61 |
-
if (isset($this->modelData[$key])) {
|
62 |
-
$val = $this->modelData[$key];
|
63 |
-
} else
|
64 |
-
if (isset($this->$keyDataType) && ($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) {
|
65 |
-
$val = array();
|
66 |
-
} else {
|
67 |
-
$val = null;
|
68 |
-
}
|
69 |
-
if ($this->isAssociativeArray($val)) {
|
70 |
-
if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) {
|
71 |
-
foreach ($val as $arrayKey => $arrayItem) {
|
72 |
-
$this->modelData[$key][$arrayKey] = $this->createObjectFromName($keyTypeName, $arrayItem);
|
73 |
-
}
|
74 |
-
} else {
|
75 |
-
$this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val);
|
76 |
-
}
|
77 |
-
} else
|
78 |
-
if (is_array($val)) {
|
79 |
-
$arrayObject = array();
|
80 |
-
foreach ($val as $arrayIndex => $arrayItem) {
|
81 |
-
$arrayObject[$arrayIndex] = $this->createObjectFromName($keyTypeName, $arrayItem);
|
82 |
-
}
|
83 |
-
$this->modelData[$key] = $arrayObject;
|
84 |
-
}
|
85 |
-
$this->processed[$key] = true;
|
86 |
-
}
|
87 |
-
return isset($this->modelData[$key]) ? $this->modelData[$key] : null;
|
88 |
-
}
|
89 |
-
|
90 |
-
/**
|
91 |
-
* Initialize this object's properties from an array.
|
92 |
-
*
|
93 |
-
* @param array $array
|
94 |
-
* Used to seed this object's properties.
|
95 |
-
* @return void
|
96 |
-
*/
|
97 |
-
protected function mapTypes($array)
|
98 |
-
{
|
99 |
-
// Hard initilise simple types, lazy load more complex ones.
|
100 |
-
foreach ($array as $key => $val) {
|
101 |
-
if (! property_exists($this, $this->keyType($key)) && property_exists($this, $key)) {
|
102 |
-
$this->$key = $val;
|
103 |
-
unset($array[$key]);
|
104 |
-
} elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) {
|
105 |
-
// This checks if property exists as camelCase, leaving it in array as snake_case
|
106 |
-
// in case of backwards compatibility issues.
|
107 |
-
$this->$camelKey = $val;
|
108 |
-
}
|
109 |
-
}
|
110 |
-
$this->modelData = $array;
|
111 |
-
}
|
112 |
-
|
113 |
-
/**
|
114 |
-
* Blank initialiser to be used in subclasses to do post-construction initialisation - this
|
115 |
-
* avoids the need for subclasses to have to implement the variadics handling in their
|
116 |
-
* constructors.
|
117 |
-
*/
|
118 |
-
protected function gapiInit()
|
119 |
-
{
|
120 |
-
return;
|
121 |
-
}
|
122 |
-
|
123 |
-
/**
|
124 |
-
* Create a simplified object suitable for straightforward
|
125 |
-
* conversion to JSON.
|
126 |
-
* This is relatively expensive
|
127 |
-
* due to the usage of reflection, but shouldn't be called
|
128 |
-
* a whole lot, and is the most straightforward way to filter.
|
129 |
-
*/
|
130 |
-
public function toSimpleObject()
|
131 |
-
{
|
132 |
-
$object = new stdClass();
|
133 |
-
// Process all other data.
|
134 |
-
foreach ($this->modelData as $key => $val) {
|
135 |
-
$result = $this->getSimpleValue($val);
|
136 |
-
if ($result !== null) {
|
137 |
-
$object->$key = $result;
|
138 |
-
}
|
139 |
-
}
|
140 |
-
// Process all public properties.
|
141 |
-
$reflect = new ReflectionObject($this);
|
142 |
-
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);
|
143 |
-
foreach ($props as $member) {
|
144 |
-
$name = $member->getName();
|
145 |
-
$result = $this->getSimpleValue($this->$name);
|
146 |
-
if ($result !== null) {
|
147 |
-
$name = $this->getMappedName($name);
|
148 |
-
$object->$name = $result;
|
149 |
-
}
|
150 |
-
}
|
151 |
-
return $object;
|
152 |
-
}
|
153 |
-
|
154 |
-
/**
|
155 |
-
* Handle different types of values, primarily
|
156 |
-
* other objects and map and array data types.
|
157 |
-
*/
|
158 |
-
private function getSimpleValue($value)
|
159 |
-
{
|
160 |
-
if ($value instanceof Google_Model) {
|
161 |
-
return $value->toSimpleObject();
|
162 |
-
} else
|
163 |
-
if (is_array($value)) {
|
164 |
-
$return = array();
|
165 |
-
foreach ($value as $key => $a_value) {
|
166 |
-
$a_value = $this->getSimpleValue($a_value);
|
167 |
-
if ($a_value !== null) {
|
168 |
-
$key = $this->getMappedName($key);
|
169 |
-
$return[$key] = $a_value;
|
170 |
-
}
|
171 |
-
}
|
172 |
-
return $return;
|
173 |
-
}
|
174 |
-
return $value;
|
175 |
-
}
|
176 |
-
|
177 |
-
/**
|
178 |
-
* If there is an internal name mapping, use that.
|
179 |
-
*/
|
180 |
-
private function getMappedName($key)
|
181 |
-
{
|
182 |
-
if (isset($this->internal_gapi_mappings) && isset($this->internal_gapi_mappings[$key])) {
|
183 |
-
$key = $this->internal_gapi_mappings[$key];
|
184 |
-
}
|
185 |
-
return $key;
|
186 |
-
}
|
187 |
-
|
188 |
-
/**
|
189 |
-
* Returns true only if the array is associative.
|
190 |
-
*
|
191 |
-
* @param array $array
|
192 |
-
* @return bool True if the array is associative.
|
193 |
-
*/
|
194 |
-
protected function isAssociativeArray($array)
|
195 |
-
{
|
196 |
-
if (! is_array($array)) {
|
197 |
-
return false;
|
198 |
-
}
|
199 |
-
$keys = array_keys($array);
|
200 |
-
foreach ($keys as $key) {
|
201 |
-
if (is_string($key)) {
|
202 |
-
return true;
|
203 |
-
}
|
204 |
-
}
|
205 |
-
return false;
|
206 |
-
}
|
207 |
-
|
208 |
-
/**
|
209 |
-
* Given a variable name, discover its type.
|
210 |
-
*
|
211 |
-
* @param
|
212 |
-
* $name
|
213 |
-
* @param
|
214 |
-
* $item
|
215 |
-
* @return object The object from the item.
|
216 |
-
*/
|
217 |
-
private function createObjectFromName($name, $item)
|
218 |
-
{
|
219 |
-
$type = $this->$name;
|
220 |
-
return new $type($item);
|
221 |
-
}
|
222 |
-
|
223 |
-
/**
|
224 |
-
* Verify if $obj is an array.
|
225 |
-
*
|
226 |
-
* @throws Google_Exception Thrown if $obj isn't an array.
|
227 |
-
* @param array $obj
|
228 |
-
* Items that should be validated.
|
229 |
-
* @param string $method
|
230 |
-
* Method expecting an array as an argument.
|
231 |
-
*/
|
232 |
-
public function assertIsArray($obj, $method)
|
233 |
-
{
|
234 |
-
if ($obj && ! is_array($obj)) {
|
235 |
-
throw new Google_Exception("Incorrect parameter type passed to $method(). Expected an array.");
|
236 |
-
}
|
237 |
-
}
|
238 |
-
|
239 |
-
public function offsetExists($offset)
|
240 |
-
{
|
241 |
-
return isset($this->$offset) || isset($this->modelData[$offset]);
|
242 |
-
}
|
243 |
-
|
244 |
-
public function offsetGet($offset)
|
245 |
-
{
|
246 |
-
return isset($this->$offset) ? $this->$offset : $this->__get($offset);
|
247 |
-
}
|
248 |
-
|
249 |
-
public function offsetSet($offset, $value)
|
250 |
-
{
|
251 |
-
if (property_exists($this, $offset)) {
|
252 |
-
$this->$offset = $value;
|
253 |
-
} else {
|
254 |
-
$this->modelData[$offset] = $value;
|
255 |
-
$this->processed[$offset] = true;
|
256 |
-
}
|
257 |
-
}
|
258 |
-
|
259 |
-
public function offsetUnset($offset)
|
260 |
-
{
|
261 |
-
unset($this->modelData[$offset]);
|
262 |
-
}
|
263 |
-
|
264 |
-
protected function keyType($key)
|
265 |
-
{
|
266 |
-
return $key . "Type";
|
267 |
-
}
|
268 |
-
|
269 |
-
protected function dataType($key)
|
270 |
-
{
|
271 |
-
return $key . "DataType";
|
272 |
-
}
|
273 |
-
|
274 |
-
public function __isset($key)
|
275 |
-
{
|
276 |
-
return isset($this->modelData[$key]);
|
277 |
-
}
|
278 |
-
|
279 |
-
public function __unset($key)
|
280 |
-
{
|
281 |
-
unset($this->modelData[$key]);
|
282 |
-
}
|
283 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright 2011 Google Inc.
|
5 |
+
*
|
6 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
+
* you may not use this file except in compliance with the License.
|
8 |
+
* You may obtain a copy of the License at
|
9 |
+
*
|
10 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
+
*
|
12 |
+
* Unless required by applicable law or agreed to in writing, software
|
13 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
+
* See the License for the specific language governing permissions and
|
16 |
+
* limitations under the License.
|
17 |
+
*/
|
18 |
+
/**
|
19 |
+
* This class defines attributes, valid values, and usage which is generated
|
20 |
+
* from a given json schema.
|
21 |
+
* http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5
|
22 |
+
*
|
23 |
+
* @author Chirag Shah <chirags@google.com>
|
24 |
+
*
|
25 |
+
*/
|
26 |
+
class Google_Model implements ArrayAccess
|
27 |
+
{
|
28 |
+
|
29 |
+
protected $internal_gapi_mappings = array();
|
30 |
+
|
31 |
+
protected $modelData = array();
|
32 |
+
|
33 |
+
protected $processed = array();
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Polymorphic - accepts a variable number of arguments dependent
|
37 |
+
* on the type of the model subclass.
|
38 |
+
*/
|
39 |
+
final public function __construct()
|
40 |
+
{
|
41 |
+
if (func_num_args() == 1 && is_array(func_get_arg(0))) {
|
42 |
+
// Initialize the model with the array's contents.
|
43 |
+
$array = func_get_arg(0);
|
44 |
+
$this->mapTypes($array);
|
45 |
+
}
|
46 |
+
$this->gapiInit();
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Getter that handles passthrough access to the data array, and lazy object creation.
|
51 |
+
*
|
52 |
+
* @param string $key
|
53 |
+
* Property name.
|
54 |
+
* @return mixed The value if any, or null.
|
55 |
+
*/
|
56 |
+
public function __get($key)
|
57 |
+
{
|
58 |
+
$keyTypeName = $this->keyType($key);
|
59 |
+
$keyDataType = $this->dataType($key);
|
60 |
+
if (isset($this->$keyTypeName) && ! isset($this->processed[$key])) {
|
61 |
+
if (isset($this->modelData[$key])) {
|
62 |
+
$val = $this->modelData[$key];
|
63 |
+
} else
|
64 |
+
if (isset($this->$keyDataType) && ($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) {
|
65 |
+
$val = array();
|
66 |
+
} else {
|
67 |
+
$val = null;
|
68 |
+
}
|
69 |
+
if ($this->isAssociativeArray($val)) {
|
70 |
+
if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) {
|
71 |
+
foreach ($val as $arrayKey => $arrayItem) {
|
72 |
+
$this->modelData[$key][$arrayKey] = $this->createObjectFromName($keyTypeName, $arrayItem);
|
73 |
+
}
|
74 |
+
} else {
|
75 |
+
$this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val);
|
76 |
+
}
|
77 |
+
} else
|
78 |
+
if (is_array($val)) {
|
79 |
+
$arrayObject = array();
|
80 |
+
foreach ($val as $arrayIndex => $arrayItem) {
|
81 |
+
$arrayObject[$arrayIndex] = $this->createObjectFromName($keyTypeName, $arrayItem);
|
82 |
+
}
|
83 |
+
$this->modelData[$key] = $arrayObject;
|
84 |
+
}
|
85 |
+
$this->processed[$key] = true;
|
86 |
+
}
|
87 |
+
return isset($this->modelData[$key]) ? $this->modelData[$key] : null;
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Initialize this object's properties from an array.
|
92 |
+
*
|
93 |
+
* @param array $array
|
94 |
+
* Used to seed this object's properties.
|
95 |
+
* @return void
|
96 |
+
*/
|
97 |
+
protected function mapTypes($array)
|
98 |
+
{
|
99 |
+
// Hard initilise simple types, lazy load more complex ones.
|
100 |
+
foreach ($array as $key => $val) {
|
101 |
+
if (! property_exists($this, $this->keyType($key)) && property_exists($this, $key)) {
|
102 |
+
$this->$key = $val;
|
103 |
+
unset($array[$key]);
|
104 |
+
} elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) {
|
105 |
+
// This checks if property exists as camelCase, leaving it in array as snake_case
|
106 |
+
// in case of backwards compatibility issues.
|
107 |
+
$this->$camelKey = $val;
|
108 |
+
}
|
109 |
+
}
|
110 |
+
$this->modelData = $array;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Blank initialiser to be used in subclasses to do post-construction initialisation - this
|
115 |
+
* avoids the need for subclasses to have to implement the variadics handling in their
|
116 |
+
* constructors.
|
117 |
+
*/
|
118 |
+
protected function gapiInit()
|
119 |
+
{
|
120 |
+
return;
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Create a simplified object suitable for straightforward
|
125 |
+
* conversion to JSON.
|
126 |
+
* This is relatively expensive
|
127 |
+
* due to the usage of reflection, but shouldn't be called
|
128 |
+
* a whole lot, and is the most straightforward way to filter.
|
129 |
+
*/
|
130 |
+
public function toSimpleObject()
|
131 |
+
{
|
132 |
+
$object = new stdClass();
|
133 |
+
// Process all other data.
|
134 |
+
foreach ($this->modelData as $key => $val) {
|
135 |
+
$result = $this->getSimpleValue($val);
|
136 |
+
if ($result !== null) {
|
137 |
+
$object->$key = $result;
|
138 |
+
}
|
139 |
+
}
|
140 |
+
// Process all public properties.
|
141 |
+
$reflect = new ReflectionObject($this);
|
142 |
+
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);
|
143 |
+
foreach ($props as $member) {
|
144 |
+
$name = $member->getName();
|
145 |
+
$result = $this->getSimpleValue($this->$name);
|
146 |
+
if ($result !== null) {
|
147 |
+
$name = $this->getMappedName($name);
|
148 |
+
$object->$name = $result;
|
149 |
+
}
|
150 |
+
}
|
151 |
+
return $object;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Handle different types of values, primarily
|
156 |
+
* other objects and map and array data types.
|
157 |
+
*/
|
158 |
+
private function getSimpleValue($value)
|
159 |
+
{
|
160 |
+
if ($value instanceof Google_Model) {
|
161 |
+
return $value->toSimpleObject();
|
162 |
+
} else
|
163 |
+
if (is_array($value)) {
|
164 |
+
$return = array();
|
165 |
+
foreach ($value as $key => $a_value) {
|
166 |
+
$a_value = $this->getSimpleValue($a_value);
|
167 |
+
if ($a_value !== null) {
|
168 |
+
$key = $this->getMappedName($key);
|
169 |
+
$return[$key] = $a_value;
|
170 |
+
}
|
171 |
+
}
|
172 |
+
return $return;
|
173 |
+
}
|
174 |
+
return $value;
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* If there is an internal name mapping, use that.
|
179 |
+
*/
|
180 |
+
private function getMappedName($key)
|
181 |
+
{
|
182 |
+
if (isset($this->internal_gapi_mappings) && isset($this->internal_gapi_mappings[$key])) {
|
183 |
+
$key = $this->internal_gapi_mappings[$key];
|
184 |
+
}
|
185 |
+
return $key;
|
186 |
+
}
|
187 |
+
|
188 |
+
/**
|
189 |
+
* Returns true only if the array is associative.
|
190 |
+
*
|
191 |
+
* @param array $array
|
192 |
+
* @return bool True if the array is associative.
|
193 |
+
*/
|
194 |
+
protected function isAssociativeArray($array)
|
195 |
+
{
|
196 |
+
if (! is_array($array)) {
|
197 |
+
return false;
|
198 |
+
}
|
199 |
+
$keys = array_keys($array);
|
200 |
+
foreach ($keys as $key) {
|
201 |
+
if (is_string($key)) {
|
202 |
+
return true;
|
203 |
+
}
|
204 |
+
}
|
205 |
+
return false;
|
206 |
+
}
|
207 |
+
|
208 |
+
/**
|
209 |
+
* Given a variable name, discover its type.
|
210 |
+
*
|
211 |
+
* @param
|
212 |
+
* $name
|
213 |
+
* @param
|
214 |
+
* $item
|
215 |
+
* @return object The object from the item.
|
216 |
+
*/
|
217 |
+
private function createObjectFromName($name, $item)
|
218 |
+
{
|
219 |
+
$type = $this->$name;
|
220 |
+
return new $type($item);
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Verify if $obj is an array.
|
225 |
+
*
|
226 |
+
* @throws Google_Exception Thrown if $obj isn't an array.
|
227 |
+
* @param array $obj
|
228 |
+
* Items that should be validated.
|
229 |
+
* @param string $method
|
230 |
+
* Method expecting an array as an argument.
|
231 |
+
*/
|
232 |
+
public function assertIsArray($obj, $method)
|
233 |
+
{
|
234 |
+
if ($obj && ! is_array($obj)) {
|
235 |
+
throw new Google_Exception("Incorrect parameter type passed to $method(). Expected an array.");
|
236 |
+
}
|
237 |
+
}
|
238 |
+
|
239 |
+
public function offsetExists($offset)
|
240 |
+
{
|
241 |
+
return isset($this->$offset) || isset($this->modelData[$offset]);
|
242 |
+
}
|
243 |
+
|
244 |
+
public function offsetGet($offset)
|
245 |
+
{
|
246 |
+
return isset($this->$offset) ? $this->$offset : $this->__get($offset);
|
247 |
+
}
|
248 |
+
|
249 |
+
public function offsetSet($offset, $value)
|
250 |
+
{
|
251 |
+
if (property_exists($this, $offset)) {
|
252 |
+
$this->$offset = $value;
|
253 |
+
} else {
|
254 |
+
$this->modelData[$offset] = $value;
|
255 |
+
$this->processed[$offset] = true;
|
256 |
+
}
|
257 |
+
}
|
258 |
+
|
259 |
+
public function offsetUnset($offset)
|
260 |
+
{
|
261 |
+
unset($this->modelData[$offset]);
|
262 |
+
}
|
263 |
+
|
264 |
+
protected function keyType($key)
|
265 |
+
{
|
266 |
+
return $key . "Type";
|
267 |
+
}
|
268 |
+
|
269 |
+
protected function dataType($key)
|
270 |
+
{
|
271 |
+
return $key . "DataType";
|
272 |
+
}
|
273 |
+
|
274 |
+
public function __isset($key)
|
275 |
+
{
|
276 |
+
return isset($this->modelData[$key]);
|
277 |
+
}
|
278 |
+
|
279 |
+
public function __unset($key)
|
280 |
+
{
|
281 |
+
unset($this->modelData[$key]);
|
282 |
+
}
|
283 |
}
|
tools/src/Google/Service.php
CHANGED
@@ -1,45 +1,45 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
* Copyright 2010 Google Inc.
|
5 |
-
*
|
6 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
-
* you may not use this file except in compliance with the License.
|
8 |
-
* You may obtain a copy of the License at
|
9 |
-
*
|
10 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
-
*
|
12 |
-
* Unless required by applicable law or agreed to in writing, software
|
13 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
-
* See the License for the specific language governing permissions and
|
16 |
-
* limitations under the License.
|
17 |
-
*/
|
18 |
-
class Google_Service
|
19 |
-
{
|
20 |
-
|
21 |
-
public $version;
|
22 |
-
|
23 |
-
public $servicePath;
|
24 |
-
|
25 |
-
public $availableScopes;
|
26 |
-
|
27 |
-
public $resource;
|
28 |
-
|
29 |
-
private $client;
|
30 |
-
|
31 |
-
public function __construct(Google_Client $client)
|
32 |
-
{
|
33 |
-
$this->client = $client;
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Return the associated Google_Client class.
|
38 |
-
*
|
39 |
-
* @return Google_Client
|
40 |
-
*/
|
41 |
-
public function getClient()
|
42 |
-
{
|
43 |
-
return $this->client;
|
44 |
-
}
|
45 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright 2010 Google Inc.
|
5 |
+
*
|
6 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7 |
+
* you may not use this file except in compliance with the License.
|
8 |
+
* You may obtain a copy of the License at
|
9 |
+
*
|
10 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
+
*
|
12 |
+
* Unless required by applicable law or agreed to in writing, software
|
13 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15 |
+
* See the License for the specific language governing permissions and
|
16 |
+
* limitations under the License.
|
17 |
+
*/
|
18 |
+
class Google_Service
|
19 |
+
{
|
20 |
+
|
21 |
+
public $version;
|
22 |
+
|
23 |
+
public $servicePath;
|
24 |
+
|
25 |
+
public $availableScopes;
|
26 |
+
|
27 |
+
public $resource;
|
28 |
+
|
29 |
+
private $client;
|
30 |
+
|
31 |
+
public function __construct(Google_Client $client)
|
32 |
+
{
|
33 |
+
$this->client = $client;
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Return the associated Google_Client class.
|
38 |
+
*
|
39 |
+
* @return Google_Client
|
40 |
+
*/
|
41 |
+
public function getClient()
|
42 |
+
{
|
43 |
+
return $this->client;
|
44 |
+
}
|
45 |
}
|
tools/src/Google/Service/Analytics.php
CHANGED
@@ -1,11796 +1,11796 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/*
|
4 |
-
* Copyright 2010 Google Inc.
|
5 |
-
*
|
6 |
-
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
7 |
-
* use this file except in compliance with the License. You may obtain a copy of
|
8 |
-
* the License at
|
9 |
-
*
|
10 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
11 |
-
*
|
12 |
-
* Unless required by applicable law or agreed to in writing, software
|
13 |
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
14 |
-
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
15 |
-
* License for the specific language governing permissions and limitations under
|
16 |
-
* the License.
|
17 |
-
*/
|
18 |
-
/**
|
19 |
-
* Service definition for Analytics (v3).
|
20 |
-
*
|
21 |
-
* <p>
|
22 |
-
* View and manage your Google Analytics data</p>
|
23 |
-
*
|
24 |
-
* <p>
|
25 |
-
* For more information about this service, see the API
|
26 |
-
* <a href="https://developers.google.com/analytics/" target="_blank">Documentation</a>
|
27 |
-
* </p>
|
28 |
-
*
|
29 |
-
* @author Google, Inc.
|
30 |
-
*/
|
31 |
-
class Google_Service_Analytics extends Google_Service
|
32 |
-
{
|
33 |
-
|
34 |
-
/**
|
35 |
-
* View and manage your Google Analytics data.
|
36 |
-
*/
|
37 |
-
const ANALYTICS = "https://www.googleapis.com/auth/analytics";
|
38 |
-
|
39 |
-
/**
|
40 |
-
* Edit Google Analytics management entities.
|
41 |
-
*/
|
42 |
-
const ANALYTICS_EDIT = "https://www.googleapis.com/auth/analytics.edit";
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Manage Google Analytics Account users by email address.
|
46 |
-
*/
|
47 |
-
const ANALYTICS_MANAGE_USERS = "https://www.googleapis.com/auth/analytics.manage.users";
|
48 |
-
|
49 |
-
/**
|
50 |
-
* View Google Analytics user permissions.
|
51 |
-
*/
|
52 |
-
const ANALYTICS_MANAGE_USERS_READONLY = "https://www.googleapis.com/auth/analytics.manage.users.readonly";
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Create a new Google Analytics account along with its default property and view.
|
56 |
-
*/
|
57 |
-
const ANALYTICS_PROVISION = "https://www.googleapis.com/auth/analytics.provision";
|
58 |
-
|
59 |
-
/**
|
60 |
-
* View your Google Analytics data.
|
61 |
-
*/
|
62 |
-
const ANALYTICS_READONLY = "https://www.googleapis.com/auth/analytics.readonly";
|
63 |
-
|
64 |
-
public $data_ga;
|
65 |
-
|
66 |
-
public $data_mcf;
|
67 |
-
|
68 |
-
public $data_realtime;
|
69 |
-
|
70 |
-
public $management_accountSummaries;
|
71 |
-
|
72 |
-
public $management_accountUserLinks;
|
73 |
-
|
74 |
-
public $management_accounts;
|
75 |
-
|
76 |
-
public $management_customDataSources;
|
77 |
-
|
78 |
-
public $management_dailyUploads;
|
79 |
-
|
80 |
-
public $management_experiments;
|
81 |
-
|
82 |
-
public $management_filters;
|
83 |
-
|
84 |
-
public $management_goals;
|
85 |
-
|
86 |
-
public $management_profileFilterLinks;
|
87 |
-
|
88 |
-
public $management_profileUserLinks;
|
89 |
-
|
90 |
-
public $management_profiles;
|
91 |
-
|
92 |
-
public $management_segments;
|
93 |
-
|
94 |
-
public $management_unsampledReports;
|
95 |
-
|
96 |
-
public $management_uploads;
|
97 |
-
|
98 |
-
public $management_webPropertyAdWordsLinks;
|
99 |
-
|
100 |
-
public $management_webproperties;
|
101 |
-
|
102 |
-
public $management_webpropertyUserLinks;
|
103 |
-
|
104 |
-
public $metadata_columns;
|
105 |
-
|
106 |
-
public $provisioning;
|
107 |
-
|
108 |
-
/**
|
109 |
-
* Constructs the internal representation of the Analytics service.
|
110 |
-
*
|
111 |
-
* @param Google_Client $client
|
112 |
-
*/
|
113 |
-
public function __construct(Google_Client $client)
|
114 |
-
{
|
115 |
-
parent::__construct($client);
|
116 |
-
$this->servicePath = 'analytics/v3/';
|
117 |
-
$this->version = 'v3';
|
118 |
-
$this->serviceName = 'analytics';
|
119 |
-
$this->data_ga = new Google_Service_Analytics_DataGa_Resource($this, $this->serviceName, 'ga', array(
|
120 |
-
'methods' => array(
|
121 |
-
'get' => array(
|
122 |
-
'path' => 'data/ga',
|
123 |
-
'httpMethod' => 'GET',
|
124 |
-
'parameters' => array(
|
125 |
-
'ids' => array(
|
126 |
-
'location' => 'query',
|
127 |
-
'type' => 'string',
|
128 |
-
'required' => true
|
129 |
-
),
|
130 |
-
'start-date' => array(
|
131 |
-
'location' => 'query',
|
132 |
-
'type' => 'string',
|
133 |
-
'required' => true
|
134 |
-
),
|
135 |
-
'end-date' => array(
|
136 |
-
'location' => 'query',
|
137 |
-
'type' => 'string',
|
138 |
-
'required' => true
|
139 |
-
),
|
140 |
-
'metrics' => array(
|
141 |
-
'location' => 'query',
|
142 |
-
'type' => 'string',
|
143 |
-
'required' => true
|
144 |
-
),
|
145 |
-
'max-results' => array(
|
146 |
-
'location' => 'query',
|
147 |
-
'type' => 'integer'
|
148 |
-
),
|
149 |
-
'sort' => array(
|
150 |
-
'location' => 'query',
|
151 |
-
'type' => 'string'
|
152 |
-
),
|
153 |
-
'dimensions' => array(
|
154 |
-
'location' => 'query',
|
155 |
-
'type' => 'string'
|
156 |
-
),
|
157 |
-
'start-index' => array(
|
158 |
-
'location' => 'query',
|
159 |
-
'type' => 'integer'
|
160 |
-
),
|
161 |
-
'segment' => array(
|
162 |
-
'location' => 'query',
|
163 |
-
'type' => 'string'
|
164 |
-
),
|
165 |
-
'samplingLevel' => array(
|
166 |
-
'location' => 'query',
|
167 |
-
'type' => 'string'
|
168 |
-
),
|
169 |
-
'filters' => array(
|
170 |
-
'location' => 'query',
|
171 |
-
'type' => 'string'
|
172 |
-
),
|
173 |
-
'output' => array(
|
174 |
-
'location' => 'query',
|
175 |
-
'type' => 'string'
|
176 |
-
)
|
177 |
-
)
|
178 |
-
)
|
179 |
-
)
|
180 |
-
));
|
181 |
-
$this->data_mcf = new Google_Service_Analytics_DataMcf_Resource($this, $this->serviceName, 'mcf', array(
|
182 |
-
'methods' => array(
|
183 |
-
'get' => array(
|
184 |
-
'path' => 'data/mcf',
|
185 |
-
'httpMethod' => 'GET',
|
186 |
-
'parameters' => array(
|
187 |
-
'ids' => array(
|
188 |
-
'location' => 'query',
|
189 |
-
'type' => 'string',
|
190 |
-
'required' => true
|
191 |
-
),
|
192 |
-
'start-date' => array(
|
193 |
-
'location' => 'query',
|
194 |
-
'type' => 'string',
|
195 |
-
'required' => true
|
196 |
-
),
|
197 |
-
'end-date' => array(
|
198 |
-
'location' => 'query',
|
199 |
-
'type' => 'string',
|
200 |
-
'required' => true
|
201 |
-
),
|
202 |
-
'metrics' => array(
|
203 |
-
'location' => 'query',
|
204 |
-
'type' => 'string',
|
205 |
-
'required' => true
|
206 |
-
),
|
207 |
-
'max-results' => array(
|
208 |
-
'location' => 'query',
|
209 |
-
'type' => 'integer'
|
210 |
-
),
|
211 |
-
'sort' => array(
|
212 |
-
'location' => 'query',
|
213 |
-
'type' => 'string'
|
214 |
-
),
|
215 |
-
'dimensions' => array(
|
216 |
-
'location' => 'query',
|
217 |
-
'type' => 'string'
|
218 |
-
),
|
219 |
-
'start-index' => array(
|
220 |
-
'location' => 'query',
|
221 |
-
'type' => 'integer'
|
222 |
-
),
|
223 |
-
'samplingLevel' => array(
|
224 |
-
'location' => 'query',
|
225 |
-
'type' => 'string'
|
226 |
-
),
|
227 |
-
'filters' => array(
|
228 |
-
'location' => 'query',
|
229 |
-
'type' => 'string'
|
230 |
-
)
|
231 |
-
)
|
232 |
-
)
|
233 |
-
)
|
234 |
-
));
|
235 |
-
$this->data_realtime = new Google_Service_Analytics_DataRealtime_Resource($this, $this->serviceName, 'realtime', array(
|
236 |
-
'methods' => array(
|
237 |
-
'get' => array(
|
238 |
-
'path' => 'data/realtime',
|
239 |
-
'httpMethod' => 'GET',
|
240 |
-
'parameters' => array(
|
241 |
-
'ids' => array(
|
242 |
-
'location' => 'query',
|
243 |
-
'type' => 'string',
|
244 |
-
'required' => true
|
245 |
-
),
|
246 |
-
'metrics' => array(
|
247 |
-
'location' => 'query',
|
248 |
-
'type' => 'string',
|
249 |
-
'required' => true
|
250 |
-
),
|
251 |
-
'max-results' => array(
|
252 |
-
'location' => 'query',
|
253 |
-
'type' => 'integer'
|
254 |
-
),
|
255 |
-
'sort' => array(
|
256 |
-
'location' => 'query',
|
257 |
-
'type' => 'string'
|
258 |
-
),
|
259 |
-
'dimensions' => array(
|
260 |
-
'location' => 'query',
|
261 |
-
'type' => 'string'
|
262 |
-
),
|
263 |
-
'filters' => array(
|
264 |
-
'location' => 'query',
|
265 |
-
'type' => 'string'
|
266 |
-
)
|
267 |
-
)
|
268 |
-
)
|
269 |
-
)
|
270 |
-
));
|
271 |
-
$this->management_accountSummaries = new Google_Service_Analytics_ManagementAccountSummaries_Resource($this, $this->serviceName, 'accountSummaries', array(
|
272 |
-
'methods' => array(
|
273 |
-
'list' => array(
|
274 |
-
'path' => 'management/accountSummaries',
|
275 |
-
'httpMethod' => 'GET',
|
276 |
-
'parameters' => array(
|
277 |
-
'max-results' => array(
|
278 |
-
'location' => 'query',
|
279 |
-
'type' => 'integer'
|
280 |
-
),
|
281 |
-
'start-index' => array(
|
282 |
-
'location' => 'query',
|
283 |
-
'type' => 'integer'
|
284 |
-
)
|
285 |
-
)
|
286 |
-
)
|
287 |
-
)
|
288 |
-
));
|
289 |
-
$this->management_accountUserLinks = new Google_Service_Analytics_ManagementAccountUserLinks_Resource($this, $this->serviceName, 'accountUserLinks', array(
|
290 |
-
'methods' => array(
|
291 |
-
'delete' => array(
|
292 |
-
'path' => 'management/accounts/{accountId}/entityUserLinks/{linkId}',
|
293 |
-
'httpMethod' => 'DELETE',
|
294 |
-
'parameters' => array(
|
295 |
-
'accountId' => array(
|
296 |
-
'location' => 'path',
|
297 |
-
'type' => 'string',
|
298 |
-
'required' => true
|
299 |
-
),
|
300 |
-
'linkId' => array(
|
301 |
-
'location' => 'path',
|
302 |
-
'type' => 'string',
|
303 |
-
'required' => true
|
304 |
-
)
|
305 |
-
)
|
306 |
-
),
|
307 |
-
'insert' => array(
|
308 |
-
'path' => 'management/accounts/{accountId}/entityUserLinks',
|
309 |
-
'httpMethod' => 'POST',
|
310 |
-
'parameters' => array(
|
311 |
-
'accountId' => array(
|
312 |
-
'location' => 'path',
|
313 |
-
'type' => 'string',
|
314 |
-
'required' => true
|
315 |
-
)
|
316 |
-
)
|
317 |
-
),
|
318 |
-
'list' => array(
|
319 |
-
'path' => 'management/accounts/{accountId}/entityUserLinks',
|
320 |
-
'httpMethod' => 'GET',
|
321 |
-
'parameters' => array(
|
322 |
-
'accountId' => array(
|
323 |
-
'location' => 'path',
|
324 |
-
'type' => 'string',
|
325 |
-
'required' => true
|
326 |
-
),
|
327 |
-
'max-results' => array(
|
328 |
-
'location' => 'query',
|
329 |
-
'type' => 'integer'
|
330 |
-
),
|
331 |
-
'start-index' => array(
|
332 |
-
'location' => 'query',
|
333 |
-
'type' => 'integer'
|
334 |
-
)
|
335 |
-
)
|
336 |
-
),
|
337 |
-
'update' => array(
|
338 |
-
'path' => 'management/accounts/{accountId}/entityUserLinks/{linkId}',
|
339 |
-
'httpMethod' => 'PUT',
|
340 |
-
'parameters' => array(
|
341 |
-
'accountId' => array(
|
342 |
-
'location' => 'path',
|
343 |
-
'type' => 'string',
|
344 |
-
'required' => true
|
345 |
-
),
|
346 |
-
'linkId' => array(
|
347 |
-
'location' => 'path',
|
348 |
-
'type' => 'string',
|
349 |
-
'required' => true
|
350 |
-
)
|
351 |
-
)
|
352 |
-
)
|
353 |
-
)
|
354 |
-
));
|
355 |
-
$this->management_accounts = new Google_Service_Analytics_ManagementAccounts_Resource($this, $this->serviceName, 'accounts', array(
|
356 |
-
'methods' => array(
|
357 |
-
'list' => array(
|
358 |
-
'path' => 'management/accounts',
|
359 |
-
'httpMethod' => 'GET',
|
360 |
-
'parameters' => array(
|
361 |
-
'max-results' => array(
|
362 |
-
'location' => 'query',
|
363 |
-
'type' => 'integer'
|
364 |
-
),
|
365 |
-
'start-index' => array(
|
366 |
-
'location' => 'query',
|
367 |
-
'type' => 'integer'
|
368 |
-
)
|
369 |
-
)
|
370 |
-
)
|
371 |
-
)
|
372 |
-
));
|
373 |
-
$this->management_customDataSources = new Google_Service_Analytics_ManagementCustomDataSources_Resource($this, $this->serviceName, 'customDataSources', array(
|
374 |
-
'methods' => array(
|
375 |
-
'list' => array(
|
376 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources',
|
377 |
-
'httpMethod' => 'GET',
|
378 |
-
'parameters' => array(
|
379 |
-
'accountId' => array(
|
380 |
-
'location' => 'path',
|
381 |
-
'type' => 'string',
|
382 |
-
'required' => true
|
383 |
-
),
|
384 |
-
'webPropertyId' => array(
|
385 |
-
'location' => 'path',
|
386 |
-
'type' => 'string',
|
387 |
-
'required' => true
|
388 |
-
),
|
389 |
-
'max-results' => array(
|
390 |
-
'location' => 'query',
|
391 |
-
'type' => 'integer'
|
392 |
-
),
|
393 |
-
'start-index' => array(
|
394 |
-
'location' => 'query',
|
395 |
-
'type' => 'integer'
|
396 |
-
)
|
397 |
-
)
|
398 |
-
)
|
399 |
-
)
|
400 |
-
));
|
401 |
-
$this->management_dailyUploads = new Google_Service_Analytics_ManagementDailyUploads_Resource($this, $this->serviceName, 'dailyUploads', array(
|
402 |
-
'methods' => array(
|
403 |
-
'delete' => array(
|
404 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}',
|
405 |
-
'httpMethod' => 'DELETE',
|
406 |
-
'parameters' => array(
|
407 |
-
'accountId' => array(
|
408 |
-
'location' => 'path',
|
409 |
-
'type' => 'string',
|
410 |
-
'required' => true
|
411 |
-
),
|
412 |
-
'webPropertyId' => array(
|
413 |
-
'location' => 'path',
|
414 |
-
'type' => 'string',
|
415 |
-
'required' => true
|
416 |
-
),
|
417 |
-
'customDataSourceId' => array(
|
418 |
-
'location' => 'path',
|
419 |
-
'type' => 'string',
|
420 |
-
'required' => true
|
421 |
-
),
|
422 |
-
'date' => array(
|
423 |
-
'location' => 'path',
|
424 |
-
'type' => 'string',
|
425 |
-
'required' => true
|
426 |
-
),
|
427 |
-
'type' => array(
|
428 |
-
'location' => 'query',
|
429 |
-
'type' => 'string',
|
430 |
-
'required' => true
|
431 |
-
)
|
432 |
-
)
|
433 |
-
),
|
434 |
-
'list' => array(
|
435 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads',
|
436 |
-
'httpMethod' => 'GET',
|
437 |
-
'parameters' => array(
|
438 |
-
'accountId' => array(
|
439 |
-
'location' => 'path',
|
440 |
-
'type' => 'string',
|
441 |
-
'required' => true
|
442 |
-
),
|
443 |
-
'webPropertyId' => array(
|
444 |
-
'location' => 'path',
|
445 |
-
'type' => 'string',
|
446 |
-
'required' => true
|
447 |
-
),
|
448 |
-
'customDataSourceId' => array(
|
449 |
-
'location' => 'path',
|
450 |
-
'type' => 'string',
|
451 |
-
'required' => true
|
452 |
-
),
|
453 |
-
'start-date' => array(
|
454 |
-
'location' => 'query',
|
455 |
-
'type' => 'string',
|
456 |
-
'required' => true
|
457 |
-
),
|
458 |
-
'end-date' => array(
|
459 |
-
'location' => 'query',
|
460 |
-
'type' => 'string',
|
461 |
-
'required' => true
|
462 |
-
),
|
463 |
-
'max-results' => array(
|
464 |
-
'location' => 'query',
|
465 |
-
'type' => 'integer'
|
466 |
-
),
|
467 |
-
'start-index' => array(
|
468 |
-
'location' => 'query',
|
469 |
-
'type' => 'integer'
|
470 |
-
)
|
471 |
-
)
|
472 |
-
),
|
473 |
-
'upload' => array(
|
474 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads',
|
475 |
-
'httpMethod' => 'POST',
|
476 |
-
'parameters' => array(
|
477 |
-
'accountId' => array(
|
478 |
-
'location' => 'path',
|
479 |
-
'type' => 'string',
|
480 |
-
'required' => true
|
481 |
-
),
|
482 |
-
'webPropertyId' => array(
|
483 |
-
'location' => 'path',
|
484 |
-
'type' => 'string',
|
485 |
-
'required' => true
|
486 |
-
),
|
487 |
-
'customDataSourceId' => array(
|
488 |
-
'location' => 'path',
|
489 |
-
'type' => 'string',
|
490 |
-
'required' => true
|
491 |
-
),
|
492 |
-
'date' => array(
|
493 |
-
'location' => 'path',
|
494 |
-
'type' => 'string',
|
495 |
-
'required' => true
|
496 |
-
),
|
497 |
-
'appendNumber' => array(
|
498 |
-
'location' => 'query',
|
499 |
-
'type' => 'integer',
|
500 |
-
'required' => true
|
501 |
-
),
|
502 |
-
'type' => array(
|
503 |
-
'location' => 'query',
|
504 |
-
'type' => 'string',
|
505 |
-
'required' => true
|
506 |
-
),
|
507 |
-
'reset' => array(
|
508 |
-
'location' => 'query',
|
509 |
-
'type' => 'boolean'
|
510 |
-
)
|
511 |
-
)
|
512 |
-
)
|
513 |
-
)
|
514 |
-
));
|
515 |
-
$this->management_experiments = new Google_Service_Analytics_ManagementExperiments_Resource($this, $this->serviceName, 'experiments', array(
|
516 |
-
'methods' => array(
|
517 |
-
'delete' => array(
|
518 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}',
|
519 |
-
'httpMethod' => 'DELETE',
|
520 |
-
'parameters' => array(
|
521 |
-
'accountId' => array(
|
522 |
-
'location' => 'path',
|
523 |
-
'type' => 'string',
|
524 |
-
'required' => true
|
525 |
-
),
|
526 |
-
'webPropertyId' => array(
|
527 |
-
'location' => 'path',
|
528 |
-
'type' => 'string',
|
529 |
-
'required' => true
|
530 |
-
),
|
531 |
-
'profileId' => array(
|
532 |
-
'location' => 'path',
|
533 |
-
'type' => 'string',
|
534 |
-
'required' => true
|
535 |
-
),
|
536 |
-
'experimentId' => array(
|
537 |
-
'location' => 'path',
|
538 |
-
'type' => 'string',
|
539 |
-
'required' => true
|
540 |
-
)
|
541 |
-
)
|
542 |
-
),
|
543 |
-
'get' => array(
|
544 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}',
|
545 |
-
'httpMethod' => 'GET',
|
546 |
-
'parameters' => array(
|
547 |
-
'accountId' => array(
|
548 |
-
'location' => 'path',
|
549 |
-
'type' => 'string',
|
550 |
-
'required' => true
|
551 |
-
),
|
552 |
-
'webPropertyId' => array(
|
553 |
-
'location' => 'path',
|
554 |
-
'type' => 'string',
|
555 |
-
'required' => true
|
556 |
-
),
|
557 |
-
'profileId' => array(
|
558 |
-
'location' => 'path',
|
559 |
-
'type' => 'string',
|
560 |
-
'required' => true
|
561 |
-
),
|
562 |
-
'experimentId' => array(
|
563 |
-
'location' => 'path',
|
564 |
-
'type' => 'string',
|
565 |
-
'required' => true
|
566 |
-
)
|
567 |
-
)
|
568 |
-
),
|
569 |
-
'insert' => array(
|
570 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments',
|
571 |
-
'httpMethod' => 'POST',
|
572 |
-
'parameters' => array(
|
573 |
-
'accountId' => array(
|
574 |
-
'location' => 'path',
|
575 |
-
'type' => 'string',
|
576 |
-
'required' => true
|
577 |
-
),
|
578 |
-
'webPropertyId' => array(
|
579 |
-
'location' => 'path',
|
580 |
-
'type' => 'string',
|
581 |
-
'required' => true
|
582 |
-
),
|
583 |
-
'profileId' => array(
|
584 |
-
'location' => 'path',
|
585 |
-
'type' => 'string',
|
586 |
-
'required' => true
|
587 |
-
)
|
588 |
-
)
|
589 |
-
),
|
590 |
-
'list' => array(
|
591 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments',
|
592 |
-
'httpMethod' => 'GET',
|
593 |
-
'parameters' => array(
|
594 |
-
'accountId' => array(
|
595 |
-
'location' => 'path',
|
596 |
-
'type' => 'string',
|
597 |
-
'required' => true
|
598 |
-
),
|
599 |
-
'webPropertyId' => array(
|
600 |
-
'location' => 'path',
|
601 |
-
'type' => 'string',
|
602 |
-
'required' => true
|
603 |
-
),
|
604 |
-
'profileId' => array(
|
605 |
-
'location' => 'path',
|
606 |
-
'type' => 'string',
|
607 |
-
'required' => true
|
608 |
-
),
|
609 |
-
'max-results' => array(
|
610 |
-
'location' => 'query',
|
611 |
-
'type' => 'integer'
|
612 |
-
),
|
613 |
-
'start-index' => array(
|
614 |
-
'location' => 'query',
|
615 |
-
'type' => 'integer'
|
616 |
-
)
|
617 |
-
)
|
618 |
-
),
|
619 |
-
'patch' => array(
|
620 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}',
|
621 |
-
'httpMethod' => 'PATCH',
|
622 |
-
'parameters' => array(
|
623 |
-
'accountId' => array(
|
624 |
-
'location' => 'path',
|
625 |
-
'type' => 'string',
|
626 |
-
'required' => true
|
627 |
-
),
|
628 |
-
'webPropertyId' => array(
|
629 |
-
'location' => 'path',
|
630 |
-
'type' => 'string',
|
631 |
-
'required' => true
|
632 |
-
),
|
633 |
-
'profileId' => array(
|
634 |
-
'location' => 'path',
|
635 |
-
'type' => 'string',
|
636 |
-
'required' => true
|
637 |
-
),
|
638 |
-
'experimentId' => array(
|
639 |
-
'location' => 'path',
|
640 |
-
'type' => 'string',
|
641 |
-
'required' => true
|
642 |
-
)
|
643 |
-
)
|
644 |
-
),
|
645 |
-
'update' => array(
|
646 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}',
|
647 |
-
'httpMethod' => 'PUT',
|
648 |
-
'parameters' => array(
|
649 |
-
'accountId' => array(
|
650 |
-
'location' => 'path',
|
651 |
-
'type' => 'string',
|
652 |
-
'required' => true
|
653 |
-
),
|
654 |
-
'webPropertyId' => array(
|
655 |
-
'location' => 'path',
|
656 |
-
'type' => 'string',
|
657 |
-
'required' => true
|
658 |
-
),
|
659 |
-
'profileId' => array(
|
660 |
-
'location' => 'path',
|
661 |
-
'type' => 'string',
|
662 |
-
'required' => true
|
663 |
-
),
|
664 |
-
'experimentId' => array(
|
665 |
-
'location' => 'path',
|
666 |
-
'type' => 'string',
|
667 |
-
'required' => true
|
668 |
-
)
|
669 |
-
)
|
670 |
-
)
|
671 |
-
)
|
672 |
-
));
|
673 |
-
$this->management_filters = new Google_Service_Analytics_ManagementFilters_Resource($this, $this->serviceName, 'filters', array(
|
674 |
-
'methods' => array(
|
675 |
-
'delete' => array(
|
676 |
-
'path' => 'management/accounts/{accountId}/filters/{filterId}',
|
677 |
-
'httpMethod' => 'DELETE',
|
678 |
-
'parameters' => array(
|
679 |
-
'accountId' => array(
|
680 |
-
'location' => 'path',
|
681 |
-
'type' => 'string',
|
682 |
-
'required' => true
|
683 |
-
),
|
684 |
-
'filterId' => array(
|
685 |
-
'location' => 'path',
|
686 |
-
'type' => 'string',
|
687 |
-
'required' => true
|
688 |
-
)
|
689 |
-
)
|
690 |
-
),
|
691 |
-
'get' => array(
|
692 |
-
'path' => 'management/accounts/{accountId}/filters/{filterId}',
|
693 |
-
'httpMethod' => 'GET',
|
694 |
-
'parameters' => array(
|
695 |
-
'accountId' => array(
|
696 |
-
'location' => 'path',
|
697 |
-
'type' => 'string',
|
698 |
-
'required' => true
|
699 |
-
),
|
700 |
-
'filterId' => array(
|
701 |
-
'location' => 'path',
|
702 |
-
'type' => 'string',
|
703 |
-
'required' => true
|
704 |
-
)
|
705 |
-
)
|
706 |
-
),
|
707 |
-
'insert' => array(
|
708 |
-
'path' => 'management/accounts/{accountId}/filters',
|
709 |
-
'httpMethod' => 'POST',
|
710 |
-
'parameters' => array(
|
711 |
-
'accountId' => array(
|
712 |
-
'location' => 'path',
|
713 |
-
'type' => 'string',
|
714 |
-
'required' => true
|
715 |
-
)
|
716 |
-
)
|
717 |
-
),
|
718 |
-
'list' => array(
|
719 |
-
'path' => 'management/accounts/{accountId}/filters',
|
720 |
-
'httpMethod' => 'GET',
|
721 |
-
'parameters' => array(
|
722 |
-
'accountId' => array(
|
723 |
-
'location' => 'path',
|
724 |
-
'type' => 'string',
|
725 |
-
'required' => true
|
726 |
-
),
|
727 |
-
'max-results' => array(
|
728 |
-
'location' => 'query',
|
729 |
-
'type' => 'integer'
|
730 |
-
),
|
731 |
-
'start-index' => array(
|
732 |
-
'location' => 'query',
|
733 |
-
'type' => 'integer'
|
734 |
-
)
|
735 |
-
)
|
736 |
-
),
|
737 |
-
'patch' => array(
|
738 |
-
'path' => 'management/accounts/{accountId}/filters/{filterId}',
|
739 |
-
'httpMethod' => 'PATCH',
|
740 |
-
'parameters' => array(
|
741 |
-
'accountId' => array(
|
742 |
-
'location' => 'path',
|
743 |
-
'type' => 'string',
|
744 |
-
'required' => true
|
745 |
-
),
|
746 |
-
'filterId' => array(
|
747 |
-
'location' => 'path',
|
748 |
-
'type' => 'string',
|
749 |
-
'required' => true
|
750 |
-
)
|
751 |
-
)
|
752 |
-
),
|
753 |
-
'update' => array(
|
754 |
-
'path' => 'management/accounts/{accountId}/filters/{filterId}',
|
755 |
-
'httpMethod' => 'PUT',
|
756 |
-
'parameters' => array(
|
757 |
-
'accountId' => array(
|
758 |
-
'location' => 'path',
|
759 |
-
'type' => 'string',
|
760 |
-
'required' => true
|
761 |
-
),
|
762 |
-
'filterId' => array(
|
763 |
-
'location' => 'path',
|
764 |
-
'type' => 'string',
|
765 |
-
'required' => true
|
766 |
-
)
|
767 |
-
)
|
768 |
-
)
|
769 |
-
)
|
770 |
-
));
|
771 |
-
$this->management_goals = new Google_Service_Analytics_ManagementGoals_Resource($this, $this->serviceName, 'goals', array(
|
772 |
-
'methods' => array(
|
773 |
-
'get' => array(
|
774 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}',
|
775 |
-
'httpMethod' => 'GET',
|
776 |
-
'parameters' => array(
|
777 |
-
'accountId' => array(
|
778 |
-
'location' => 'path',
|
779 |
-
'type' => 'string',
|
780 |
-
'required' => true
|
781 |
-
),
|
782 |
-
'webPropertyId' => array(
|
783 |
-
'location' => 'path',
|
784 |
-
'type' => 'string',
|
785 |
-
'required' => true
|
786 |
-
),
|
787 |
-
'profileId' => array(
|
788 |
-
'location' => 'path',
|
789 |
-
'type' => 'string',
|
790 |
-
'required' => true
|
791 |
-
),
|
792 |
-
'goalId' => array(
|
793 |
-
'location' => 'path',
|
794 |
-
'type' => 'string',
|
795 |
-
'required' => true
|
796 |
-
)
|
797 |
-
)
|
798 |
-
),
|
799 |
-
'insert' => array(
|
800 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals',
|
801 |
-
'httpMethod' => 'POST',
|
802 |
-
'parameters' => array(
|
803 |
-
'accountId' => array(
|
804 |
-
'location' => 'path',
|
805 |
-
'type' => 'string',
|
806 |
-
'required' => true
|
807 |
-
),
|
808 |
-
'webPropertyId' => array(
|
809 |
-
'location' => 'path',
|
810 |
-
'type' => 'string',
|
811 |
-
'required' => true
|
812 |
-
),
|
813 |
-
'profileId' => array(
|
814 |
-
'location' => 'path',
|
815 |
-
'type' => 'string',
|
816 |
-
'required' => true
|
817 |
-
)
|
818 |
-
)
|
819 |
-
),
|
820 |
-
'list' => array(
|
821 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals',
|
822 |
-
'httpMethod' => 'GET',
|
823 |
-
'parameters' => array(
|
824 |
-
'accountId' => array(
|
825 |
-
'location' => 'path',
|
826 |
-
'type' => 'string',
|
827 |
-
'required' => true
|
828 |
-
),
|
829 |
-
'webPropertyId' => array(
|
830 |
-
'location' => 'path',
|
831 |
-
'type' => 'string',
|
832 |
-
'required' => true
|
833 |
-
),
|
834 |
-
'profileId' => array(
|
835 |
-
'location' => 'path',
|
836 |
-
'type' => 'string',
|
837 |
-
'required' => true
|
838 |
-
),
|
839 |
-
'max-results' => array(
|
840 |
-
'location' => 'query',
|
841 |
-
'type' => 'integer'
|
842 |
-
),
|
843 |
-
'start-index' => array(
|
844 |
-
'location' => 'query',
|
845 |
-
'type' => 'integer'
|
846 |
-
)
|
847 |
-
)
|
848 |
-
),
|
849 |
-
'patch' => array(
|
850 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}',
|
851 |
-
'httpMethod' => 'PATCH',
|
852 |
-
'parameters' => array(
|
853 |
-
'accountId' => array(
|
854 |
-
'location' => 'path',
|
855 |
-
'type' => 'string',
|
856 |
-
'required' => true
|
857 |
-
),
|
858 |
-
'webPropertyId' => array(
|
859 |
-
'location' => 'path',
|
860 |
-
'type' => 'string',
|
861 |
-
'required' => true
|
862 |
-
),
|
863 |
-
'profileId' => array(
|
864 |
-
'location' => 'path',
|
865 |
-
'type' => 'string',
|
866 |
-
'required' => true
|
867 |
-
),
|
868 |
-
'goalId' => array(
|
869 |
-
'location' => 'path',
|
870 |
-
'type' => 'string',
|
871 |
-
'required' => true
|
872 |
-
)
|
873 |
-
)
|
874 |
-
),
|
875 |
-
'update' => array(
|
876 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}',
|
877 |
-
'httpMethod' => 'PUT',
|
878 |
-
'parameters' => array(
|
879 |
-
'accountId' => array(
|
880 |
-
'location' => 'path',
|
881 |
-
'type' => 'string',
|
882 |
-
'required' => true
|
883 |
-
),
|
884 |
-
'webPropertyId' => array(
|
885 |
-
'location' => 'path',
|
886 |
-
'type' => 'string',
|
887 |
-
'required' => true
|
888 |
-
),
|
889 |
-
'profileId' => array(
|
890 |
-
'location' => 'path',
|
891 |
-
'type' => 'string',
|
892 |
-
'required' => true
|
893 |
-
),
|
894 |
-
'goalId' => array(
|
895 |
-
'location' => 'path',
|
896 |
-
'type' => 'string',
|
897 |
-
'required' => true
|
898 |
-
)
|
899 |
-
)
|
900 |
-
)
|
901 |
-
)
|
902 |
-
));
|
903 |
-
$this->management_profileFilterLinks = new Google_Service_Analytics_ManagementProfileFilterLinks_Resource($this, $this->serviceName, 'profileFilterLinks', array(
|
904 |
-
'methods' => array(
|
905 |
-
'delete' => array(
|
906 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}',
|
907 |
-
'httpMethod' => 'DELETE',
|
908 |
-
'parameters' => array(
|
909 |
-
'accountId' => array(
|
910 |
-
'location' => 'path',
|
911 |
-
'type' => 'string',
|
912 |
-
'required' => true
|
913 |
-
),
|
914 |
-
'webPropertyId' => array(
|
915 |
-
'location' => 'path',
|
916 |
-
'type' => 'string',
|
917 |
-
'required' => true
|
918 |
-
),
|
919 |
-
'profileId' => array(
|
920 |
-
'location' => 'path',
|
921 |
-
'type' => 'string',
|
922 |
-
'required' => true
|
923 |
-
),
|
924 |
-
'linkId' => array(
|
925 |
-
'location' => 'path',
|
926 |
-
'type' => 'string',
|
927 |
-
'required' => true
|
928 |
-
)
|
929 |
-
)
|
930 |
-
),
|
931 |
-
'get' => array(
|
932 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}',
|
933 |
-
'httpMethod' => 'GET',
|
934 |
-
'parameters' => array(
|
935 |
-
'accountId' => array(
|
936 |
-
'location' => 'path',
|
937 |
-
'type' => 'string',
|
938 |
-
'required' => true
|
939 |
-
),
|
940 |
-
'webPropertyId' => array(
|
941 |
-
'location' => 'path',
|
942 |
-
'type' => 'string',
|
943 |
-
'required' => true
|
944 |
-
),
|
945 |
-
'profileId' => array(
|
946 |
-
'location' => 'path',
|
947 |
-
'type' => 'string',
|
948 |
-
'required' => true
|
949 |
-
),
|
950 |
-
'linkId' => array(
|
951 |
-
'location' => 'path',
|
952 |
-
'type' => 'string',
|
953 |
-
'required' => true
|
954 |
-
)
|
955 |
-
)
|
956 |
-
),
|
957 |
-
'insert' => array(
|
958 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks',
|
959 |
-
'httpMethod' => 'POST',
|
960 |
-
'parameters' => array(
|
961 |
-
'accountId' => array(
|
962 |
-
'location' => 'path',
|
963 |
-
'type' => 'string',
|
964 |
-
'required' => true
|
965 |
-
),
|
966 |
-
'webPropertyId' => array(
|
967 |
-
'location' => 'path',
|
968 |
-
'type' => 'string',
|
969 |
-
'required' => true
|
970 |
-
),
|
971 |
-
'profileId' => array(
|
972 |
-
'location' => 'path',
|
973 |
-
'type' => 'string',
|
974 |
-
'required' => true
|
975 |
-
)
|
976 |
-
)
|
977 |
-
),
|
978 |
-
'list' => array(
|
979 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks',
|
980 |
-
'httpMethod' => 'GET',
|
981 |
-
'parameters' => array(
|
982 |
-
'accountId' => array(
|
983 |
-
'location' => 'path',
|
984 |
-
'type' => 'string',
|
985 |
-
'required' => true
|
986 |
-
),
|
987 |
-
'webPropertyId' => array(
|
988 |
-
'location' => 'path',
|
989 |
-
'type' => 'string',
|
990 |
-
'required' => true
|
991 |
-
),
|
992 |
-
'profileId' => array(
|
993 |
-
'location' => 'path',
|
994 |
-
'type' => 'string',
|
995 |
-
'required' => true
|
996 |
-
),
|
997 |
-
'max-results' => array(
|
998 |
-
'location' => 'query',
|
999 |
-
'type' => 'integer'
|
1000 |
-
),
|
1001 |
-
'start-index' => array(
|
1002 |
-
'location' => 'query',
|
1003 |
-
'type' => 'integer'
|
1004 |
-
)
|
1005 |
-
)
|
1006 |
-
),
|
1007 |
-
'patch' => array(
|
1008 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}',
|
1009 |
-
'httpMethod' => 'PATCH',
|
1010 |
-
'parameters' => array(
|
1011 |
-
'accountId' => array(
|
1012 |
-
'location' => 'path',
|
1013 |
-
'type' => 'string',
|
1014 |
-
'required' => true
|
1015 |
-
),
|
1016 |
-
'webPropertyId' => array(
|
1017 |
-
'location' => 'path',
|
1018 |
-
'type' => 'string',
|
1019 |
-
'required' => true
|
1020 |
-
),
|
1021 |
-
'profileId' => array(
|
1022 |
-
'location' => 'path',
|
1023 |
-
'type' => 'string',
|
1024 |
-
'required' => true
|
1025 |
-
),
|
1026 |
-
'linkId' => array(
|
1027 |
-
'location' => 'path',
|
1028 |
-
'type' => 'string',
|
1029 |
-
'required' => true
|
1030 |
-
)
|
1031 |
-
)
|
1032 |
-
),
|
1033 |
-
'update' => array(
|
1034 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}',
|
1035 |
-
'httpMethod' => 'PUT',
|
1036 |
-
'parameters' => array(
|
1037 |
-
'accountId' => array(
|
1038 |
-
'location' => 'path',
|
1039 |
-
'type' => 'string',
|
1040 |
-
'required' => true
|
1041 |
-
),
|
1042 |
-
'webPropertyId' => array(
|
1043 |
-
'location' => 'path',
|
1044 |
-
'type' => 'string',
|
1045 |
-
'required' => true
|
1046 |
-
),
|
1047 |
-
'profileId' => array(
|
1048 |
-
'location' => 'path',
|
1049 |
-
'type' => 'string',
|
1050 |
-
'required' => true
|
1051 |
-
),
|
1052 |
-
'linkId' => array(
|
1053 |
-
'location' => 'path',
|
1054 |
-
'type' => 'string',
|
1055 |
-
'required' => true
|
1056 |
-
)
|
1057 |
-
)
|
1058 |
-
)
|
1059 |
-
)
|
1060 |
-
));
|
1061 |
-
$this->management_profileUserLinks = new Google_Service_Analytics_ManagementProfileUserLinks_Resource($this, $this->serviceName, 'profileUserLinks', array(
|
1062 |
-
'methods' => array(
|
1063 |
-
'delete' => array(
|
1064 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}',
|
1065 |
-
'httpMethod' => 'DELETE',
|
1066 |
-
'parameters' => array(
|
1067 |
-
'accountId' => array(
|
1068 |
-
'location' => 'path',
|
1069 |
-
'type' => 'string',
|
1070 |
-
'required' => true
|
1071 |
-
),
|
1072 |
-
'webPropertyId' => array(
|
1073 |
-
'location' => 'path',
|
1074 |
-
'type' => 'string',
|
1075 |
-
'required' => true
|
1076 |
-
),
|
1077 |
-
'profileId' => array(
|
1078 |
-
'location' => 'path',
|
1079 |
-
'type' => 'string',
|
1080 |
-
'required' => true
|
1081 |
-
),
|
1082 |
-
'linkId' => array(
|
1083 |
-
'location' => 'path',
|
1084 |
-
'type' => 'string',
|
1085 |
-
'required' => true
|
1086 |
-
)
|
1087 |
-
)
|
1088 |
-
),
|
1089 |
-
'insert' => array(
|
1090 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks',
|
1091 |
-
'httpMethod' => 'POST',
|
1092 |
-
'parameters' => array(
|
1093 |
-
'accountId' => array(
|
1094 |
-
'location' => 'path',
|
1095 |
-
'type' => 'string',
|
1096 |
-
'required' => true
|
1097 |
-
),
|
1098 |
-
'webPropertyId' => array(
|
1099 |
-
'location' => 'path',
|
1100 |
-
'type' => 'string',
|
1101 |
-
'required' => true
|
1102 |
-
),
|
1103 |
-
'profileId' => array(
|
1104 |
-
'location' => 'path',
|
1105 |
-
'type' => 'string',
|
1106 |
-
'required' => true
|
1107 |
-
)
|
1108 |
-
)
|
1109 |
-
),
|
1110 |
-
'list' => array(
|
1111 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks',
|
1112 |
-
'httpMethod' => 'GET',
|
1113 |
-
'parameters' => array(
|
1114 |
-
'accountId' => array(
|
1115 |
-
'location' => 'path',
|
1116 |
-
'type' => 'string',
|
1117 |
-
'required' => true
|
1118 |
-
),
|
1119 |
-
'webPropertyId' => array(
|
1120 |
-
'location' => 'path',
|
1121 |
-
'type' => 'string',
|
1122 |
-
'required' => true
|
1123 |
-
),
|
1124 |
-
'profileId' => array(
|
1125 |
-
'location' => 'path',
|
1126 |
-
'type' => 'string',
|
1127 |
-
'required' => true
|
1128 |
-
),
|
1129 |
-
'max-results' => array(
|
1130 |
-
'location' => 'query',
|
1131 |
-
'type' => 'integer'
|
1132 |
-
),
|
1133 |
-
'start-index' => array(
|
1134 |
-
'location' => 'query',
|
1135 |
-
'type' => 'integer'
|
1136 |
-
)
|
1137 |
-
)
|
1138 |
-
),
|
1139 |
-
'update' => array(
|
1140 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}',
|
1141 |
-
'httpMethod' => 'PUT',
|
1142 |
-
'parameters' => array(
|
1143 |
-
'accountId' => array(
|
1144 |
-
'location' => 'path',
|
1145 |
-
'type' => 'string',
|
1146 |
-
'required' => true
|
1147 |
-
),
|
1148 |
-
'webPropertyId' => array(
|
1149 |
-
'location' => 'path',
|
1150 |
-
'type' => 'string',
|
1151 |
-
'required' => true
|
1152 |
-
),
|
1153 |
-
'profileId' => array(
|
1154 |
-
'location' => 'path',
|
1155 |
-
'type' => 'string',
|
1156 |
-
'required' => true
|
1157 |
-
),
|
1158 |
-
'linkId' => array(
|
1159 |
-
'location' => 'path',
|
1160 |
-
'type' => 'string',
|
1161 |
-
'required' => true
|
1162 |
-
)
|
1163 |
-
)
|
1164 |
-
)
|
1165 |
-
)
|
1166 |
-
));
|
1167 |
-
$this->management_profiles = new Google_Service_Analytics_ManagementProfiles_Resource($this, $this->serviceName, 'profiles', array(
|
1168 |
-
'methods' => array(
|
1169 |
-
'delete' => array(
|
1170 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}',
|
1171 |
-
'httpMethod' => 'DELETE',
|
1172 |
-
'parameters' => array(
|
1173 |
-
'accountId' => array(
|
1174 |
-
'location' => 'path',
|
1175 |
-
'type' => 'string',
|
1176 |
-
'required' => true
|
1177 |
-
),
|
1178 |
-
'webPropertyId' => array(
|
1179 |
-
'location' => 'path',
|
1180 |
-
'type' => 'string',
|
1181 |
-
'required' => true
|
1182 |
-
),
|
1183 |
-
'profileId' => array(
|
1184 |
-
'location' => 'path',
|
1185 |
-
'type' => 'string',
|
1186 |
-
'required' => true
|
1187 |
-
)
|
1188 |
-
)
|
1189 |
-
),
|
1190 |
-
'get' => array(
|
1191 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}',
|
1192 |
-
'httpMethod' => 'GET',
|
1193 |
-
'parameters' => array(
|
1194 |
-
'accountId' => array(
|
1195 |
-
'location' => 'path',
|
1196 |
-
'type' => 'string',
|
1197 |
-
'required' => true
|
1198 |
-
),
|
1199 |
-
'webPropertyId' => array(
|
1200 |
-
'location' => 'path',
|
1201 |
-
'type' => 'string',
|
1202 |
-
'required' => true
|
1203 |
-
),
|
1204 |
-
'profileId' => array(
|
1205 |
-
'location' => 'path',
|
1206 |
-
'type' => 'string',
|
1207 |
-
'required' => true
|
1208 |
-
)
|
1209 |
-
)
|
1210 |
-
),
|
1211 |
-
'insert' => array(
|
1212 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles',
|
1213 |
-
'httpMethod' => 'POST',
|
1214 |
-
'parameters' => array(
|
1215 |
-
'accountId' => array(
|
1216 |
-
'location' => 'path',
|
1217 |
-
'type' => 'string',
|
1218 |
-
'required' => true
|
1219 |
-
),
|
1220 |
-
'webPropertyId' => array(
|
1221 |
-
'location' => 'path',
|
1222 |
-
'type' => 'string',
|
1223 |
-
'required' => true
|
1224 |
-
)
|
1225 |
-
)
|
1226 |
-
),
|
1227 |
-
'list' => array(
|
1228 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles',
|
1229 |
-
'httpMethod' => 'GET',
|
1230 |
-
'parameters' => array(
|
1231 |
-
'accountId' => array(
|
1232 |
-
'location' => 'path',
|
1233 |
-
'type' => 'string',
|
1234 |
-
'required' => true
|
1235 |
-
),
|
1236 |
-
'webPropertyId' => array(
|
1237 |
-
'location' => 'path',
|
1238 |
-
'type' => 'string',
|
1239 |
-
'required' => true
|
1240 |
-
),
|
1241 |
-
'max-results' => array(
|
1242 |
-
'location' => 'query',
|
1243 |
-
'type' => 'integer'
|
1244 |
-
),
|
1245 |
-
'start-index' => array(
|
1246 |
-
'location' => 'query',
|
1247 |
-
'type' => 'integer'
|
1248 |
-
)
|
1249 |
-
)
|
1250 |
-
),
|
1251 |
-
'patch' => array(
|
1252 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}',
|
1253 |
-
'httpMethod' => 'PATCH',
|
1254 |
-
'parameters' => array(
|
1255 |
-
'accountId' => array(
|
1256 |
-
'location' => 'path',
|
1257 |
-
'type' => 'string',
|
1258 |
-
'required' => true
|
1259 |
-
),
|
1260 |
-
'webPropertyId' => array(
|
1261 |
-
'location' => 'path',
|
1262 |
-
'type' => 'string',
|
1263 |
-
'required' => true
|
1264 |
-
),
|
1265 |
-
'profileId' => array(
|
1266 |
-
'location' => 'path',
|
1267 |
-
'type' => 'string',
|
1268 |
-
'required' => true
|
1269 |
-
)
|
1270 |
-
)
|
1271 |
-
),
|
1272 |
-
'update' => array(
|
1273 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}',
|
1274 |
-
'httpMethod' => 'PUT',
|
1275 |
-
'parameters' => array(
|
1276 |
-
'accountId' => array(
|
1277 |
-
'location' => 'path',
|
1278 |
-
'type' => 'string',
|
1279 |
-
'required' => true
|
1280 |
-
),
|
1281 |
-
'webPropertyId' => array(
|
1282 |
-
'location' => 'path',
|
1283 |
-
'type' => 'string',
|
1284 |
-
'required' => true
|
1285 |
-
),
|
1286 |
-
'profileId' => array(
|
1287 |
-
'location' => 'path',
|
1288 |
-
'type' => 'string',
|
1289 |
-
'required' => true
|
1290 |
-
)
|
1291 |
-
)
|
1292 |
-
)
|
1293 |
-
)
|
1294 |
-
));
|
1295 |
-
$this->management_segments = new Google_Service_Analytics_ManagementSegments_Resource($this, $this->serviceName, 'segments', array(
|
1296 |
-
'methods' => array(
|
1297 |
-
'list' => array(
|
1298 |
-
'path' => 'management/segments',
|
1299 |
-
'httpMethod' => 'GET',
|
1300 |
-
'parameters' => array(
|
1301 |
-
'max-results' => array(
|
1302 |
-
'location' => 'query',
|
1303 |
-
'type' => 'integer'
|
1304 |
-
),
|
1305 |
-
'start-index' => array(
|
1306 |
-
'location' => 'query',
|
1307 |
-
'type' => 'integer'
|
1308 |
-
)
|
1309 |
-
)
|
1310 |
-
)
|
1311 |
-
)
|
1312 |
-
));
|
1313 |
-
$this->management_unsampledReports = new Google_Service_Analytics_ManagementUnsampledReports_Resource($this, $this->serviceName, 'unsampledReports', array(
|
1314 |
-
'methods' => array(
|
1315 |
-
'get' => array(
|
1316 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}',
|
1317 |
-
'httpMethod' => 'GET',
|
1318 |
-
'parameters' => array(
|
1319 |
-
'accountId' => array(
|
1320 |
-
'location' => 'path',
|
1321 |
-
'type' => 'string',
|
1322 |
-
'required' => true
|
1323 |
-
),
|
1324 |
-
'webPropertyId' => array(
|
1325 |
-
'location' => 'path',
|
1326 |
-
'type' => 'string',
|
1327 |
-
'required' => true
|
1328 |
-
),
|
1329 |
-
'profileId' => array(
|
1330 |
-
'location' => 'path',
|
1331 |
-
'type' => 'string',
|
1332 |
-
'required' => true
|
1333 |
-
),
|
1334 |
-
'unsampledReportId' => array(
|
1335 |
-
'location' => 'path',
|
1336 |
-
'type' => 'string',
|
1337 |
-
'required' => true
|
1338 |
-
)
|
1339 |
-
)
|
1340 |
-
),
|
1341 |
-
'insert' => array(
|
1342 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports',
|
1343 |
-
'httpMethod' => 'POST',
|
1344 |
-
'parameters' => array(
|
1345 |
-
'accountId' => array(
|
1346 |
-
'location' => 'path',
|
1347 |
-
'type' => 'string',
|
1348 |
-
'required' => true
|
1349 |
-
),
|
1350 |
-
'webPropertyId' => array(
|
1351 |
-
'location' => 'path',
|
1352 |
-
'type' => 'string',
|
1353 |
-
'required' => true
|
1354 |
-
),
|
1355 |
-
'profileId' => array(
|
1356 |
-
'location' => 'path',
|
1357 |
-
'type' => 'string',
|
1358 |
-
'required' => true
|
1359 |
-
)
|
1360 |
-
)
|
1361 |
-
),
|
1362 |
-
'list' => array(
|
1363 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports',
|
1364 |
-
'httpMethod' => 'GET',
|
1365 |
-
'parameters' => array(
|
1366 |
-
'accountId' => array(
|
1367 |
-
'location' => 'path',
|
1368 |
-
'type' => 'string',
|
1369 |
-
'required' => true
|
1370 |
-
),
|
1371 |
-
'webPropertyId' => array(
|
1372 |
-
'location' => 'path',
|
1373 |
-
'type' => 'string',
|
1374 |
-
'required' => true
|
1375 |
-
),
|
1376 |
-
'profileId' => array(
|
1377 |
-
'location' => 'path',
|
1378 |
-
'type' => 'string',
|
1379 |
-
'required' => true
|
1380 |
-
),
|
1381 |
-
'max-results' => array(
|
1382 |
-
'location' => 'query',
|
1383 |
-
'type' => 'integer'
|
1384 |
-
),
|
1385 |
-
'start-index' => array(
|
1386 |
-
'location' => 'query',
|
1387 |
-
'type' => 'integer'
|
1388 |
-
)
|
1389 |
-
)
|
1390 |
-
)
|
1391 |
-
)
|
1392 |
-
));
|
1393 |
-
$this->management_uploads = new Google_Service_Analytics_ManagementUploads_Resource($this, $this->serviceName, 'uploads', array(
|
1394 |
-
'methods' => array(
|
1395 |
-
'deleteUploadData' => array(
|
1396 |
-
'path' => 'management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/deleteUploadData',
|
1397 |
-
'httpMethod' => 'POST',
|
1398 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|