Completed
Push — develop ( aa0816...918969 )
by Zack
06:41
created

Addon_Settings::settings_edd_license()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4.0218

Importance

Changes 0
Metric Value
cc 4
nc 4
nop 2
dl 0
loc 18
ccs 8
cts 9
cp 0.8889
crap 4.0218
rs 9.6666
c 0
b 0
f 0
1
<?php
2
namespace GV;
3
4
/** If this file is called directly, abort. */
5
if ( ! defined( 'GRAVITYVIEW_DIR' ) ) {
6
	die();
7
}
8
9
if ( ! class_exists( '\GFAddOn' ) ) {
10
	return;
11
}
12
13
/**
14
 * The Addon Settings class.
15
 *
16
 * Uses internal GFAddOn APIs.
17
 */
18
class Addon_Settings extends \GFAddOn {
19
	/**
20
	 * @var string Title of the plugin to be used on the settings page, form settings and plugins page. Example: 'Gravity Forms MailChimp Add-On'
21
	 */
22
	protected $_title = 'GravityView';
23
24
	/**
25
	 * @var string Short version of the plugin title to be used on menus and other places where a less verbose string is useful. Example: 'MailChimp'
26
	 */
27
	protected  $_short_title = 'GravityView';
28
29
	/**
30
	 * @var string URL-friendly identifier used for form settings, add-on settings, text domain localization...
31
	 */
32
	protected $_slug = 'gravityview';
33
34
	/**
35
	 * @var string|array A string or an array of capabilities or roles that can uninstall the plugin
36
	 */
37
	protected $_capabilities_uninstall = 'gravityview_uninstall';
38
39
	/**
40
	 * @var string|array A string or an array of capabilities or roles that have access to the settings page
41
	 */
42
	protected $_capabilities_app_settings = 'gravityview_view_settings';
43
44
	/**
45
	 * @var string|array A string or an array of capabilities or roles that have access to the settings page
46
	 */
47
	protected $_capabilities_app_menu = 'gravityview_view_settings';
48
49
	/**
50
	 * @var string The hook suffix for the app menu
51
	 */
52
	public $app_hook_suffix = 'gravityview';
53
54
	/**
55
	 * @var \GV\License_Handler Process license validation
56
	 */
57
	private $License_Handler;
58
59
	/**
60
	 * @var bool Whether we have initialized already or not.
61
	 */
62
	private static $initialized = false;
63
64 2
	public function __construct() {
65 2
		$this->_version = Plugin::$version;
66 2
		$this->_min_gravityforms_version = Plugin::$min_gf_version;
67
68
		/**
69
		 * Hook everywhere, but only once.
70
		 */
71 2
		if ( ! self::$initialized ) {
72
			parent::__construct();
73
			self::$initialized = true;
74
		}
75 2
	}
76
77
	/**
78
	 * Run actions when initializing admin.
79
	 *
80
	 * Triggers the license key notice, et.c
81
	 *
82
	 * @return void
83
	 */
84 1
	public function init_admin() {
85 1
		$this->_load_license_handler();
86
87 1
		add_action( 'admin_head', array( $this, 'license_key_notice' ) );
88
89 1
		add_filter( 'gform_addon_app_settings_menu_gravityview', array( $this, 'modify_app_settings_menu_title' ) );
90
91
		/** @since 1.7.6 */
92 1
		add_action( 'network_admin_menu', array( $this, 'add_network_menu' ) );
93
94 1
		parent::init_admin();
95 1
	}
96
97
	/**
98
	 * Change the settings page header title to "GravityView"
99
	 *
100
	 * @param $setting_tabs
101
	 *
102
	 * @return array
103
	 */
104 1
	public function modify_app_settings_menu_title( $setting_tabs ) {
105 1
		$setting_tabs[0]['label'] = __( 'GravityView Settings', 'gravityview' );
106 1
		return $setting_tabs;
107
	}
108
109
	/**
110
	 * Load license handler in admin-ajax.php
111
	 *
112
	 * @return void
113
	 */
114 1
	public function init_ajax() {
115 1
		$this->_load_license_handler();
116 1
	}
117
118
	/**
119
	 * Make sure the license handler is available
120
	 *
121
	 * @return void
122
	 */
123 1
	private function _load_license_handler() {
124 1
		if ( ! empty( $this->License_Handler ) ) {
125 1
			return;
126
		}
127 1
		$this->License_Handler = License_Handler::get( $this );
128 1
	}
129
130
	/**
131
	 * Add global Settings page for Multisite
132
	 * @since 1.7.6
133
	 * @return void
134
	 */
135 1
	public function add_network_menu() {
136
137 1
	    if ( ! gravityview()->plugin->is_network_activated() ) {
138 1
			return;
139
		}
140
141
        add_menu_page( __( 'Settings', 'gravityview' ), __( 'GravityView', 'gravityview' ), $this->_capabilities_app_settings, "{$this->_slug}_settings", array( $this, 'app_tab_page' ), 'none' );
142
	}
143
144
	/**
145
     * Uninstall all traces of GravityView
146
     *
147
     * Note: method is public because parent method is public
148
     *
149
	 * @return bool
150
	 */
151 1
	public function uninstall() {
152 1
		gravityview()->plugin->uninstall();
153
154
		/**
155
         * Set the path so that Gravity Forms can de-activate GravityView
156
         * @see GFAddOn::uninstall_addon
157
         * @uses deactivate_plugins()
158
         */
159 1
		$this->_path = GRAVITYVIEW_FILE;
160
161 1
		return true;
162
	}
163
164
	/**
165
	 * Prevent uninstall tab from being shown by returning false for the uninstall capability check. Otherwise:
166
	 * @inheritDoc
167
	 *
168
	 * @hack
169
	 *
170
	 * @param array|string $caps
171
	 *
172
	 * @return bool
173
	 */
174 1
	public function current_user_can_any( $caps ) {
175 1
		if ( empty( $caps ) ) {
176
			$caps = array( 'gravityview_full_access' );
177
		}
178 1
		return \GVCommon::has_cap( $caps );
179
	}
180
181 1
	public function uninstall_warning_message() {
182 1
		$heading = esc_html__( 'If you delete then re-install GravityView, it will be like installing GravityView for the first time.', 'gravityview' );
183 1
		$message = esc_html__( 'Delete all Views, GravityView entry approval status, GravityView-generated entry notes (including approval and entry creator changes), and GravityView plugin settings.', 'gravityview' );
184 1
		return sprintf( '<h4>%s</h4><p>%s</p>', $heading, $message );
185
	}
186
187
	/**
188
     * Get an array of reasons why the plugin might be uninstalled
189
     *
190
     * @since 1.17.5
191
     *
192
	 * @return array Array of reasons with the label and followup questions for each uninstall reason
193
	 */
194 1
	private function get_uninstall_reasons() {
195
		$reasons = array(
196
			'will-continue' => array(
197 1
                'label' => esc_html__( 'I am going to continue using GravityView', 'gravityview' ),
198
            ),
199
			'no-longer-need' => array(
200 1
                'label' => esc_html__( 'I no longer need GravityView', 'gravityview' ),
201
            ),
202
			'doesnt-work' => array(
203 1
                'label' => esc_html__( 'The plugin doesn\'t work', 'gravityview' ),
204
            ),
205
			'found-other' => array(
206 1
                'label' => esc_html__( 'I found a better plugin', 'gravityview' ),
207 1
                'followup' => esc_attr__( 'What plugin you are using, and why?', 'gravityview' ),
208
            ),
209
			'other' => array(
210 1
                'label' => esc_html__( 'Other', 'gravityview' ),
211
            ),
212
		);
213
214 1
		shuffle( $reasons );
215
216 1
		return $reasons;
217
    }
218
219
	/**
220
     * Display a feedback form when the plugin is uninstalled
221
     *
222
     * @since 1.17.5
223
     *
224
	 * @return string HTML of the uninstallation form
225
	 */
226 1
	public function uninstall_form() {
227 1
		ob_start();
228
229 1
		$user = wp_get_current_user();
230
		?>
231 1
    <style>
232
        #gv-reason-details {
233
            min-height: 100px;
234
        }
235
        .number-scale label {
236
            border: 1px solid #cccccc;
237
            padding: .5em .75em;
238
            margin: .1em;
239
        }
240
        #gv-uninstall-thanks p {
241
            font-size: 1.2em;
242
        }
