Completed
Push — add/double-encode-message ( 8b6530...2d4e84 )
by
unknown
14:26 queued 05:57
created

Jetpack_EU_Cookie_Law_Widget::update()   F

Complexity

Conditions 21
Paths 1536

Size

Total Lines 67

Duplication

Lines 8
Ratio 11.94 %

Importance

Changes 0
Metric Value
cc 21
nc 1536
nop 2
dl 8
loc 67
rs 0
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * Disable direct access/execution to/of the widget code.
5
 */
6
if ( ! defined( 'ABSPATH' ) ) {
7
	exit;
8
}
9
10
if ( ! class_exists( 'Jetpack_EU_Cookie_Law_Widget' ) ) {
11
	/**
12
	 * EU Cookie Law Widget
13
	 *
14
	 * Display the EU Cookie Law banner in the bottom part of the screen.
15
	 */
16
	class Jetpack_EU_Cookie_Law_Widget extends WP_Widget {
17
		/**
18
		 * EU Cookie Law cookie name.
19
		 *
20
		 * @var string
21
		 */
22
		public static $cookie_name = 'eucookielaw';
23
24
		/**
25
		 * Default hide options.
26
		 *
27
		 * @var array
28
		 */
29
		private $hide_options = array(
30
			'button',
31
			'scroll',
32
			'time',
33
		);
34
35
		/**
36
		 * Default text options.
37
		 *
38
		 * @var array
39
		 */
40
		private $text_options = array(
41
			'default',
42
			'custom',
43
		);
44
45
		/**
46
		 * Default color scheme options.
47
		 *
48
		 * @var array
49
		 */
50
		private $color_scheme_options = array(
51
			'default',
52
			'negative',
53
		);
54
55
		/**
56
		 * Default policy URL options.
57
		 *
58
		 * @var array
59
		 */
60
		private $policy_url_options = array(
61
			'default',
62
			'custom',
63
		);
64
65
		/**
66
		 * Widget position options.
67
		 *
68
		 * @var array
69
		 */
70
		private $position_options = array(
71
			'bottom',
72
			'top',
73
		);
74
75
		/**
76
		 * Constructor.
77
		 */
78 View Code Duplication
		function __construct() {
79
			parent::__construct(
80
				'eu_cookie_law_widget',
81
				/** This filter is documented in modules/widgets/facebook-likebox.php */
82
				apply_filters( 'jetpack_widget_name', esc_html__( 'Cookies & Consents Banner', 'jetpack' ) ),
83
				array(
84
					'description'                 => esc_html__( 'Display a banner for EU Cookie Law and GDPR compliance.', 'jetpack' ),
85
					'customize_selective_refresh' => true,
86
				),
87
				array()
88
			);
89
90
			if ( is_active_widget( false, false, $this->id_base ) || is_customize_preview() ) {
91
				add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_scripts' ) );
92
			}
93
		}
94
95
		/**
96
		 * Enqueue scripts and styles.
97
		 */
98 View Code Duplication
		function enqueue_frontend_scripts() {
99
			wp_enqueue_style( 'eu-cookie-law-style', plugins_url( 'eu-cookie-law/style.css', __FILE__ ), array(), '20170403' );
100
			wp_enqueue_script(
101
				'eu-cookie-law-script',
102
				Jetpack::get_file_url_for_environment(
103
					'_inc/build/widgets/eu-cookie-law/eu-cookie-law.min.js',
104
					'modules/widgets/eu-cookie-law/eu-cookie-law.js'
105
				),
106
				array( 'jquery' ),
107
				'20180522',
108
				true
109
			);
110
		}
111
112
		/**
113
		 * Return an associative array of default values.
114
		 *
115
		 * These values are used in new widgets.
116
		 *
117
		 * @return array Default values for the widget options.
118
		 */
119
		public function defaults() {
120
			return array(
121
				'hide'               => $this->hide_options[0],
122
				'hide-timeout'       => 30,
123
				'consent-expiration' => 180,
124
				'text'               => $this->text_options[0],
125
				'customtext'         => '',
126
				'color-scheme'       => $this->color_scheme_options[0],
127
				'policy-url'         => get_option( 'wp_page_for_privacy_policy' ) ? $this->policy_url_options[1] : $this->policy_url_options[0],
128
				'default-policy-url' => 'https://automattic.com/cookies/',
129
				'custom-policy-url'  => get_option( 'wp_page_for_privacy_policy' ) ? get_permalink( (int) get_option( 'wp_page_for_privacy_policy' ) ) : '',
130
				'position'           => $this->position_options[0],
131
				'policy-link-text'   => esc_html__( 'Cookie Policy', 'jetpack' ),
132
				'button'             => esc_html__( 'Close and accept', 'jetpack' ),
133
				'default-text'       => esc_html__( "Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use. \r\nTo find out more, including how to control cookies, see here:", 'jetpack' ),
134
			);
135
		}
136
137
		/**
138
		 * Front-end display of the widget.
139
		 *
140
		 * @param array $args     Widget arguments.
141
		 * @param array $instance Saved values from database.
142
		 */
143
		public function widget( $args, $instance ) {
144
			/**
145
			 * Filters the display of the EU Cookie Law widget.
146
			 *
147
			 * @since 6.1.1
148
			 *
149
			 * @param bool true Should the EU Cookie Law widget be disabled. Default to false.
150
			 */
151
			if ( apply_filters( 'jetpack_disable_eu_cookie_law_widget', false ) ) {
152
				return;
153
			}
154
155
			$instance = wp_parse_args( $instance, $this->defaults() );
156
157
			$classes         = array();
158
			$classes['hide'] = 'hide-on-' . esc_attr( $instance['hide'] );
159
			if ( 'negative' === $instance['color-scheme'] ) {
160
				$classes['negative'] = 'negative';
161
			}
162
163
			if ( 'top' === $instance['position'] ) {
164
				$classes['top'] = 'top';
165
			}
166
167
			if ( Jetpack::is_module_active( 'wordads' ) ) {
168
				$classes['ads']  = 'ads-active';
169
				$classes['hide'] = 'hide-on-button';
170
			}
171
172
			echo $args['before_widget'];
173
			require( dirname( __FILE__ ) . '/eu-cookie-law/widget.php' );
174
			echo $args['after_widget'];
175
			/** This action is already documented in modules/widgets/gravatar-profile.php */
176
			do_action( 'jetpack_stats_extra', 'widget_view', 'eu_cookie_law' );
177
		}
178
179
		/**
180
		 * Back-end widget form.
181
		 *
182
		 * @param array $instance Previously saved values from database.
183
		 */
184
		public function form( $instance ) {
185
			$instance = wp_parse_args( $instance, $this->defaults() );
186
			if ( Jetpack::is_module_active( 'wordads' ) ) {
187
				$instance['hide'] = 'button';
188
			}
189
190
			wp_enqueue_script(
191
				'eu-cookie-law-widget-admin',
192
				Jetpack::get_file_url_for_environment(
193
					'_inc/build/widgets/eu-cookie-law/eu-cookie-law-admin.min.js',
194
					'modules/widgets/eu-cookie-law/eu-cookie-law-admin.js'
195
				),
196
				array( 'jquery' ),
197
				20180417
198
			);
199
200
			require( dirname( __FILE__ ) . '/eu-cookie-law/form.php' );
201
		}
202
203
		/**
204
		 * Sanitize widget form values as they are saved.
205
		 *
206
		 * @param  array $new_instance Values just sent to be saved.
207
		 * @param  array $old_instance Previously saved values from database.
208
		 * @return array Updated safe values to be saved.
209
		 */
210
		public function update( $new_instance, $old_instance ) {
211
			$instance = array();
212
			$defaults = $this->defaults();
213
214
			$instance['hide']         = $this->filter_value( isset( $new_instance['hide'] ) ? $new_instance['hide'] : '', $this->hide_options );
215
			$instance['text']         = $this->filter_value( isset( $new_instance['text'] ) ? $new_instance['text'] : '', $this->text_options );
216
			$instance['color-scheme'] = $this->filter_value( isset( $new_instance['color-scheme'] ) ? $new_instance['color-scheme'] : '', $this->color_scheme_options );
217
			$instance['policy-url']   = $this->filter_value( isset( $new_instance['policy-url'] ) ? $new_instance['policy-url'] : '', $this->policy_url_options );
218
			$instance['position']     = $this->filter_value( isset( $new_instance['position'] ) ? $new_instance['position'] : '', $this->position_options );
219
220 View Code Duplication
			if ( isset( $new_instance['hide-timeout'] ) ) {
221
				// Time can be a value between 3 and 1000 seconds.
222
				$instance['hide-timeout'] = min( 1000, max( 3, intval( $new_instance['hide-timeout'] ) ) );
223
			}
224
225 View Code Duplication
			if ( isset( $new_instance['consent-expiration'] ) ) {
226
				// Time can be a value between 1 and 365 days.
227
				$instance['consent-expiration'] = min( 365, max( 1, intval( $new_instance['consent-expiration'] ) ) );
228
			}
229
230
			if ( isset( $new_instance['customtext'] ) ) {
231
				$instance['customtext'] = mb_substr( wp_kses( $new_instance['customtext'], array() ), 0, 4096 );
232
			} else {
233
				$instance['text'] = $this->text_options[0];
234
			}
235
236
			if ( isset( $new_instance['policy-url'] ) ) {
237
				$instance['policy-url'] = 'custom' === $new_instance['policy-url']
238
					? 'custom'
239
					: 'default';
240
			} else {
241
				$instance['policy-url'] = $this->policy_url_options[0];
242
			}
243
244
			if ( 'custom' === $instance['policy-url'] && isset( $new_instance['custom-policy-url'] ) ) {
245
				$instance['custom-policy-url'] = esc_url( $new_instance['custom-policy-url'], array( 'http', 'https' ) );
246
247
				if ( strlen( $instance['custom-policy-url'] ) < 10 ) {
248
					unset( $instance['custom-policy-url'] );
249
					global $wp_customize;
250
					if ( ! isset( $wp_customize ) ) {
251
						$instance['policy-url'] = $this->policy_url_options[0];
252
					}
253
				}
254
			}
255
256
			if ( isset( $new_instance['policy-link-text'] ) ) {
257
				$instance['policy-link-text'] = trim( mb_substr( wp_kses( $new_instance['policy-link-text'], array() ), 0, 100 ) );
258
			}
259
260
			if ( empty( $instance['policy-link-text'] ) || $instance['policy-link-text'] == $defaults['policy-link-text'] ) {
261
				unset( $instance['policy-link-text'] );
262
			}
263
264
			if ( isset( $new_instance['button'] ) ) {
265
				$instance['button'] = trim( mb_substr( wp_kses( $new_instance['button'], array() ), 0, 100 ) );
266
			}
267
268
			if ( empty( $instance['button'] ) || $instance['button'] == $defaults['button'] ) {
269
				unset( $instance['button'] );
270
			}
271
272
			// Show the banner again if a setting has been changed.
273
			setcookie( self::$cookie_name, '', time() - 86400, '/' );
274
275
			return $instance;
276
		}
277
278
		/**
279
		 * Check if the value is allowed and not empty.
280
		 *
281
		 * @param  string $value Value to check.
282
		 * @param  array  $allowed Array of allowed values.
283
		 *
284
		 * @return string $value if pass the check or first value from allowed values.
285
		 */
286 View Code Duplication
		function filter_value( $value, $allowed = array() ) {
287
			$allowed = (array) $allowed;
288
			if ( empty( $value ) || ( ! empty( $allowed ) && ! in_array( $value, $allowed ) ) ) {
289
				$value = $allowed[0];
290
			}
291
			return $value;
292
		}
293
	}
294
295
	// Register Jetpack_EU_Cookie_Law_Widget widget.
296
	function jetpack_register_eu_cookie_law_widget() {
297
		register_widget( 'Jetpack_EU_Cookie_Law_Widget' );
298
	};
299
300
	add_action( 'widgets_init', 'jetpack_register_eu_cookie_law_widget' );
301
}
302