GravityView  2.5
The best, easiest way to display Gravity Forms entries on your website.
class-gv-settings-addon.php
Go to the documentation of this file.
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  */
58 
59  /**
60  * @var bool Whether we have initialized already or not.
61  */
62  private static $initialized = false;
63 
64  public function __construct() {
65  $this->_version = Plugin::$version;
66  $this->_min_gravityforms_version = Plugin::$min_gf_version;
67 
68  /**
69  * Hook everywhere, but only once.
70  */
71  if ( ! self::$initialized ) {
72  parent::__construct();
73  self::$initialized = true;
74  }
75  }
76 
77  /**
78  * Run actions when initializing admin.
79  *
80  * Triggers the license key notice, et.c
81  *
82  * @return void
83  */
84  public function init_admin() {
85  $this->_load_license_handler();
86 
87  add_action( 'admin_head', array( $this, 'license_key_notice' ) );
88 
89  add_filter( 'gform_addon_app_settings_menu_gravityview', array( $this, 'modify_app_settings_menu_title' ) );
90 
91  /** @since 1.7.6 */
92  add_action( 'network_admin_menu', array( $this, 'add_network_menu' ) );
93 
94  parent::init_admin();
95  }
96 
97  /**
98  * Change the settings page header title to "GravityView"
99  *
100  * @param $setting_tabs
101  *
102  * @return array
103  */
104  public function modify_app_settings_menu_title( $setting_tabs ) {
105  $setting_tabs[0]['label'] = __( 'GravityView Settings', 'gravityview' );
106  return $setting_tabs;
107  }
108 
109  /**
110  * Load license handler in admin-ajax.php
111  *
112  * @return void
113  */
114  public function init_ajax() {
115  $this->_load_license_handler();
116  }
117 
118  /**
119  * Make sure the license handler is available
120  *
121  * @return void
122  */
123  private function _load_license_handler() {
124  if ( ! empty( $this->License_Handler ) ) {
125  return;
126  }
127  $this->License_Handler = License_Handler::get( $this );
128  }
129 
130  /**
131  * Add global Settings page for Multisite
132  * @since 1.7.6
133  * @return void
134  */
135  public function add_network_menu() {
136 
137  if ( ! gravityview()->plugin->is_network_activated() ) {
138  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  public function uninstall() {
152  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  $this->_path = GRAVITYVIEW_FILE;
160 
161  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  public function current_user_can_any( $caps ) {
175  if ( empty( $caps ) ) {
176  $caps = array( 'gravityview_full_access' );
177  }
178  return \GVCommon::has_cap( $caps );
179  }
180 
181  public function uninstall_warning_message() {
182  $heading = esc_html__( 'If you delete then re-install GravityView, it will be like installing GravityView for the first time.', 'gravityview' );
183  $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  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  private function get_uninstall_reasons() {
195  $reasons = array(
196  'will-continue' => array(
197  'label' => esc_html__( 'I am going to continue using GravityView', 'gravityview' ),
198  ),
199  'no-longer-need' => array(
200  'label' => esc_html__( 'I no longer need GravityView', 'gravityview' ),
201  ),
202  'doesnt-work' => array(
203  'label' => esc_html__( 'The plugin doesn\'t work', 'gravityview' ),
204  ),
205  'found-other' => array(
206  'label' => esc_html__( 'I found a better plugin', 'gravityview' ),
207  'followup' => esc_attr__( 'What plugin you are using, and why?', 'gravityview' ),
208  ),
209  'other' => array(
210  'label' => esc_html__( 'Other', 'gravityview' ),
211  ),
212  );
213 
214  shuffle( $reasons );
215 
216  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  public function uninstall_form() {
227  ob_start();
228 
229  $user = wp_get_current_user();
230  ?>
231  <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 support@gravityview.co', '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  $reasons = $this->get_uninstall_reasons();
304  foreach ( $reasons as $reason ) {
305  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  </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  $i = 0;
318  while( $i < 11 ) {
319  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  $i++;
321  }
322  ?>
323  </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: support@gravityview.co', 'gravityview' ) ); ?>
343  </p>
344  <div class="wp-clearfix"></div>
345  </div>
346  </div>
347  <?php
348  $form = ob_get_clean();
349 
350  return $form;
351  }
352 
353  public function app_settings_uninstall_tab() {
354  if ( $this->maybe_uninstall() ) {
356  return;
357  }
358 
359  if ( ! ( $this->current_user_can_any( $this->_capabilities_uninstall ) && ( ! function_exists( 'is_multisite' ) || ! is_multisite() || is_super_admin() ) ) ) {
360  return;
361  }
362 
363  ?>
364  <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  <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  </h3>
381 
382  <div class="gf_delete_notice">
383  <?php echo $this->uninstall_warning_message() ?>
384  </div>
385 
386  <?php
387  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  }
395 
396  public function app_settings_tab() {
398 
399  if ( $this->maybe_uninstall() ) {
400  echo $this->uninstall_form();
401  }
402  }
403 
404  /**
405  * The Settings title
406  *
407  * @return string
408  */
409  public function app_settings_title() {
410  return null;
411  }
412 
413  /**
414  * Prevent displaying of any icon
415  *
416  * @return string
417  */
418  public function app_settings_icon() {
419  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  public function get_app_setting( $setting_name ) {
431  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  public function get( $key, $default = null ) {
443  /**
444  * Backward compatibility with Redux
445  */
446  if ( $key === 'license' ) {
447  return array(
448  'license' => $this->get( 'license_key' ),
449  'status' => $this->get( 'license_key_status' ),
450  'response' => $this->get( 'license_key_response' ),
451  );
452  }
453 
454  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  static public function getSetting( $key ) {
466  if ( gravityview()->plugin->settings instanceof Addon_Settings ) {
467  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  public function get_app_settings() {
479  return $this->all();
480  }
481 
482  /**
483  * Get all the settings.
484  *
485  * @return array The settings.
486  */
487  public function all() {
488  $option_name = 'gravityformsaddon_' . $this->_slug . '_app_settings';
489 
490  $option_value = get_option( $option_name, array() );
491 
492  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  public function get_default_settings() {
503  return $this->defaults();
504  }
505 
506  /**
507  * Default settings.
508  *
509  * @return array The defaults.
510  */
511  private function defaults() {
512  $defaults = array(
513  // Set the default license in wp-config.php
514  'license_key' => defined( 'GRAVITYVIEW_LICENSE_KEY' ) ? GRAVITYVIEW_LICENSE_KEY : '',
515  'license_key_response' => '',
516  'license_key_status' => '',
517  'support-email' => get_bloginfo( 'admin_email' ),
518  'no-conflict-mode' => '1',
519  'support_port' => '1',
520  'flexbox_search' => '1',
521  'rest_api' => '0',
522  'beta' => '0',
523  );
524 
525  /**
526  * @filter `gravityview/settings/default` Filter default global settings.
527  * @param[in,out] array The defaults.
528  */
529  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  public function as_html( $field, $echo = true ) {
541  $field['type'] = ( isset( $field['type'] ) && in_array( $field['type'], array( 'submit','reset','button' ) ) ) ? $field['type'] : 'submit';
542 
543  $attributes = $this->get_field_attributes( $field );
544  $default_value = Utils::get( $field, 'value', Utils::get( $field, 'default_value' ) );
545  $value = $this->get( $field['name'], $default_value );
546 
547 
548  $attributes['class'] = isset( $attributes['class'] ) ? esc_attr( $attributes['class'] ) : 'button-primary gfbutton';
549  $name = ( $field['name'] === 'gform-settings-save' ) ? $field['name'] : '_gaddon_setting_' . $field['name'];
550 
551  if ( empty( $value ) ) {
552  $value = __( 'Update Settings', 'gravityview' );
553  }
554 
555  $attributes = $this->get_field_attributes( $field );
556 
557  $html = '<input
558  type="' . $field['type'] . '"
559  name="' . esc_attr( $name ) . '"
560  value="' . $value . '" ' .
561  implode( ' ', $attributes ) .
562  ' />';
563 
564  if ( $echo ) {
565  echo $html;
566  }
567 
568  return $html;
569  }
570 
571  /**
572  * @deprecated Use \GV\Addon_Settings::as_html
573  */
574  public function settings_submit( $field, $echo = true ) {
575  gravityview()->log->warning( '\GV\Addon_Settings::settings_submit has been deprecated for \GV\Addon_Settings::as_html' );
576  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  public function is_save_postback() {
589  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' ) ) {
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 
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  public function get_license_handler() {
679  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  public function scripts() {
692  $scripts = parent::scripts();
693 
694  $scripts[] = array(
695  'handle' => 'gform_tooltip_init',
696  'enqueue' => array(
697  array(
698  'admin_page' => array( 'app_settings' )
699  )
700  )
701  );
702 
703  return $scripts;
704  }
705 
706  /**
707  * Register styles in the app admin page
708  * @return array
709  */
710  public function styles() {
711  $styles = parent::styles();
712 
713  $styles[] = array(
714  'handle' => 'gravityview_settings',
715  'src' => plugins_url( 'assets/css/admin-settings.css', GRAVITYVIEW_FILE ),
716  '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  return $styles;
731  }
732 
733  /**
734  * Add Settings link to GravityView menu
735  * @return void
736  */
737  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  $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  $show_submenu = apply_filters( 'gravityview/show-settings-menu', $show_submenu );
752 
753  if ( $show_submenu ) {
754  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  }
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  public function get_required_indicator( $field ) {
767  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  public function app_settings_fields() {
776  $default_settings = $this->defaults();
777 
778  $disabled_attribute = \GVCommon::has_cap( 'gravityview_edit_settings' ) ? false : 'disabled';
779 
780  $fields = array(
781  array(
782  'name' => 'gv_header',
783  'value' => '',
784  'type' => 'html',
785  ),
786  array(
787  'name' => 'license_key',
788  'required' => true,
789  'label' => __( 'License Key', 'gravityview' ),
790  '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' ) ),
791  'type' => 'edd_license',
792  'disabled' => ( defined( 'GRAVITYVIEW_LICENSE_KEY' ) && GRAVITYVIEW_LICENSE_KEY ),
793  'data-pending-text' => __( 'Verifying license&hellip;', 'gravityview' ),
794  'default_value' => $default_settings['license_key'],
795  'class' => ( '' == $this->get( 'license_key' ) ) ? 'activate code regular-text edd-license-key' : 'deactivate code regular-text edd-license-key',
796  ),
797  array(
798  'name' => 'license_key_response',
799  'default_value' => $default_settings['license_key_response'],
800  'type' => 'hidden',
801  ),
802  array(
803  'name' => 'license_key_status',
804  'default_value' => $default_settings['license_key_status'],
805  'type' => 'hidden',
806  ),
807  array(
808  'name' => 'support-email',
809  'type' => 'text',
810  'validate' => 'email',
811  'default_value' => $default_settings['support-email'],
812  'label' => __( 'Support Email', 'gravityview' ),
813  'description' => __( 'In order to provide responses to your support requests, please provide your email address.', 'gravityview' ),
814  'class' => 'code regular-text',
815  ),
816  /**
817  * @since 1.15 Added Support Port support
818  */
819  array(
820  'name' => 'support_port',
821  'type' => 'radio',
822  'label' => __( 'Show Support Port?', 'gravityview' ),
823  'default_value' => $default_settings['support_port'],
824  'horizontal' => 1,
825  'choices' => array(
826  array(
827  'label' => _x( 'Show', 'Setting: Show or Hide', 'gravityview' ),
828  'value' => '1',
829  ),
830  array(
831  'label' => _x( 'Hide', 'Setting: Show or Hide', 'gravityview' ),
832  'value' => '0',
833  ),
834  ),
835  '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  'description' => __( 'Show the Support Port on GravityView pages?', 'gravityview' ),
837  ),
838  array(
839  'name' => 'no-conflict-mode',
840  'type' => 'radio',
841  'label' => __( 'No-Conflict Mode', 'gravityview' ),
842  'default_value' => $default_settings['no-conflict-mode'],
843  'horizontal' => 1,
844  'choices' => array(
845  array(
846  'label' => _x( 'On', 'Setting: On or off', 'gravityview' ),
847  'value' => '1',
848  ),
849  array(
850  'label' => _x( 'Off', 'Setting: On or off', 'gravityview' ),
851  'value' => '0',
852  ),
853  ),
854  '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  gravityview()->plugin->supports( Plugin::FEATURE_REST ) ?
860  array(
861  'name' => 'rest_api',
862  'type' => 'radio',
863  'label' => __( 'REST API', 'gravityview' ),
864  'default_value' => $default_settings['rest_api'],
865  'horizontal' => 1,
866  'choices' => array(
867  array(
868  'label' => _x( 'Enable', 'Setting: Enable or Disable', 'gravityview' ),
869  'value' => '1',
870  ),
871  array(
872  'label' => _x( 'Disable', 'Setting: Enable or Disable', 'gravityview' ),
873  'value' => '0',
874  ),
875  ),
876  'description' => __( 'Enable View and Entry access via the REST API? Regular per-View restrictions apply (private, password protected, etc.).', 'gravityview' ),
877  'tooltip' => '<p>' . esc_html__( 'If you are unsure, choose the Disable setting.', 'gravityview' ) . '</p>',
878  ) : array(),
879  array(
880  'name' => 'beta',
881  'type' => 'checkbox',
882  'label' => __( 'Become a Beta Tester', 'gravityview' ),
883  'default_value' => $default_settings['beta'],
884  'horizontal' => 1,
885  'choices' => array(
886  array(
887  'label' => esc_html__( 'Show me beta versions if they are available.', 'gravityview' ),
888  'value' => '1',
889  'name' => 'beta',
890  ),
891  ),
892  '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  $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  $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  $fields = apply_filters( 'gravityview/settings/fields', $fields );
910 
911  /**
912  * Redux backward compatibility
913  * @since 1.7.4
914  */
915  foreach ( $fields as &$field ) {
916  $field['name'] = isset( $field['name'] ) ? $field['name'] : Utils::get( $field, 'id' );
917  $field['label'] = isset( $field['label'] ) ? $field['label'] : Utils::get( $field, 'title' );
918  $field['default_value'] = isset( $field['default_value'] ) ? $field['default_value'] : Utils::get( $field, 'default' );
919  $field['description'] = isset( $field['description'] ) ? $field['description'] : Utils::get( $field, 'subtitle' );
920 
921  if ( $disabled_attribute ) {
922  $field['disabled'] = $disabled_attribute;
923  }
924 
925  if ( empty( $field['disabled'] ) ) {
926  unset( $field['disabled'] );
927  }
928  }
929 
930  $sections = array(
931  array(
932  'description' => sprintf( '<span class="version-info description">%s</span>', sprintf( __( 'You are running GravityView version %s', 'gravityview' ), Plugin::$version ) ),
933  'fields' => $fields,
934  )
935  );
936 
937  // custom 'update settings' button
938  $button = array(
939  'class' => 'button button-primary button-hero',
940  'type' => 'save',
941  );
942 
943  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  $extension_sections = apply_filters( 'gravityview/settings/extension/sections', array() );
959 
960  // If there are extensions, add a section for them
961  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  $sections[0]['fields'][] = $button;
977  }
978 
979  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  public function set( $settings, $value = null ) {
1004  if ( is_string( $settings ) ) {
1005  $settings = array( $settings => $value );
1006  }
1007  $settings = wp_parse_args( $settings, $this->all() );
1008  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  public function update( $settings ) {
1019  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  protected function settings_edd_license( $field, $echo = true ) {
1030 
1031  if ( defined( 'GRAVITYVIEW_LICENSE_KEY' ) && GRAVITYVIEW_LICENSE_KEY ) {
1032  $field['input_type'] = 'password';
1033  }
1034 
1035  $text = $this->settings_text( $field, false );
1036 
1037  $activation = $this->License_Handler->settings_edd_license_activation( $field, false );
1038 
1039  $return = $text . $activation;
1040 
1041  if ( $echo ) {
1042  echo $return;
1043  }
1044 
1045  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  protected function settings_html( $field, $echo = true ) {
1059 
1060  $return = \GV\Utils::get( $field, 'value', '' );
1061 
1062  if ( $echo ) {
1063  echo $return;
1064  }
1065 
1066  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  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  </td>
1085  </tr>
1086 
1087  <?php
1088  }
1089 
1090  /**
1091  * Allow customizing the Save field parameters
1092  *
1093  * @param array $field
1094  * @param bool $echo
1095  *
1096  * @return string
1097  */
1098  public function settings_save( $field, $echo = true ) {
1099  $field['type'] = 'submit';
1100  $field['name'] = 'gform-settings-save';
1101  $field['class'] = isset( $field['class'] ) ? $field['class'] : 'button-primary gfbutton';
1102  $field['value'] = Utils::get( $field, 'value', __( 'Update Settings', 'gravityview' ) );
1103 
1104  $output = $this->settings_submit( $field, false );
1105 
1106  ob_start();
1107  $this->app_settings_uninstall_tab();
1108  $output .= ob_get_clean();
1109 
1110  if ( $echo ) {
1111  echo $output;
1112  }
1113 
1114  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  public function single_setting_row( $field ) {
1133  $field['gv_description'] = Utils::get( $field, 'description' );
1134  $field['description'] = Utils::get( $field, 'subtitle' );
1136  }
1137 
1138  /**
1139  * The same as the parent, except added support for field descriptions
1140  * @inheritDoc
1141  * @param $field array
1142  */
1143  public function single_setting_label( $field ) {
1145  if ( $description = Utils::get( $field, 'gv_description' ) ) {
1146  echo '<span class="description">'. $description .'</span>';
1147  }
1148  }
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  public function maybe_save_app_settings() {
1158 
1159  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  }
1167  }
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  public function get_posted_settings() {
1175  $posted_settings = parent::get_posted_settings();
1176 
1177  $local_key = Utils::get( $posted_settings, 'license_key' );
1178  $response_key = Utils::get( $posted_settings, 'license_key_response/license_key' );
1179 
1180  // If the posted key doesn't match the activated/deactivated key (set using the Activate License button, AJAX response),
1181  // then we assume it's changed. If it's changed, unset the status and the previous response.
1182  if ( $local_key !== $response_key ) {
1183  unset( $posted_settings['license_key_response'] );
1184  unset( $posted_settings['license_key_status'] );
1185  \GFCommon::add_error_message( __('The license key you entered has been saved, but not activated. Please activate the license.', 'gravityview' ) );
1186  }
1187  return $posted_settings;
1188  }
1189 }
get_uninstall_reasons()
Get an array of reasons why the plugin might be uninstalled.
$url
Definition: post_image.php:25
all()
Get all the settings.
If this file is called directly, abort.
gravityview_get_floaty( $height=87, $css_class=null)
Get an image of our intrepid explorer friend.
app_settings_uninstall_tab()
if(empty( $value)) $user
uninstall()
Uninstall all traces of GravityView.
single_setting_row_html( $field)
No needed for pure HTML settings row.
settings_html( $field, $echo=true)
Allow pure HTML settings row.
is_save_postback()
Check whether GravityView is being saved.
app_settings_icon()
Prevent displaying of any icon.
settings_save( $field, $echo=true)
Allow customizing the Save field parameters.
settings_edd_license( $field, $echo=true)
Register the settings field for the EDD License field type.
modify_app_settings_menu_title( $setting_tabs)
Change the settings page header title to "GravityView".
create_app_menu()
Add Settings link to GravityView menu.
gravityview()
Definition: _stubs.php:26
uninstall_form()
Display a feedback form when the plugin is uninstalled.
get( $key, $default=null)
Retrieve a setting.
get_app_settings()
Get all settings.
styles()
Register styles in the app admin page.
current_user_can_any( $caps)
Prevent uninstall tab from being shown by returning false for the uninstall capability check...
scale description p description
single_setting_label( $field)
The same as the parent, except added support for field descriptions .
app_settings_fields()
Specify the settings fields to be rendered on the plugin settings page.
single_setting_row( $field)
Keep GravityView styling for `$field[&#39;description&#39;]`, even though Gravity Forms added support for it...
defaults()
Default settings.
const GRAVITYVIEW_FILE
Full path to the GravityView file "GRAVITYVIEW_FILE" "./gravityview.php".
Definition: gravityview.php:31
get_required_indicator( $field)
Gets the required indicator Gets the markup of the required indicator symbol to highlight fields that...
add_network_menu()
Add global Settings page for Multisite.
scripts()
Add tooltip script to app settings page.
get_app_setting( $setting_name)
Retrieve a setting.
app_settings_title()
The Settings title.
static add_notice( $notice=array())
Add a notice to be displayed in the admin.
init_admin()
Run actions when initializing admin.
update( $settings)
Updates settings.
If this file is called directly, abort.
scale description ul
as_html( $field, $echo=true)
static get( $array, $key, $default=null)
Grab a value from an array or an object or default.
gv form field wrapper
update_app_settings( $settings)
Updates app settings with the provided settings.
maybe_save_app_settings()
Check for the gravityview_edit_settings capability before saving plugin settings. ...
static has_cap( $caps='', $object_id=null, $user_id=null)
Alias of GravityView_Roles_Capabilities::has_cap()
static getSetting( $key)
Get the setting for GravityView by name.
init_ajax()
Load license handler in admin-ajax.php.
_load_license_handler()
Make sure the license handler is available.
license_key_notice()
Display a notice if the plugin is inactive.
get_posted_settings()
When the settings are saved, make sure the license key matches the previously activated key...
get_license_handler()
Allow public access to the GV class.
get_default_settings()
Default settings.
settings_submit( $field, $echo=true)
$field
Definition: gquiz_grade.php:11
$description
Definition: post_image.php:28
$title