243
        .scale-description ul {
244
            margin-bottom: 0;
245
            padding-bottom: 0;
246
        }
247
        .scale-description p.description {
248
            margin-top: 0!important;
249
            padding-top: 0!important;
250
        }
251
        .gv-form-field-wrapper {
252
            margin-top: 30px;
253
        }
254
    </style>
255
256
    <div class="gv-uninstall-form-wrapper" style="font-size: 110%; padding: 15px 0;">
257
        <script>
258
            jQuery( function( $ ) {
259
                $( '#gv-uninstall-feedback' ).on( 'change', function( e ) {
260
261
                    if ( ! $( e.target ).is( ':input' ) ) {
262
                        return;
263
                    }
264
                    var $textarea = $( '.gv-followup' ).find( 'textarea' );
265
                    var followup_text = $( e.target ).attr( 'data-followup' );
266
                    if( ! followup_text ) {
267
                        followup_text = $textarea.attr( 'data-default' );
268
                    }
269
270
                    $textarea.attr( 'placeholder', followup_text );
271
272
                } ).on( 'submit', function( e ) {
273
                    e.preventDefault();
274
275
                    $.post( $( this ).attr( 'action' ), $( this ).serialize() )
276
                        .done( function( data ) {
277
                            if ( 'success' !== data.status ) {
278
                                gv_feedback_append_error_message();
279
                            } else {
280
                                $( '#gv-uninstall-thanks' ).fadeIn();
281
                            }
282
                        })
283
                        .fail( function( data ) {
284
                            gv_feedback_append_error_message();
285
                        } )
286
                        .always( function() {
287
                            $( e.target ).remove();
288
                        } );
289
290
                    return false;
291
                });
292
293
                function gv_feedback_append_error_message() {
294
                    $( '#gv-uninstall-thanks' ).append( '<div class="notice error">' + <?php echo json_encode( esc_html( __( 'There was an error sharing your feedback. Sorry! Please email us at [email protected]', 'gravityview' ) ) ) ?> + '</div>' );
295
                }
296
            });
297
        </script>
298
299
        <form id="gv-uninstall-feedback" method="post" action="https://hooks.zapier.com/hooks/catch/28670/6haevn/">
300
            <h2><?php esc_html_e( 'Why did you uninstall GravityView?', 'gravityview' ); ?></h2>
301
            <ul>
302
				<?php
303 1
                $reasons = $this->get_uninstall_reasons();
304 1
				foreach ( $reasons as $reason ) {
305 1
					printf( '<li><label><input name="reason" type="radio" value="other" data-followup="%s"> %s</label></li>', Utils::get( $reason, 'followup' ), Utils::get( $reason, 'label' ) );
306
				}
307
				?>
308 1
            </ul>
309
            <div class="gv-followup widefat">
310
                <p><strong><label for="gv-reason-details"><?php esc_html_e( 'Comments', 'gravityview' ); ?></label></strong></p>
311
                <textarea id="gv-reason-details" name="reason_details" data-default="<?php esc_attr_e('Please share your thoughts about GravityView', 'gravityview') ?>" placeholder="<?php esc_attr_e('Please share your thoughts about GravityView', 'gravityview'); ?>" class="large-text"></textarea>
312
            </div>
313
            <div class="scale-description">
314
                <p><strong><?php esc_html_e( 'How likely are you to recommend GravityView?', 'gravityview' ); ?></strong></p>
315
                <ul class="inline">
316
					<?php
317 1
					$i = 0;
318 1
					while( $i < 11 ) {
319 1
						echo '<li class="inline number-scale"><label><input name="likely_to_refer" id="likely_to_refer_'.$i.'" value="'.$i.'" type="radio"> '.$i.'</label></li>';
320 1
						$i++;
321
					}
