GravityView  2.9.2
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  if ( 'license_key' === $key && defined( 'GRAVITYVIEW_LICENSE_KEY' ) ) {
455  return GRAVITYVIEW_LICENSE_KEY;
456  }
457 
458  return Utils::get( $this->all(), $key, $default );
459  }
460 
461  /**
462  * Get the setting for GravityView by name
463  *
464  * @deprecated Use gravityview()->plugin->settings->get()
465  * @param string $key Option key to fetch
466  *
467  * @return mixed
468  */
469  static public function getSetting( $key ) {
470  if ( gravityview()->plugin->settings instanceof Addon_Settings ) {
471  return gravityview()->plugin->settings->get( $key );
472  }
473  }
474 
475  /**
476  * Get all settings.
477  *
478  * @deprecated Use \GV\Addon_Settings::all() or \GV\Addon_Settings::get()
479  *
480  * @return array The settings.
481  */
482  public function get_app_settings() {
483  return $this->all();
484  }
485 
486  /**
487  * Get all the settings.
488  *
489  * @return array The settings.
490  */
491  public function all() {
492 
493  $option_name = 'gravityformsaddon_' . $this->_slug . '_app_settings';
494 
495  if ( $this->has_site_settings() ) {
496  $defaults = $this->defaults();
497  $option_value = get_option( $option_name, array() );
498  } else {
499  $defaults = get_blog_option( get_main_site_id(), $option_name );
500  $option_value = get_blog_option( get_main_site_id(), $option_name );
501  }
502 
503  return wp_parse_args( $option_value, $defaults );
504  }
505 
506  /**
507  * Default settings.
508  *
509  * @deprecated Use \GV\Addon_Settings::defaults()
510  *
511  * @return array The defaults.
512  */
513  public function get_default_settings() {
514  return $this->defaults();
515  }
516 
517  /**
518  * Default settings.
519  *
520  * @return array The defaults.
521  */
522  private function defaults() {
523  $defaults = array(
524  // Set the default license in wp-config.php
525  'license_key' => defined( 'GRAVITYVIEW_LICENSE_KEY' ) ? GRAVITYVIEW_LICENSE_KEY : '',
526  'license_key_response' => '',
527  'license_key_status' => '',
528  'support-email' => get_bloginfo( 'admin_email' ),
529  'no-conflict-mode' => '1',
530  'support_port' => '1',
531  'flexbox_search' => '1',
532  'rest_api' => '0',
533  'beta' => '0',
534  );
535 
536  /**
537  * @filter `gravityview/settings/default` Filter default global settings.
538  * @param[in,out] array The defaults.
539  */
540  return apply_filters( 'gravityview/settings/defaults', $defaults );
541  }
542 
543  /***
544  * Renders the save button for settings pages
545  *
546  * @param array $field - Field array containing the configuration options of this field
547  * @param bool $echo = true - true to echo the output to the screen, false to simply return the contents as a string
548  *
549  * @return string The HTML
550  */
551  public function as_html( $field, $echo = true ) {
552  $field['type'] = ( isset( $field['type'] ) && in_array( $field['type'], array( 'submit','reset','button' ) ) ) ? $field['type'] : 'submit';
553 
554  $attributes = $this->get_field_attributes( $field );
555  $default_value = Utils::get( $field, 'value', Utils::get( $field, 'default_value' ) );
556  $value = $this->get( $field['name'], $default_value );
557 
558 
559  $attributes['class'] = isset( $attributes['class'] ) ? esc_attr( $attributes['class'] ) : 'button-primary gfbutton';
560  $name = ( $field['name'] === 'gform-settings-save' ) ? $field['name'] : '_gaddon_setting_' . $field['name'];
561 
562  if ( empty( $value ) ) {
563  $value = __( 'Update Settings', 'gravityview' );
564  }
565 
566  $attributes = $this->get_field_attributes( $field );
567 
568  $html = '<input
569  type="' . $field['type'] . '"
570  name="' . esc_attr( $name ) . '"
571  value="' . $value . '" ' .
572  implode( ' ', $attributes ) .
573  ' />';
574 
575  if ( $echo ) {
576  echo $html;
577  }
578 
579  return $html;
580  }
581 
582  /**
583  * @deprecated Use \GV\Addon_Settings::as_html
584  */
585  public function settings_submit( $field, $echo = true ) {
586  gravityview()->log->warning( '\GV\Addon_Settings::settings_submit has been deprecated for \GV\Addon_Settings::as_html' );
587  return $this->as_html( $field, $echo );
588  }
589 
590  /**
591  * Check whether GravityView is being saved
592  *
593  * The generic is_save_postback() is true for all addons
594  *
595  * @since 2.0.8
596  *
597  * @return bool
598  */
599  public function is_save_postback() {
600  return isset( $_POST['gform-settings-save'] ) && isset( $_POST['_gravityview_save_settings_nonce'] );
601  }
602 
603  /**
604  * Display a notice if the plugin is inactive.
605  *
606  * @return void
607  */
608  public function license_key_notice() {
609 
610  if( $this->is_save_postback() ) {
611  $settings = $this->get_posted_settings();
612  $license_key = defined( 'GRAVITYVIEW_LICENSE_KEY' ) ? GRAVITYVIEW_LICENSE_KEY : \GV\Utils::get( $settings, 'license_key' );
613  $license_status = \GV\Utils::get( $settings, 'license_key_status', 'inactive' );
614  } else {
615  $license_status = $this->get( 'license_key_status', 'inactive' );
616  $license_key = $this->get( 'license_key' );
617  }
618 
619  $license_id = empty( $license_key ) ? 'license' : $license_key;
620 
621  $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' );
622 
623  /** @internal Do not use! Will change without notice (pun slightly intended). */
624  $message = apply_filters( 'gravityview/settings/license-key-notice', $message );
625 
626  /**
627  * I wanted to remove the period from after the buttons in the string,
628  * but didn't want to mess up the translation strings for the translators.
629  */
630  $message = mb_substr( $message, 0, mb_strlen( $message ) - 1 );
631  $title = __( 'Inactive License', 'gravityview');
632  $status = '';
633  $update_below = false;
634  $primary_button_link = admin_url( 'edit.php?post_type=gravityview&amp;page=gravityview_settings' );
635 
636  switch ( $license_status ) {
637  /** @since 1.17 */
638  case 'expired':
639  $title = __( 'Expired License', 'gravityview' );
640  $status = 'expired';
641  $message = $this->get_license_handler()->strings( 'expired', $this->get( 'license_key_response' ) );
642  break;
643  case 'invalid':
644  $title = __( 'Invalid License', 'gravityview' );
645  $status = __( 'is invalid', 'gravityview' );
646  break;
647  case 'deactivated':
648  $status = __( 'is inactive', 'gravityview' );
649  $update_below = __( 'Activate your license key below.', 'gravityview' );
650  break;
651  /** @noinspection PhpMissingBreakStatementInspection */
652  case '':
653  $license_status = 'site_inactive';
654  // break intentionally left blank
655  case 'inactive':
656  case 'site_inactive':
657  $status = __( 'has not been activated', 'gravityview' );
658  $update_below = __( 'Activate your license key below.', 'gravityview' );
659  break;
660  }
661  $url = 'https://gravityview.co/pricing/?utm_source=admin_notice&utm_medium=admin&utm_content='.$license_status.'&utm_campaign=Admin%20Notice';
662 
663  // Show a different notice on settings page for inactive licenses (hide the buttons)
664  if ( $update_below && gravityview()->request->is_admin( '', 'settings' ) ) {
665  $message = sprintf( $message, $status, '<div class="hidden">', '', '', '</div><a href="#" onclick="jQuery(\'#license_key\').focus(); return false;">' . $update_below . '</a>' );
666  } else {
667  $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>' );
668  }
669 
670  if ( empty( $status ) ) {
671  return;
672  }
673 
675  'message' => $message,
676  'class' => 'notice notice-warning',
677  'title' => $title,
678  'cap' => 'gravityview_edit_settings',
679  'dismiss' => sha1( $license_status . '_' . $license_id . '_' . date( 'z' ) ), // Show every day, instead of every 8 weeks (which is the default)
680  ) );
681  }
682 
683  /**
684  * Allow public access to the GV\License_Handler class
685  * @since 1.7.4
686  *
687  * @return \GV\License_Handler
688  */
689  public function get_license_handler() {
690  return $this->License_Handler;
691  }
692 
693  /**
694  * Add tooltip script to app settings page. Not enqueued by Gravity Forms for some reason.
695  *
696  * @since 1.21.5
697  *
698  * @see GFAddOn::scripts()
699  *
700  * @return array Array of scripts
701  */
702  public function scripts() {
703  $scripts = parent::scripts();
704 
705  $scripts[] = array(
706  'handle' => 'gform_tooltip_init',
707  'enqueue' => array(
708  array(
709  'admin_page' => array( 'app_settings' )
710  )
711  )
712  );
713 
714  return $scripts;
715  }
716 
717  /**
718  * Register styles in the app admin page
719  * @return array
720  */
721  public function styles() {
722  $styles = parent::styles();
723 
724  $styles[] = array(
725  'handle' => 'gravityview_settings',
726  'src' => plugins_url( 'assets/css/admin-settings.css', GRAVITYVIEW_FILE ),
727  'version' => Plugin::$version,
728  'deps' => array(
729  'gform_admin',
730  'gaddon_form_settings_css',
731  'gform_tooltip',
732  'gform_font_awesome',
733  ),
734  'enqueue' => array(
735  array( 'admin_page' => array(
736  'app_settings',
737  ) ),
738  )
739  );
740 
741  return $styles;
742  }
743 
744  /**
745  * Does the current site have its own settings?
746  *
747  * - If not multisite, returns true.
748  * - If multisite and the plugin is network activated, returns true; we need to register the submenu page for the Network Admin settings to work.
749  * - If multisite and not network admin, return false.
750  *
751  * @since 2.8.2
752  *
753  * @return bool
754  */
755  private function has_site_settings() {
756  return ( ! is_multisite() ) || is_main_site() || ( ! gravityview()->plugin->is_network_activated() ) || ( is_network_admin() && gravityview()->plugin->is_network_activated() );
757  }
758 
759  /**
760  * Add Settings link to GravityView menu
761  * @return void
762  */
763  public function create_app_menu() {
764 
765  /**
766  * Override whether to show the Settings menu on a per-blog basis.
767  * @since 1.7.6
768  * @param bool $hide_if_network_activated Default: true
769  */
770  $show_submenu = apply_filters( 'gravityview/show-settings-menu', $this->has_site_settings() );
771 
772  if ( ! $show_submenu ) {
773  return;
774  }
775 
776  add_submenu_page( 'edit.php?post_type=gravityview', __( 'Settings', 'gravityview' ), __( 'Settings', 'gravityview' ), $this->_capabilities_app_settings, $this->_slug . '_settings', array( $this, 'app_tab_page' ) );
777  }
778 
779  /**
780  * Gets the required indicator
781  * Gets the markup of the required indicator symbol to highlight fields that are required
782  *
783  * @param $field - The field meta.
784  *
785  * @return string - Returns markup of the required indicator symbol
786  */
787  public function get_required_indicator( $field ) {
788  return '<span class="required" title="' . esc_attr__( 'Required', 'gravityview' ) . '">*</span>';
789  }
790 
791  /**
792  * Specify the settings fields to be rendered on the plugin settings page
793  *
794  * @return array
795  */
796  public function app_settings_fields() {
797  $default_settings = $this->defaults();
798 
799  $disabled_attribute = \GVCommon::has_cap( 'gravityview_edit_settings' ) ? false : 'disabled';
800 
801  $fields = array(
802  array(
803  'name' => 'gv_header',
804  'value' => '',
805  'type' => 'html',
806  ),
807  array(
808  'name' => 'license_key',
809  'required' => ! defined( 'GRAVITYVIEW_LICENSE_KEY' ) || ! GRAVITYVIEW_LICENSE_KEY,
810  'label' => __( 'License Key', 'gravityview' ),
811  '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' ) ),
812  'type' => 'edd_license',
813  'disabled' => ( defined( 'GRAVITYVIEW_LICENSE_KEY' ) && GRAVITYVIEW_LICENSE_KEY ),
814  'data-pending-text' => __( 'Verifying license&hellip;', 'gravityview' ),
815  'default_value' => $default_settings['license_key'],
816  'class' => ( '' == $this->get( 'license_key' ) ) ? 'activate code regular-text edd-license-key' : 'deactivate code regular-text edd-license-key',
817  ),
818  array(
819  'name' => 'license_key_response',
820  'default_value' => $default_settings['license_key_response'],
821  'type' => 'hidden',
822  ),
823  array(
824  'name' => 'license_key_status',
825  'default_value' => $default_settings['license_key_status'],
826  'type' => 'hidden',
827  ),
828  array(
829  'name' => 'support-email',
830  'type' => 'text',
831  'validate' => 'email',
832  'default_value' => $default_settings['support-email'],
833  'label' => __( 'Support Email', 'gravityview' ),
834  'description' => __( 'In order to provide responses to your support requests, please provide your email address.', 'gravityview' ),
835  'class' => 'code regular-text',
836  ),
837  /**
838  * @since 1.15 Added Support Port support
839  */
840  array(
841  'name' => 'support_port',
842  'type' => 'radio',
843  'label' => __( 'Show Support Port?', 'gravityview' ),
844  'default_value' => $default_settings['support_port'],
845  'horizontal' => 1,
846  'choices' => array(
847  array(
848  'label' => _x( 'Show', 'Setting: Show or Hide', 'gravityview' ),
849  'value' => '1',
850  ),
851  array(
852  'label' => _x( 'Hide', 'Setting: Show or Hide', 'gravityview' ),
853  'value' => '0',
854  ),
855  ),
856  'tooltip' => '<p>' . 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' ) . '<img src="' . esc_url_raw( plugins_url( 'assets/images/beacon.png', GRAVITYVIEW_FILE ) ) . '" alt="' . esc_attr__( 'The Support Port looks like this.', 'gravityview' ) . '" class="aligncenter" style="display: block; max-width:100%; margin:1em auto;" /></p>',
857  'description' => __( 'Show the Support Port on GravityView pages?', 'gravityview' ),
858  ),
859  array(
860  'name' => 'no-conflict-mode',
861  'type' => 'radio',
862  'label' => __( 'No-Conflict Mode', 'gravityview' ),
863  'default_value' => $default_settings['no-conflict-mode'],
864  'horizontal' => 1,
865  'choices' => array(
866  array(
867  'label' => _x( 'On', 'Setting: On or off', 'gravityview' ),
868  'value' => '1',
869  ),
870  array(
871  'label' => _x( 'Off', 'Setting: On or off', 'gravityview' ),
872  'value' => '0',
873  ),
874  ),
875  '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' ),
876  ),
877  /**
878  * @since 2.0 Added REST API
879  */
880  gravityview()->plugin->supports( Plugin::FEATURE_REST ) ?
881  array(
882  'name' => 'rest_api',
883  'type' => 'radio',
884  'label' => __( 'REST API', 'gravityview' ),
885  'default_value' => $default_settings['rest_api'],
886  'horizontal' => 1,
887  'choices' => array(
888  array(
889  'label' => _x( 'Enable', 'Setting: Enable or Disable', 'gravityview' ),
890  'value' => '1',
891  ),
892  array(
893  'label' => _x( 'Disable', 'Setting: Enable or Disable', 'gravityview' ),
894  'value' => '0',
895  ),
896  ),
897  'description' => __( 'Enable View and Entry access via the REST API? Regular per-View restrictions apply (private, password protected, etc.).', 'gravityview' ),
898  'tooltip' => '<p>' . esc_html__( 'If you are unsure, choose the Disable setting.', 'gravityview' ) . '</p>',
899  ) : array(),
900  array(
901  'name' => 'beta',
902  'type' => 'checkbox',
903  'label' => __( 'Become a Beta Tester', 'gravityview' ),
904  'default_value' => $default_settings['beta'],
905  'horizontal' => 1,
906  'choices' => array(
907  array(
908  'label' => esc_html__( 'Show me beta versions if they are available.', 'gravityview' ),
909  'value' => '1',
910  'name' => 'beta',
911  ),
912  ),
913  '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' ),
914  ),
915  );
916 
917  $fields = array_filter( $fields, 'count' );
918 
919  /**
920  * @filter `gravityview_settings_fields` Filter the settings fields.
921  * @param array $fields The fields to filter.
922  * @deprecated Use `gravityview/settings/fields`.
923  */
924  $fields = apply_filters( 'gravityview_settings_fields', $fields );
925 
926  /**
927  * @filter `gravityview/settings/fields` Filter the settings fields.
928  * @param array $fields The fields to filter.
929  */
930  $fields = apply_filters( 'gravityview/settings/fields', $fields );
931 
932  /**
933  * Redux backward compatibility
934  * @since 1.7.4
935  */
936  foreach ( $fields as &$field ) {
937  $field['name'] = isset( $field['name'] ) ? $field['name'] : Utils::get( $field, 'id' );
938  $field['label'] = isset( $field['label'] ) ? $field['label'] : Utils::get( $field, 'title' );
939  $field['default_value'] = isset( $field['default_value'] ) ? $field['default_value'] : Utils::get( $field, 'default' );
940  $field['description'] = isset( $field['description'] ) ? $field['description'] : Utils::get( $field, 'subtitle' );
941 
942  if ( $disabled_attribute ) {
943  $field['disabled'] = $disabled_attribute;
944  }
945 
946  if ( empty( $field['disabled'] ) ) {
947  unset( $field['disabled'] );
948  }
949  }
950 
951  $sections = array(
952  array(
953  'description' => sprintf( '<span class="version-info description">%s</span>', sprintf( __( 'You are running GravityView version %s', 'gravityview' ), Plugin::$version ) ),
954  'fields' => $fields,
955  )
956  );
957 
958  // custom 'update settings' button
959  $button = array(
960  'class' => 'button button-primary button-hero',
961  'type' => 'save',
962  );
963 
964  if ( $disabled_attribute ) {
965  $button['disabled'] = $disabled_attribute;
966  }
967 
968  /**
969  * @filter `gravityview/settings/extension/sections` Modify the GravityView settings page
970  * Extensions can tap in here to insert their own section and settings.
971  * <code>
972  * $sections[] = array(
973  * 'title' => __( 'GravityView My Extension Settings', 'gravityview' ),
974  * 'fields' => $settings,
975  * );
976  * </code>
977  * @param array $extension_settings Empty array, ready for extension settings!
978  */
979  $extension_sections = apply_filters( 'gravityview/settings/extension/sections', array() );
980 
981  // If there are extensions, add a section for them
982  if ( ! empty( $extension_sections ) ) {
983 
984  if( $disabled_attribute ) {
985  foreach ( $extension_sections as &$section ) {
986  foreach ( $section['fields'] as &$field ) {
987  $field['disabled'] = $disabled_attribute;
988  }
989  }
990  }
991 
992  $k = count( $extension_sections ) - 1 ;
993  $extension_sections[ $k ]['fields'][] = $button;
994  $sections = array_merge( $sections, $extension_sections );
995  } else {
996  // add the 'update settings' button to the general section
997  $sections[0]['fields'][] = $button;
998  }
999 
1000  return $sections;
1001  }
1002 
1003  /**
1004  * Updates app settings with the provided settings
1005  *
1006  * Same as the GFAddon, except it returns the value from update_option()
1007  *
1008  * @param array $settings - App settings to be saved
1009  *
1010  * @deprecated Use \GV\Addon_Settings::set or \GV\Addon_Settings::update
1011  *
1012  * @return boolean False if value was not updated and true if value was updated.
1013  */
1014  public function update_app_settings( $settings ) {
1015  return $this->update( $settings );
1016  }
1017 
1018  /**
1019  * Sets a subset of settings.
1020  *
1021  * @param array|string An array of settings to update, or string (key) and $value to update one setting.
1022  * @param mixed $value A value if $settings is string (key). Default: null.
1023  */
1024  public function set( $settings, $value = null ) {
1025  if ( is_string( $settings ) ) {
1026  $settings = array( $settings => $value );
1027  }
1028  $settings = wp_parse_args( $settings, $this->all() );
1029  return update_option( 'gravityformsaddon_' . $this->_slug . '_app_settings', $settings );
1030  }
1031 
1032  /**
1033  * Updates settings.
1034  *
1035  * @param array $settings The settings array.
1036  *
1037  * @return boolean False if value was not updated and true if value was updated.
1038  */
1039  public function update( $settings ) {
1040  return update_option( 'gravityformsaddon_' . $this->_slug . '_app_settings', $settings );
1041  }
1042 
1043  /**
1044  * Register the settings field for the EDD License field type
1045  * @param array $field
1046  * @param bool $echo Whether to echo the
1047  *
1048  * @return string
1049  */
1050  protected function settings_edd_license( $field, $echo = true ) {
1051 
1052  if ( defined( 'GRAVITYVIEW_LICENSE_KEY' ) && GRAVITYVIEW_LICENSE_KEY ) {
1053  $field['input_type'] = 'password';
1054  }
1055 
1056  $text = $this->settings_text( $field, false );
1057 
1058  $activation = $this->License_Handler->settings_edd_license_activation( $field, false );
1059 
1060  $return = $text . $activation;
1061 
1062  if ( $echo ) {
1063  echo $return;
1064  }
1065 
1066  return $return;
1067  }
1068 
1069  /**
1070  * Allow pure HTML settings row
1071  *
1072  * @since 2.0.6
1073  *
1074  * @param array $field
1075  * @param bool $echo Whether to echo the
1076  *
1077  * @return string
1078  */
1079  protected function settings_html( $field, $echo = true ) {
1080 
1081  $return = \GV\Utils::get( $field, 'value', '' );
1082 
1083  if ( $echo ) {
1084  echo $return;
1085  }
1086 
1087  return $return;
1088  }
1089 
1090  /**
1091  * No <th> needed for pure HTML settings row
1092  *
1093  * @since 2.0.6
1094  *
1095  * @param array $field
1096  *
1097  * @return void
1098  */
1099  public function single_setting_row_html( $field ) {
1100  ?>
1101 
1102  <tr id="gaddon-setting-row-<?php echo esc_attr( $field['name'] ); ?>">
1103  <td colspan="2">
1104  <?php $this->single_setting( $field ); ?>
1105  </td>
1106  </tr>
1107 
1108  <?php
1109  }
1110 
1111  /**
1112  * Allow customizing the Save field parameters
1113  *
1114  * @param array $field
1115  * @param bool $echo
1116  *
1117  * @return string
1118  */
1119  public function settings_save( $field, $echo = true ) {
1120  $field['type'] = 'submit';
1121  $field['name'] = 'gform-settings-save';
1122  $field['class'] = isset( $field['class'] ) ? $field['class'] : 'button-primary gfbutton';
1123  $field['value'] = Utils::get( $field, 'value', __( 'Update Settings', 'gravityview' ) );
1124 
1125  $output = $this->settings_submit( $field, false );
1126 
1127  ob_start();
1128  $this->app_settings_uninstall_tab();
1129  $output .= ob_get_clean();
1130 
1131  if ( $echo ) {
1132  echo $output;
1133  }
1134 
1135  return $output;
1136  }
1137 
1138  /**
1139  * Keep GravityView styling for `$field['description']`, even though Gravity Forms added support for it
1140  *
1141  * Converts `$field['description']` to `$field['gv_description']`
1142  * Converts `$field['subtitle']` to `$field['description']`
1143  *
1144  * @see \GV\Addon_Settings::single_setting_label Converts `gv_description` back to `description`
1145  * @see http://share.gravityview.co/P28uGp/2OIRKxog for image that shows subtitle vs description
1146  *
1147  * @since 1.21.5.2
1148  *
1149  * @param array $field
1150  *
1151  * @return void
1152  */
1153  public function single_setting_row( $field ) {
1154  $field['gv_description'] = Utils::get( $field, 'description' );
1155  $field['description'] = Utils::get( $field, 'subtitle' );
1157  }
1158 
1159  /**
1160  * The same as the parent, except added support for field descriptions
1161  * @inheritDoc
1162  * @param $field array
1163  */
1164  public function single_setting_label( $field ) {
1166  if ( $description = Utils::get( $field, 'gv_description' ) ) {
1167  echo '<span class="description">'. $description .'</span>';
1168  }
1169  }
1170 
1171  /**
1172  * Check for the `gravityview_edit_settings` capability before saving plugin settings.
1173  * Gravity Forms says you're able to edit if you're able to view settings. GravityView allows two different permissions.
1174  *
1175  * @since 1.15
1176  * @return void
1177  */
1178  public function maybe_save_app_settings() {
1179 
1180  if ( $this->is_save_postback() ) {
1181  if ( ! \GVCommon::has_cap( 'gravityview_edit_settings' ) ) {
1182  $_POST = array(); // If you don't reset the $_POST array, it *looks* like the settings were changed, but they weren't
1183  \GFCommon::add_error_message( __( 'You don\'t have the ability to edit plugin settings.', 'gravityview' ) );
1184  return;
1185  }
1186  }
1188  }
1189 
1190  /**
1191  * When the settings are saved, make sure the license key matches the previously activated key
1192  *
1193  * @return array settings from parent::get_posted_settings(), with `license_key_response` and `license_key_status` potentially unset
1194  */
1195  public function get_posted_settings() {
1196  $posted_settings = parent::get_posted_settings();
1197 
1198  $local_key = Utils::get( $posted_settings, 'license_key' );
1199 
1200  if ( ! $local_key && defined( 'GRAVITYVIEW_LICENSE_KEY' ) ) {
1201  $local_key = GRAVITYVIEW_LICENSE_KEY;
1202  }
1203 
1204  $response_key = Utils::get( $posted_settings, 'license_key_response/license_key' );
1205 
1206  static $added_message = false;
1207 
1208  // If the posted key doesn't match the activated/deactivated key (set using the Activate License button, AJAX response),
1209  // then we assume it's changed. If it's changed, unset the status and the previous response.
1210  if ( ! $added_message && ( $local_key !== $response_key ) ) {
1211 
1212  unset( $posted_settings['license_key_response'] );
1213  unset( $posted_settings['license_key_status'] );
1214 
1215  \GFCommon::add_error_message( __('The license key you entered has been saved, but not activated. Please activate the license.', 'gravityview' ) );
1216 
1217  $added_message = true;
1218  }
1219  return $posted_settings;
1220  }
1221 }
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.
has_site_settings()
Does the current site have its own settings?
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.
if(empty( $field_settings['email_field'])) $settings
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