322
					?>
323 1
                </ul>
324
                <p class="description"><?php printf( esc_html_x( '%s ("Not at all likely") to %s ("Extremely likely")', 'A scale from 0 (bad) to 10 (good)', 'gravityview' ), '<label for="likely_to_refer_0"><code>0</code></label>', '<label for="likely_to_refer_10"><code>10</code></label>' ); ?></p>
325
            </div>
326
327
            <div class="gv-form-field-wrapper">
328
                <label><input type="checkbox" class="checkbox" name="follow_up_with_me" value="1" /> <?php esc_html_e( 'Please follow up with me about my feedback', 'gravityview' ); ?></label>
329
            </div>
330
331
            <div class="submit">
332
                <input type="hidden" name="siteurl" value="<?php echo esc_url( get_bloginfo( 'url' ) ); ?>" />
333
                <input type="hidden" name="email" value="<?php echo esc_attr( $user->user_email ); ?>" />
334
                <input type="hidden" name="display_name" value="<?php echo esc_attr( $user->display_name ); ?>" />
335
                <input type="submit" value="<?php esc_html_e( 'Send Us Your Feedback', 'gravityview' ); ?>" class="button button-primary button-hero" />
336
            </div>
337
        </form>
338
339
        <div id="gv-uninstall-thanks" class="notice notice-large notice-updated below-h2" style="display:none;">
340
            <h3 class="notice-title"><?php esc_html_e( 'Thank you for using GravityView!', 'gravityview' ); ?></h3>
341
            <p><?php echo gravityview_get_floaty(); ?>
342
				<?php echo make_clickable( esc_html__( 'Your feedback helps us improve GravityView. If you have any questions or comments, email us: [email protected]', 'gravityview' ) ); ?>
343 1
            </p>
344
            <div class="wp-clearfix"></div>
345
        </div>
346
    </div>
347
		<?php
348 1
		$form = ob_get_clean();
349
350 1
		return $form;
351
	}
352
353 1
	public function app_settings_uninstall_tab() {
354 1
		if ( $this->maybe_uninstall() ) {
355
			parent::app_settings_uninstall_tab();
356
			return;
357
		}
358
359 1
		if ( ! ( $this->current_user_can_any( $this->_capabilities_uninstall ) && ( ! function_exists( 'is_multisite' ) || ! is_multisite() || is_super_admin() ) ) ) {
360
			return;
361
		}
362
363
		?>
364 1
		<script>
365
			jQuery( document ).on( 'click', 'a[rel="gv-uninstall-wrapper"]', function( e ) {
366
				e.preventDefault();
367
				jQuery( '#gv-uninstall-wrapper' ).slideToggle();
368
			} );
369
		</script>
370
371
		<a rel="gv-uninstall-wrapper" href="#gv-uninstall-wrapper" class="button button-large alignright button-danger">Uninstall GravityView</a>
372
373
		<div id="gv-uninstall-wrapper">
374
			<form action="" method="post">
375
				<?php wp_nonce_field( 'uninstall', 'gf_addon_uninstall' ) ?>
376 1
				<div class="delete-alert alert_red">
377
378
					<h3>
379
						<i class="fa fa-exclamation-triangle gf_invalid"></i> <?php esc_html_e( 'Delete all GravityView content and settings', 'gravityview' ); ?>
380 1
					</h3>
381
382
					<div class="gf_delete_notice">
383
						<?php echo $this->uninstall_warning_message() ?>
384 1
					</div>
385
386
					<?php
387 1
					echo '<input type="submit" name="uninstall" value="' . sprintf( esc_attr__( 'Uninstall %s', 'gravityview' ), $this->get_short_title() ) . '" class="button button-hero" onclick="return confirm( ' . json_encode( $this->uninstall_confirm_message() ) . ' );" onkeypress="return confirm( ' . json_encode( $this->uninstall_confirm_message() ) . ' );"/>';
388
					?>
389
390
				</div>
391
			</form>
392
		</div>
393
	<?php
394 1
	}
395
396 1
	public function app_settings_tab() {
397 1
	    parent::app_settings_tab();
398
399 1
		if ( $this->maybe_uninstall() ) {
400
            echo $this->uninstall_form();
401
		}
402 1
    }
403
404
	/**
405
	 * The Settings title
406
	 *
407
	 * @return string
408
	 */
409 1
	public function app_settings_title() {
410 1
		return null;
411
	}
412
413
	/**
414
	 * Prevent displaying of any icon
415
	 *
416
	 * @return string
417
	 */
418 1
	public function app_settings_icon() {
419 1
		return '&nbsp;';
420
	}
421
422
	/**
423
	 * Retrieve a setting.
424
	 *
425
	 * @deprecated Use \GV\Addon_Settings::get
426
	 * @param string $setting_name The setting key.
427
	 *
428
	 * @return mixed The setting or null
429
	 */
430 1
	public function get_app_setting( $setting_name ) {
431 1
		return $this->get( $setting_name );
432
	}
433
434
	/**
435
	 * Retrieve a setting.
436
	 *
437
	 * @param string $key The setting key.
438
	 * @param string $default A default if not found.
439
	 *
440
	 * @return mixed The setting value.
441
	 */
442 188
	public function get( $key, $default = null ) {
443
		/**
444
		 * Backward compatibility with Redux
445
		 */
446 188
		if ( $key === 'license' ) {
447
			return array(
448 2
				'license' => $this->get( 'license_key' ),
449 2
				'status' => $this->get( 'license_key_status' ),
450 2
				'response' => $this->get( 'license_key_response' ),
451
			);
452
		}
453
454 188
		return Utils::get( $this->all(), $key, $default );
455
	}
456
457
	/**
458
	 * Get the setting for GravityView by name
459
	 *
460
	 * @deprecated Use gravityview()->plugin->settings->get()
461
	 * @param  string $key     Option key to fetch
462
	 *
463
	 * @return mixed
464
	 */
465 1
	static public function getSetting( $key ) {
466 1
		if ( gravityview()->plugin->settings instanceof Addon_Settings ) {
467 1
			return gravityview()->plugin->settings->get( $key );
468
		}
469
	}
470
471
	/**
472
	 * Get all settings.
473
	 *
474
	 * @deprecated Use \GV\Addon_Settings::all() or \GV\Addon_Settings::get()
475
	 *
476
	 * @return array The settings.
477
	 */
478 1
	public function get_app_settings() {
479 1
		return $this->all();
480
	}
481
482
	/**
483
	 * Get all the settings.
484
	 *
485
	 * @return array The settings.
486
	 */
487 188
	public function all() {
488 188
		$option_name  = 'gravityformsaddon_' . $this->_slug . '_app_settings';
489
490 188
		$option_value = get_option( $option_name, array() );
491
492 188
		return wp_parse_args( $option_value, $this->defaults() );
493
	}
494
495
	/**
496
	 * Default settings.
497
	 *
498
	 * @deprecated Use \GV\Addon_Settings::defaults()
499
	 *
500
	 * @return array The defaults.
501
	 */
502 1
	public function get_default_settings() {
503 1
		return $this->defaults();
504
	}
505
506
	/**
507
	 * Default settings.
508
	 *
509
	 * @return array The defaults.
510
	 */
511 188
	private function defaults() {
512
		$defaults = array(
513
			// Set the default license in wp-config.php
514 188
			'license_key'          => defined( 'GRAVITYVIEW_LICENSE_KEY' ) ? GRAVITYVIEW_LICENSE_KEY : '',
515 188
			'license_key_response' => '',
516 188
			'license_key_status'   => '',
517 188
			'support-email'        => get_bloginfo( 'admin_email' ),
518 188
			'no-conflict-mode'     => '1',
519 188
			'support_port'         => '1',
520 188
			'flexbox_search'       => '1',
521 188
			'rest_api'             => '0',
522 188
			'beta'                 => '0',
523
		);
524
525
		/**
526
		 * @filter `gravityview/settings/default` Filter default global settings.
527
		 * @param[in,out] array The defaults.
528
		 */
529 188
		return apply_filters( 'gravityview/settings/defaults', $defaults );
530
	}
531
532
	/***
533
	 * Renders the save button for settings pages
534
	 *
535
	 * @param array $field - Field array containing the configuration options of this field
536
	 * @param bool  $echo  = true - true to echo the output to the screen, false to simply return the contents as a string
537
	 *
538
	 * @return string The HTML
539
	 */
540 2
	public function as_html( $field, $echo = true ) {
541 2
		$field['type']  = ( isset( $field['type'] ) && in_array( $field['type'], array( 'submit','reset','button' ) ) ) ? $field['type'] : 'submit';
542
543 2
		$attributes    = $this->get_field_attributes( $field );
544 2
		$default_value = Utils::get( $field, 'value', Utils::get( $field, 'default_value' ) );
545 2
		$value         = $this->get( $field['name'], $default_value );
546
547
548 2
		$attributes['class'] = isset( $attributes['class'] ) ? esc_attr( $attributes['class'] ) : 'button-primary gfbutton';
549 2
		$name    = ( $field['name'] === 'gform-settings-save' ) ? $field['name'] : '_gaddon_setting_' . $field['name'];
550
551 2
		if ( empty( $value ) ) {
552 2
			$value = __( 'Update Settings', 'gravityview' );
553
		}
554
555 2
		$attributes = $this->get_field_attributes( $field );
556
557
		$html = '<input
558 2
                    type="' . $field['type'] . '"
559 2
                    name="' . esc_attr( $name ) . '"
560 2
                    value="' . $value . '" ' .
561 2
		        implode( ' ', $attributes ) .
562 2
		        ' />';
563
564 2
		if ( $echo ) {
565
			echo $html;
566
		}
567
568 2
		return $html;
569
	}
570
571
	/**
572
	 * @deprecated Use \GV\Addon_Settings::as_html
573
	 */
574 1
	public function settings_submit( $field, $echo = true ) {
575 1
		gravityview()->log->warning( '\GV\Addon_Settings::settings_submit has been deprecated for \GV\Addon_Settings::as_html' );
576 1
		return $this->as_html( $field, $echo );
577
	}
578
579
	/**
580
     * Check whether GravityView is being saved
581
     *
582
     * The generic is_save_postback() is true for all addons
583
     *
584
     * @since 2.0.8
585
     *
586
	 * @return bool
587
	 */
588 1
	public function is_save_postback() {
589 1
		return isset( $_POST['gform-settings-save'] ) && isset( $_POST['_gravityview_save_settings_nonce'] );
590
	}
591
592
	/**
593
	 * Display a notice if the plugin is inactive.
594
	 *
595
	 * @return void
596
	 */
597
	public function license_key_notice() {
598
599
	    if( $this->is_save_postback() ) {
600
		    $settings = $this->get_posted_settings();
601
		    $license_key = \GV\Utils::get( $settings, 'license_key' );
602
		    $license_status = \GV\Utils::get( $settings, 'license_key_status', 'inactive' );
603
        } else {
604
		    $license_status = $this->get( 'license_key_status', 'inactive' );
605
		    $license_key    = $this->get( 'license_key' );
606
	    }
607
608
	    $license_id = empty( $license_key ) ? 'license' : $license_key;
609
610
		$message = esc_html__( 'Your GravityView license %s. This means you&rsquo;re missing out on updates and support! %sActivate your license%s or %sget a license here%s.', 'gravityview' );
611
612
		/** @internal Do not use! Will change without notice (pun slightly intended). */
613
		$message = apply_filters( 'gravityview/settings/license-key-notice', $message );
614
615
		/**
616
		 * I wanted to remove the period from after the buttons in the string,
617
		 * but didn't want to mess up the translation strings for the translators.
618
		 */
619
		$message = mb_substr( $message, 0, mb_strlen( $message ) - 1 );
620
		$title = __( 'Inactive License', 'gravityview');
621
		$status = '';
622
		$update_below = false;
623
		$primary_button_link = admin_url( 'edit.php?post_type=gravityview&amp;page=gravityview_settings' );
624
625
        switch ( $license_status ) {
626
			/** @since 1.17 */
627
			case 'expired':
628
				$title = __( 'Expired License', 'gravityview' );
629
				$status = 'expired';
630
				$message = $this->get_license_handler()->strings( 'expired', $this->get( 'license_key_response' ) );
631
				break;
632
			case 'invalid':
633
				$title = __( 'Invalid License', 'gravityview' );
634
				$status = __( 'is invalid', 'gravityview' );
635
				break;
636
			case 'deactivated':
637
				$status = __( 'is inactive', 'gravityview' );
638
				$update_below = __( 'Activate your license key below.', 'gravityview' );
639
				break;
640
			/** @noinspection PhpMissingBreakStatementInspection */
641
			case '':
642
				$license_status = 'site_inactive';
643
				// break intentionally left blank
644
			case 'inactive':
645
			case 'site_inactive':
646
				$status = __( 'has not been activated', 'gravityview' );
647
				$update_below = __( 'Activate your license key below.', 'gravityview' );
648
				break;
649
		}
650
		$url = 'https://gravityview.co/pricing/?utm_source=admin_notice&utm_medium=admin&utm_content='.$license_status.'&utm_campaign=Admin%20Notice';
651
652
		// Show a different notice on settings page for inactive licenses (hide the buttons)
653
		if ( $update_below && gravityview()->request->is_admin( '', 'settings' ) ) {
0 ignored issues
show
Unused Code introduced by
The call to Request::is_admin() has too many arguments starting with ''.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
Unused Code introduced by
The call to Frontend_Request::is_admin() has too many arguments starting with ''.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
654
			$message = sprintf( $message, $status, '<div class="hidden">', '', '', '</div><a href="#" onclick="jQuery(\'#license_key\').focus(); return false;">' . $update_below . '</a>' );
655
		} else {
656
			$message = sprintf( $message, $status, "\n\n" . '<a href="' . esc_url( $primary_button_link ) . '" class="button button-primary">', '</a>', '<a href="' . esc_url( $url ) . '" class="button button-secondary">', '</a>' );
657
		}
658
659
		if ( empty( $status ) ) {
660
			return;
661
		}
662
663
        \GravityView_Admin_Notices::add_notice( array(
664
            'message' => $message,
665
            'class'   => 'notice notice-warning',
666
            'title'   => $title,
667
            'cap'     => 'gravityview_edit_settings',
668
            'dismiss' => sha1( $license_status . '_' . $license_id . '_' . date( 'z' ) ), // Show every day, instead of every 8 weeks (which is the default)
669
        ) );
670
	}
671
672
	/**
673
	 * Allow public access to the GV\License_Handler class
674
	 * @since 1.7.4
675
	 *
676
	 * @return \GV\License_Handler
677
	 */
678 1
	public function get_license_handler() {
679 1
		return $this->License_Handler;
680
	}
681
682
	/**
683
     * Add tooltip script to app settings page. Not enqueued by Gravity Forms for some reason.
684
     *
685
     * @since 1.21.5
686
     *
687
     * @see GFAddOn::scripts()
688
     *
689
	 * @return array Array of scripts
690
	 */
691 23
	public function scripts() {
692 23
		$scripts = parent::scripts();
693
694 23
		$scripts[] = array(
695
			'handle'  => 'gform_tooltip_init',
696
			'enqueue' => array(
697
                array(
698
			        'admin_page' => array( 'app_settings' )
699
                )
700
            )
701
		);
702
703 23
		return $scripts;
704
	}
705
706
	/**
707
	 * Register styles in the app admin page
708
	 * @return array
709
	 */
710 23
	public function styles() {
711 23
		$styles = parent::styles();
712
713 23
		$styles[] = array(
714 23
			'handle'  => 'gravityview_settings',
715 23
			'src'     => plugins_url( 'assets/css/admin-settings.css', GRAVITYVIEW_FILE ),
716 23
			'version' => Plugin::$version,
717
			'deps' => array(
718
                'gform_admin',
719
				'gaddon_form_settings_css',
720
                'gform_tooltip',
721
                'gform_font_awesome',
722
			),
723
			'enqueue' => array(
724
				array( 'admin_page' => array(
725
					'app_settings',
726
				) ),
727
			)
728
		);
729
730 23
		return $styles;
731
	}
732
733
	/**
734
	 * Add Settings link to GravityView menu
735
	 * @return void
736
	 */
737 1
	public function create_app_menu() {
738
		/**
739
		 * If not multisite, always show.
740
		 * If multisite and the plugin is network activated, show; we need to register the submenu page for the Network Admin settings to work.
741
		 * If multisite and not network admin, we don't want the settings to show.
742
		 * @since 1.7.6
743
		 */
744 1
		$show_submenu = ( ! is_multisite() ) ||  is_main_site() || ( ! gravityview()->plugin->is_network_activated() ) || ( is_network_admin() && gravityview()->plugin->is_network_activated() );
745
746
		/**
747
		 * Override whether to show the Settings menu on a per-blog basis.
748
		 * @since 1.7.6
749
		 * @param bool $hide_if_network_activated Default: true
750
		 */
751 1
		$show_submenu = apply_filters( 'gravityview/show-settings-menu', $show_submenu );
752
753 1
		if ( $show_submenu ) {
754 1
			add_submenu_page( 'edit.php?post_type=gravityview', __( 'Settings', 'gravityview' ), __( 'Settings', 'gravityview' ), $this->_capabilities_app_settings, $this->_slug . '_settings', array( $this, 'app_tab_page' ) );
755
		}
756 1
	}
757
758
	/**
759
	 * Gets the required indicator
760
	 * Gets the markup of the required indicator symbol to highlight fields that are required
761
	 *
762
	 * @param $field - The field meta.
763
	 *
764
	 * @return string - Returns markup of the required indicator symbol
765
	 */
766 1
	public function get_required_indicator( $field ) {
767 1
		return '<span class="required" title="' . esc_attr__( 'Required', 'gravityview' ) . '">*</span>';
768
	}
769
770
	/**
771
	 * Specify the settings fields to be rendered on the plugin settings page
772
	 *
773
	 * @return array
774
	 */
775 1
	public function app_settings_fields() {
776 1
		$default_settings = $this->defaults();
777
778 1
		$disabled_attribute = \GVCommon::has_cap( 'gravityview_edit_settings' ) ? false : 'disabled';
779
780
		$fields = array(
781
			array(
782 1
				'name' => 'gv_header',
783
				'value' => '',
784
				'type' => 'html',
785
			),
786
			array(
787 1
				'name' => 'license_key',
788
				'required' => true,
789 1
				'label' => __( 'License Key', 'gravityview' ),
790 1
				'description' => __( 'Enter the license key that was sent to you on purchase. This enables plugin updates &amp; support.', 'gravityview' ) . $this->get_license_handler()->license_details( $this->get_app_setting( 'license_key_response' ) ),
0 ignored issues
show
Deprecated Code introduced by
The method GV\Addon_Settings::get_app_setting() has been deprecated with message: Use \GV\Addon_Settings::get

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
791 1
				'type' => 'edd_license',
792 1
				'disabled' => ( defined( 'GRAVITYVIEW_LICENSE_KEY' )  && GRAVITYVIEW_LICENSE_KEY ),
793 1
				'data-pending-text' => __( 'Verifying license&hellip;', 'gravityview' ),
794 1
				'default_value' => $default_settings['license_key'],
795 1
				'class' => ( '' == $this->get( 'license_key' ) ) ? 'activate code regular-text edd-license-key' : 'deactivate code regular-text edd-license-key',
796
			),
797
			array(
798 1
				'name' => 'license_key_response',
799 1
				'default_value' => $default_settings['license_key_response'],
800 1
				'type' => 'hidden',
801
			),
802
			array(
803 1
				'name' => 'license_key_status',
804 1
				'default_value' => $default_settings['license_key_status'],
805 1
				'type' => 'hidden',
806
			),
807
			array(
808 1
				'name' => 'support-email',
809 1
				'type' => 'text',
810 1
				'validate' => 'email',
811 1
				'default_value' => $default_settings['support-email'],
812 1
				'label' => __( 'Support Email', 'gravityview' ),
813 1
				'description' => __( 'In order to provide responses to your support requests, please provide your email address.', 'gravityview' ),
814 1
				'class' => 'code regular-text',
815
			),
816
			/**
817
			 * @since 1.15 Added Support Port support
818
			 */
819
			array(
820 1
				'name' => 'support_port',
821 1
				'type' => 'radio',
822 1
				'label' => __( 'Show Support Port?', 'gravityview' ),
823 1
				'default_value' => $default_settings['support_port'],
824 1
				'horizontal' => 1,
825
				'choices' => array(
826
					array(
827 1
						'label' => _x( 'Show', 'Setting: Show or Hide', 'gravityview' ),
828 1
						'value' => '1',
829
					),
830
					array(
831 1
						'label' => _x( 'Hide', 'Setting: Show or Hide', 'gravityview' ),
832 1
						'value' => '0',
833
					),
834
				),
835 1
				'tooltip' => '<p><img src="' . esc_url_raw( plugins_url( 'assets/images/beacon.png', GRAVITYVIEW_FILE ) ) . '" alt="' . esc_attr__( 'The Support Port looks like this.', 'gravityview' ) . '" class="alignright" style="max-width:40px; margin:.5em;" />' . esc_html__( 'The Support Port provides quick access to how-to articles and tutorials. For administrators, it also makes it easy to contact support.', 'gravityview' ) . '</p>',
836 1
				'description' => __( 'Show the Support Port on GravityView pages?', 'gravityview' ),
837
			),
838
			array(
839 1
				'name' => 'no-conflict-mode',
840 1
				'type' => 'radio',
841 1
				'label' => __( 'No-Conflict Mode', 'gravityview' ),
842 1
				'default_value' => $default_settings['no-conflict-mode'],
843 1
				'horizontal' => 1,
844
				'choices' => array(
845
					array(
846 1
						'label' => _x( 'On', 'Setting: On or off', 'gravityview' ),
847 1
						'value' => '1',
848
					),
849
					array(
850 1
						'label' => _x( 'Off', 'Setting: On or off', 'gravityview' ),
851 1
						'value' => '0',
852
					),
853
				),
854 1
				'description'   => __( 'Set this to ON to prevent extraneous scripts and styles from being printed on GravityView admin pages, reducing conflicts with other plugins and themes.', 'gravityview' ) . ' ' . __( 'If your Edit View tabs are ugly, enable this setting.', 'gravityview' ),
855
			),
856
			/**
857
			 * @since 2.0 Added REST API
858
			 */
859 1
			gravityview()->plugin->supports( Plugin::FEATURE_REST ) ?
860
				array(
861 1
					'name' => 'rest_api',
862 1
					'type' => 'radio',
863 1
					'label' => __( 'REST API', 'gravityview' ),
864 1
					'default_value' => $default_settings['rest_api'],
865 1
					'horizontal' => 1,
866
					'choices' => array(
867
						array(
868 1
							'label' => _x( 'Enable', 'Setting: Enable or Disable', 'gravityview' ),
869 1
							'value' => '1',
870
						),
871
						array(
872 1
							'label' => _x( 'Disable', 'Setting: Enable or Disable', 'gravityview' ),
873 1
							'value' => '0',
874
						),
875
					),
876 1
					'description' => __( 'Enable View and Entry access via the REST API? Regular per-View restrictions apply (private, password protected, etc.).', 'gravityview' ),
877 1
					'tooltip' => '<p>' . esc_html__( 'If you are unsure, choose the Disable setting.', 'gravityview' ) . '</p>',
878
				) : array(),
879
			array(
880 1
				'name' => 'beta',
881 1
				'type' => 'checkbox',
882 1
				'label' => __( 'Become a Beta Tester', 'gravityview' ),
883 1
				'default_value' => $default_settings['beta'],
884 1
				'horizontal' => 1,
885
				'choices' => array(
886
					array(
887 1
						'label' => esc_html__( 'Show me beta versions if they are available.', 'gravityview' ),
888 1
						'value' => '1',
889 1
                        'name'  => 'beta',
890
					),
891
				),
892 1
				'description'   => __( 'You will have early access to the latest GravityView features and improvements. There may be bugs! If you encounter an issue, help make GravityView better by reporting it!', 'gravityview' ),
893
			),
894
		);
895
896 1
		$fields = array_filter( $fields, 'count' );
897
898
		/**
899
		 * @filter `gravityview_settings_fields` Filter the settings fields.
900
		 * @param array $fields The fields to filter.
901
		 * @deprecated Use `gravityview/settings/fields`.
902
		 */
903 1
		$fields = apply_filters( 'gravityview_settings_fields', $fields );
904
905
		/**
906
		 * @filter `gravityview/settings/fields` Filter the settings fields.
907
		 * @param array $fields The fields to filter.
908
		 */
909 1
		$fields = apply_filters( 'gravityview/settings/fields', $fields );
910
911
		/**
912
		 * Redux backward compatibility
913
		 * @since 1.7.4
914
		 */
915 1
		foreach ( $fields as &$field ) {
916 1
			$field['name']          = isset( $field['name'] ) ? $field['name'] : Utils::get( $field, 'id' );
917 1
			$field['label']         = isset( $field['label'] ) ? $field['label'] : Utils::get( $field, 'title' );
918 1
			$field['default_value'] = isset( $field['default_value'] ) ? $field['default_value'] : Utils::get( $field, 'default' );
919 1
			$field['description']   = isset( $field['description'] ) ? $field['description'] : Utils::get( $field, 'subtitle' );
920
921 1
			if ( $disabled_attribute ) {
922
				$field['disabled']  = $disabled_attribute;
923
			}
924
925 1
			if ( empty( $field['disabled'] ) ) {
926 1
				unset( $field['disabled'] );
927
            }
928
		}
929
930
        $sections = array(
931
            array(
932 1
                'description' => sprintf( '<span class="version-info description">%s</span>', sprintf( __( 'You are running GravityView version %s', 'gravityview' ), Plugin::$version ) ),
933 1
                'fields'      => $fields,
934
            )
935
        );
936
937
        // custom 'update settings' button
938
        $button = array(
939 1
            'class' => 'button button-primary button-hero',
940
            'type' => 'save',
941
        );
942
943 1
		if ( $disabled_attribute ) {
944
			$button['disabled'] = $disabled_attribute;
945
		}
946
947
        /**
948
         * @filter `gravityview/settings/extension/sections` Modify the GravityView settings page
949
         * Extensions can tap in here to insert their own section and settings.
950
         * <code>
951
         *   $sections[] = array(
952
         *      'title' => __( 'GravityView My Extension Settings', 'gravityview' ),
953
         *      'fields' => $settings,
954
         *   );
955
         * </code>
956
         * @param array $extension_settings Empty array, ready for extension settings!
957
         */
958 1
        $extension_sections = apply_filters( 'gravityview/settings/extension/sections', array() );
959
960
		// If there are extensions, add a section for them
961 1
		if ( ! empty( $extension_sections ) ) {
962
963
			if( $disabled_attribute ) {
964
				foreach ( $extension_sections as &$section ) {
965
					foreach ( $section['fields'] as &$field ) {
966
						$field['disabled'] = $disabled_attribute;
967
					}
968
				}
969
			}
970
971
            $k = count( $extension_sections ) - 1 ;
972
            $extension_sections[ $k ]['fields'][] = $button;
973
			$sections = array_merge( $sections, $extension_sections );
974
		} else {
975
            // add the 'update settings' button to the general section
976 1
            $sections[0]['fields'][] = $button;
977
        }
978
979 1
		return $sections;
980
	}
981
982
	/**
983
	 * Updates app settings with the provided settings
984
	 *
985
	 * Same as the GFAddon, except it returns the value from update_option()
986
	 *
987
	 * @param array $settings - App settings to be saved
988
	 *
989
	 * @deprecated Use \GV\Addon_Settings::set or \GV\Addon_Settings::update
990
	 *
991
	 * @return boolean False if value was not updated and true if value was updated.
992
	 */
993
	public function update_app_settings( $settings ) {
994
		return $this->update( $settings );
995
	}
996
997
	/**
998
	 * Sets a subset of settings.
999
	 *
1000
	 * @param array|string An array of settings to update, or string (key) and $value to update one setting.
1001
	 * @param mixed $value A value if $settings is string (key). Default: null.
1002
	 */
1003 4
	public function set( $settings, $value = null ) {
1004 4
		if ( is_string( $settings ) ) {
1005 2
			$settings = array( $settings => $value );
1006
		}
1007 4
		$settings = wp_parse_args( $settings, $this->all() );
1008 4
		return update_option( 'gravityformsaddon_' . $this->_slug . '_app_settings', $settings );
1009
	}
1010
1011
	/**
1012
	 * Updates settings.
1013
	 *
1014
	 * @param array $settings The settings array.
1015
	 *
1016
	 * @return boolean False if value was not updated and true if value was updated.
1017
	 */
1018 1
	public function update( $settings ) {
1019 1
		return update_option( 'gravityformsaddon_' . $this->_slug . '_app_settings', $settings );
1020
	}
1021
1022
	/**
1023
	 * Register the settings field for the EDD License field type
1024
	 * @param array $field
1025
	 * @param bool $echo Whether to echo the
1026
	 *
1027
	 * @return string
1028
	 */
1029 1
	protected function settings_edd_license( $field, $echo = true ) {
1030
1031 1
	    if ( defined( 'GRAVITYVIEW_LICENSE_KEY' ) && GRAVITYVIEW_LICENSE_KEY ) {
1032
		    $field['input_type'] = 'password';
1033
        }
1034
1035 1
		$text = $this->settings_text( $field, false );
1036
1037 1
		$activation = $this->License_Handler->settings_edd_license_activation( $field, false );
1038
1039 1
		$return = $text . $activation;
1040
1041 1
		if ( $echo ) {
1042 1
			echo $return;
1043
		}
1044
1045 1
		return $return;
1046
	}
1047
1048
	/**
1049
	 * Allow pure HTML settings row
1050
     *
1051
     * @since 2.0.6
1052
     *
1053
	 * @param array $field
1054
	 * @param bool $echo Whether to echo the
1055
	 *
1056
	 * @return string
1057
	 */
1058 1
	protected function settings_html( $field, $echo = true ) {
1059
1060 1
		$return = \GV\Utils::get( $field, 'value', '' );
1061
1062 1
		if ( $echo ) {
1063 1
			echo $return;
1064
		}
1065
1066 1
		return $return;
1067
	}
1068
1069
	/**
1070
	 * No <th> needed for pure HTML settings row
1071
	 *
1072
	 * @since 2.0.6
1073
	 *
1074
	 * @param array $field
1075
	 *
1076
	 * @return void
1077
	 */
1078 1
	public function single_setting_row_html( $field ) {
1079
		?>
1080
1081
        <tr id="gaddon-setting-row-<?php echo esc_attr( $field['name'] ); ?>">
1082
            <td colspan="2">
1083
				<?php $this->single_setting( $field ); ?>
1084 1
            </td>
1085
        </tr>
1086
1087
		<?php
1088 1
	}
1089
1090
	/**
1091
	 * Allow customizing the Save field parameters
1092
	 *
1093
	 * @param array $field
1094
	 * @param bool $echo
1095
	 *
1096
	 * @return string
1097
	 */
1098 1
	public function settings_save( $field, $echo = true ) {
1099 1
		$field['type']  = 'submit';
1100 1
		$field['name']  = 'gform-settings-save';
1101 1
		$field['class'] = isset( $field['class'] ) ? $field['class'] : 'button-primary gfbutton';
1102 1
		$field['value'] = Utils::get( $field, 'value', __( 'Update Settings', 'gravityview' ) );
1103
1104 1
		$output = $this->settings_submit( $field, false );
0 ignored issues
show
Deprecated Code introduced by
The method GV\Addon_Settings::settings_submit() has been deprecated with message: Use \GV\Addon_Settings::as_html

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
1105
1106 1
		ob_start();
1107 1
		$this->app_settings_uninstall_tab();
1108 1
		$output .= ob_get_clean();
1109
1110 1
		if ( $echo ) {
1111 1
			echo $output;
1112
		}
1113
1114 1
		return $output;
1115
	}
1116
1117
	/**
1118
     * Keep GravityView styling for `$field['description']`, even though Gravity Forms added support for it
1119
     *
1120
     * Converts `$field['description']` to `$field['gv_description']`
1121
     * Converts `$field['subtitle']` to `$field['description']`
1122
     *
1123
     * @see \GV\Addon_Settings::single_setting_label Converts `gv_description` back to `description`
1124
     * @see http://share.gravityview.co/P28uGp/2OIRKxog for image that shows subtitle vs description
1125
     *
1126
     * @since 1.21.5.2
1127
     *
1128
	 * @param array $field
1129
     *
1130
     * @return void
1131
	 */
1132 1
	public function single_setting_row( $field ) {
1133 1
		$field['gv_description'] = Utils::get( $field, 'description' );
1134 1
		$field['description']    = Utils::get( $field, 'subtitle' );
1135 1
		parent::single_setting_row( $field );
1136 1
	}
1137
1138
	/**
1139
	 * The same as the parent, except added support for field descriptions
1140
	 * @inheritDoc
1141
	 * @param $field array
1142
	 */
1143 1
	public function single_setting_label( $field ) {
1144 1
		parent::single_setting_label( $field );
1145 1
		if ( $description = Utils::get( $field, 'gv_description' ) ) {
1146 1
			echo '<span class="description">'. $description .'</span>';
1147
		}
1148 1
	}
1149
1150
	/**
1151
	 * Check for the `gravityview_edit_settings` capability before saving plugin settings.
1152
	 * Gravity Forms says you're able to edit if you're able to view settings. GravityView allows two different permissions.
1153
	 *
1154
	 * @since 1.15
1155
	 * @return void
1156
	 */
1157 1
	public function maybe_save_app_settings() {
1158
1159 1
		if ( $this->is_save_postback() ) {
1160
			if ( ! \GVCommon::has_cap( 'gravityview_edit_settings' ) ) {
1161
				$_POST = array(); // If you don't reset the $_POST array, it *looks* like the settings were changed, but they weren't
1162
				\GFCommon::add_error_message( __( 'You don\'t have the ability to edit plugin settings.', 'gravityview' ) );
1163
				return;
1164
			}
1165
		}
1166 1
		parent::maybe_save_app_settings();
1167 1
	}
1168
1169
	/**
1170
	 * When the settings are saved, make sure the license key matches the previously activated key
1171
	 *
1172
	 * @return array settings from parent::get_posted_settings(), with `license_key_response` and `license_key_status` potentially unset
1173
	 */
1174 1
	public function get_posted_settings() {
1175 1
		$posted_settings = parent::get_posted_settings();
1176
1177 1
		$local_key = Utils::get( $posted_settings, 'license_key' );
1178 1
		$response_key = Utils::get( $posted_settings, 'license_key_response/license_key' );
1179
1180 1
		static $added_message = false;
1181
1182
		// If the posted key doesn't match the activated/deactivated key (set using the Activate License button, AJAX response),
1183
		// then we assume it's changed. If it's changed, unset the status and the previous response.
1184 1
		if ( ! $added_message && ( $local_key !== $response_key ) ) {
1185
1186
			unset( $posted_settings['license_key_response'] );
1187
			unset( $posted_settings['license_key_status'] );
1188
1189
			\GFCommon::add_error_message( __('The license key you entered has been saved, but not activated. Please activate the license.', 'gravityview' ) );
1190
1191
			$added_message = true;
1192
		}
1193 1
		return $posted_settings;
1194
	}
1195
}
1196