2018-08-06 15:18:02 +02:00
< ? php
/*
Plugin Name : Gravity Forms
Plugin URI : https :// www . gravityforms . com
Description : Easily create web forms and manage form entries within the WordPress admin .
2018-08-06 15:32:55 +02:00
Version : 2.3 . 2
2018-08-06 15:18:02 +02:00
Author : rocketgenius
Author URI : https :// www . rocketgenius . com
License : GPL - 2.0 +
Text Domain : gravityforms
Domain Path : / languages
------------------------------------------------------------------------
Copyright 2009 - 2018 Rocketgenius , Inc .
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see http :// www . gnu . org / licenses .
*/
//------------------------------------------------------------------------------------------------------------------
//---------- Gravity Forms License Key -----------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
// If you hardcode a Gravity Forms License Key here, it will automatically populate on activation.
$gf_license_key = '' ;
//-- OR ---//
// You can also add the Gravity Forms license key to your wp-config.php file to automatically populate on activation
// Add the code in the comment below to your wp-config.php to do so:
// define('GF_LICENSE_KEY','YOUR_KEY_GOES_HERE');
//------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
//---------- reCAPTCHA Keys -----------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------
// If you hardcode your reCAPTCHA Keys here, it will automatically populate on activation.
$gf_recaptcha_private_key = '' ;
$gf_recaptcha_public_key = '' ;
//-- OR ---//
// You can also add the reCAPTCHA keys to your wp-config.php file to automatically populate on activation
// Add the two lines of code in the comment below to your wp-config.php to do so:
// define('GF_RECAPTCHA_SITE_KEY','YOUR_SITE_KEY_GOES_HERE');
// define('GF_RECAPTCHA_SECRET_KEY','YOUR_SECRET_KEY_GOES_HERE');
//------------------------------------------------------------------------------------------------------------------
if ( ! defined ( 'ABSPATH' ) ) {
die ();
}
if ( ! defined ( 'RG_CURRENT_PAGE' ) ) {
/**
* Defines the current page .
*
* @ since Unknown
*
* @ used - by GFForms :: init ()
* @ used - by GFCommon :: ensure_wp_version ()
*
* @ var string RG_CURRENT_PAGE The current page .
*/
define ( 'RG_CURRENT_PAGE' , basename ( $_SERVER [ 'PHP_SELF' ] ) );
}
if ( ! defined ( 'IS_ADMIN' ) ) {
/**
* Checks if an admin page is being viewed .
*
* @ since Unknown
*
* @ used - by GFForms :: init ()
* @ used - by GFFormsModel :: get_default_value ()
* @ used - by GFFormsModel :: get_label ()
*
* @ var boolean IS_ADMIN True if admin page . False otherwise .
*/
define ( 'IS_ADMIN' , is_admin () );
}
/**
* Defines the current view within Gravity Forms .
*
* Defined from URL parameters .
*
* @ since Unknown
* @ deprecated 2.1 . 3.6
*
* @ uses GFForms :: get ()
*
* @ var string | boolean RG_CURRENT_VIEW The view if available . False otherwise .
*/
define ( 'RG_CURRENT_VIEW' , GFForms :: get ( 'view' ) );
/**
* Defines the minimum version of WordPress required for Gravity Forms .
*
* @ since Unknown
*
* @ used - by GFCommon :: ensure_wp_version ()
* @ used - by GF_SUPPORTED_WP_VERSION
* @ used - by GFSettings :: gravityforms_settings_page ()
*
* @ var string GF_MIN_WP_VERSION Minimum version number .
*/
define ( 'GF_MIN_WP_VERSION' , '3.7' );
/**
* Checks if the current WordPress version is supported .
*
* @ since Unknown
*
* @ used - by GFForms :: init ()
* @ used - by GFCommon :: ensure_wp_version ()
* @ uses GF_MIN_WP_VERSION
*
* @ var boolean GF_SUPPORTED_VERSION True if supported . False otherwise .
*/
define ( 'GF_SUPPORTED_WP_VERSION' , version_compare ( get_bloginfo ( 'version' ), GF_MIN_WP_VERSION , '>=' ) );
/**
* Defines the minimum version of WordPress that will be officially supported .
*
* @ var string GF_MIN_WP_VERSION_SUPPORT_TERMS The version number
*/
define ( 'GF_MIN_WP_VERSION_SUPPORT_TERMS' , '4.8' );
if ( ! defined ( 'GRAVITY_MANAGER_URL' ) ) {
/**
* Defines the Gravity Manager URL .
*
* @ var string GRAVITY_MANAGER_URL The full URL to the Gravity Manager .
*/
define ( 'GRAVITY_MANAGER_URL' , 'https://www.gravityhelp.com/wp-content/plugins/gravitymanager' );
}
if ( ! defined ( 'GRAVITY_MANAGER_PROXY_URL' ) ) {
/**
* Defines the Gravity Manager proxy URL .
*
* @ var string GRAVITY_MANAGER_PROXY_URL The full URL to the Gravity Manager proxy .
*/
define ( 'GRAVITY_MANAGER_PROXY_URL' , 'http://proxy.gravityplugins.com' );
}
require_once ( plugin_dir_path ( __FILE__ ) . 'currency.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'common.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'forms_model.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'widget.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/api.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/webapi/webapi.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/fields/class-gf-fields.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/class-gf-download.php' );
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/query/class-gf-query.php' );
// Load Logging if Logging Add-On is not active.
if ( ! GFCommon :: is_logging_plugin_active () ) {
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/logging/logging.php' );
}
// GFCommon::$version is deprecated, set it to current version for backwards compatibility
GFCommon :: $version = GFForms :: $version ;
add_action ( 'init' , array ( 'GFForms' , 'init' ) );
add_action ( 'wp' , array ( 'GFForms' , 'maybe_process_form' ), 9 );
add_action ( 'admin_init' , array ( 'GFForms' , 'maybe_process_form' ), 9 );
add_action ( 'wp' , array ( 'GFForms' , 'process_exterior_pages' ) );
add_filter ( 'upgrader_pre_install' , array ( 'GFForms' , 'validate_upgrade' ), 10 , 2 );
add_filter ( 'tiny_mce_before_init' , array ( 'GFForms' , 'modify_tiny_mce_4' ), 20 );
add_filter ( 'user_has_cap' , array ( 'RGForms' , 'user_has_cap' ), 10 , 3 );
add_filter ( 'query' , array ( 'GFForms' , 'filter_query' ) );
//Hooks for no-conflict functionality
if ( is_admin () && ( GFForms :: is_gravity_page () || GFForms :: is_gravity_ajax_action () ) ) {
add_action ( 'wp_print_scripts' , array ( 'GFForms' , 'no_conflict_mode_script' ), 1000 );
add_action ( 'admin_print_footer_scripts' , array ( 'GFForms' , 'no_conflict_mode_script' ), 9 );
add_action ( 'wp_print_styles' , array ( 'GFForms' , 'no_conflict_mode_style' ), 1000 );
add_action ( 'admin_print_styles' , array ( 'GFForms' , 'no_conflict_mode_style' ), 1 );
add_action ( 'admin_print_footer_scripts' , array ( 'GFForms' , 'no_conflict_mode_style' ), 1 );
add_action ( 'admin_footer' , array ( 'GFForms' , 'no_conflict_mode_style' ), 1 );
}
add_action ( 'plugins_loaded' , array ( 'GFForms' , 'loaded' ) );
register_activation_hook ( __FILE__ , array ( 'GFForms' , 'activation_hook' ) );
register_deactivation_hook ( __FILE__ , array ( 'GFForms' , 'deactivation_hook' ) );
gf_upgrade ();
/**
* Class GFForms
*
* Handles the loading of Gravity Forms and other core functionality
*/
class GFForms {
/**
* Defines this version of Gravity Forms .
*
* @ since Unknown
* @ access public
*
* @ var string $version The version number .
*/
2018-08-06 15:32:55 +02:00
public static $version = '2.3.2' ;
2018-08-06 15:18:02 +02:00
/**
* Handles background upgrade tasks .
*
* @ var GF_Background_Upgrader
*/
public static $background_upgrader = null ;
/**
* Runs after Gravity Forms is loaded .
*
* Initializes add - ons .
*
* @ since Unknown
* @ access public
*
* @ uses GFAddOn :: init_addons ()
*
* @ return void
*/
public static function loaded () {
/**
* Fires when Gravity Forms has loaded .
*
* When developing Add - Ons , use this hook to initialize any functionality that depends on Gravity Forms functionality .
*/
do_action ( 'gform_loaded' );
//initializing Add-Ons if necessary
if ( class_exists ( 'GFAddOn' ) ) {
GFAddOn :: init_addons ();
}
}
/**
* Determines if the 3 rd party Members plugin is active .
*
* @ since Unknown
* @ access public
*
* @ return boolean True if the Members plugin is active . False otherwise .
*/
public static function has_members_plugin () {
return function_exists ( 'members_get_capabilities' );
}
/**
* Initializes Gravity Forms .
*
* @ since Unknown
* @ access public
*
* @ return void
*/
public static function init () {
if ( ! wp_next_scheduled ( 'gravityforms_cron' ) ) {
wp_schedule_event ( time (), 'daily' , 'gravityforms_cron' );
}
add_action ( 'gravityforms_cron' , array ( 'GFForms' , 'cron' ) );
GF_Download :: maybe_process ();
//load text domains
GFCommon :: load_gf_text_domain ( 'gravityforms' );
add_filter ( 'gform_logging_supported' , array ( 'GFForms' , 'set_logging_supported' ) );
add_action ( 'admin_head' , array ( 'GFCommon' , 'maybe_output_gf_vars' ) );
add_action ( 'admin_head' , array ( 'GFForms' , 'load_admin_bar_styles' ) );
add_action ( 'wp_head' , array ( 'GFForms' , 'load_admin_bar_styles' ) );
self :: register_scripts ();
self :: init_background_upgrader ();
// Run background feed processing.
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/addon/class-gf-feed-processor.php' );
gf_feed_processor ();
// Maybe set up Gravity Forms: only on admin requests for single site installation and always for multisite
if ( ( IS_ADMIN && false === ( defined ( 'DOING_AJAX' ) && true === DOING_AJAX ) ) || is_multisite () ) {
gf_upgrade () -> maybe_upgrade ();
}
// Plugin update actions
add_filter ( 'transient_update_plugins' , array ( 'GFForms' , 'check_update' ) );
add_filter ( 'site_transient_update_plugins' , array ( 'GFForms' , 'check_update' ) );
add_filter ( 'auto_update_plugin' , array ( 'GFForms' , 'maybe_auto_update' ), 10 , 2 );
if ( IS_ADMIN ) {
global $current_user ;
//Members plugin integration. Adding Gravity Forms roles to the checkbox list
if ( self :: has_members_plugin () ) {
add_filter ( 'members_get_capabilities' , array ( 'GFForms' , 'members_get_capabilities' ) );
}
if ( is_multisite () ) {
add_filter ( 'wpmu_drop_tables' , array ( 'GFFormsModel' , 'mu_drop_tables' ) );
}
add_action ( 'admin_enqueue_scripts' , array ( 'GFForms' , 'enqueue_admin_scripts' ) );
add_action ( 'print_media_templates' , array ( 'GFForms' , 'action_print_media_templates' ) );
if ( defined ( 'WP_DEBUG' ) && WP_DEBUG ) {
add_action ( 'admin_footer' , array ( 'GFForms' , 'deprecate_add_on_methods' ) );
}
//Loading Gravity Forms if user has access to any functionality
if ( GFCommon :: current_user_can_any ( GFCommon :: all_caps () ) ) {
require_once ( GFCommon :: get_base_path () . '/export.php' );
GFExport :: maybe_export ();
//Imports theme forms if configured to be automatic imported
gf_upgrade () -> maybe_import_theme_forms ();
//creates the "Forms" left menu
add_action ( 'admin_menu' , array ( 'GFForms' , 'create_menu' ) );
// Add site-wide admin notices
add_action ( 'admin_notices' , array ( 'GFForms' , 'action_admin_notices' ) );
if ( GF_SUPPORTED_WP_VERSION ) {
add_action ( 'admin_footer' , array ( 'GFForms' , 'check_upload_folder' ) );
add_action ( 'wp_dashboard_setup' , array ( 'GFForms' , 'dashboard_setup' ) );
// Support modifying the admin page title for settings
add_filter ( 'admin_title' , array ( __class__ , 'modify_admin_title' ), 10 , 2 );
require_once ( GFCommon :: get_base_path () . '/includes/locking/locking.php' );
if ( self :: is_gravity_page () ) {
require_once ( GFCommon :: get_base_path () . '/tooltips.php' );
} elseif ( RG_CURRENT_PAGE == 'media-upload.php' ) {
require_once ( GFCommon :: get_base_path () . '/entry_list.php' );
} elseif ( in_array ( RG_CURRENT_PAGE , array ( 'admin.php' , 'admin-ajax.php' ) ) ) {
add_action ( 'wp_ajax_rg_save_form' , array ( 'GFForms' , 'save_form' ) );
add_action ( 'wp_ajax_rg_change_input_type' , array ( 'GFForms' , 'change_input_type' ) );
add_action ( 'wp_ajax_rg_refresh_field_preview' , array ( 'GFForms' , 'refresh_field_preview' ) );
add_action ( 'wp_ajax_rg_add_field' , array ( 'GFForms' , 'add_field' ) );
add_action ( 'wp_ajax_rg_duplicate_field' , array ( 'GFForms' , 'duplicate_field' ) );
add_action ( 'wp_ajax_rg_delete_field' , array ( 'GFForms' , 'delete_field' ) );
add_action ( 'wp_ajax_rg_delete_file' , array ( 'GFForms' , 'delete_file' ) );
add_action ( 'wp_ajax_rg_select_export_form' , array ( 'GFForms' , 'select_export_form' ) );
add_action ( 'wp_ajax_rg_start_export' , array ( 'GFForms' , 'start_export' ) );
add_action ( 'wp_ajax_gf_upgrade_license' , array ( 'GFForms' , 'upgrade_license' ) );
add_action ( 'wp_ajax_gf_delete_custom_choice' , array ( 'GFForms' , 'delete_custom_choice' ) );
add_action ( 'wp_ajax_gf_save_custom_choice' , array ( 'GFForms' , 'save_custom_choice' ) );
add_action ( 'wp_ajax_gf_get_post_categories' , array ( 'GFForms' , 'get_post_category_values' ) );
add_action ( 'wp_ajax_gf_get_address_rule_values_select' , array (
'GFForms' ,
'get_address_rule_values_select'
) );
add_action ( 'wp_ajax_gf_get_notification_post_categories' , array (
'GFForms' ,
'get_notification_post_category_values'
) );
//add_action( 'wp_ajax_gf_save_confirmation', array( 'GFForms', 'save_confirmation' ) );
add_action ( 'wp_ajax_gf_delete_confirmation' , array ( 'GFForms' , 'delete_confirmation' ) );
add_action ( 'wp_ajax_gf_save_new_form' , array ( 'GFForms' , 'save_new_form' ) );
add_action ( 'wp_ajax_gf_save_title' , array ( 'GFForms' , 'save_form_title' ) );
//entry list ajax operations
add_action ( 'wp_ajax_rg_update_lead_property' , array ( 'GFForms' , 'update_lead_property' ) );
add_action ( 'wp_ajax_delete-gf_entry' , array ( 'GFForms' , 'update_lead_status' ) );
//form list ajax operations
add_action ( 'wp_ajax_rg_update_form_active' , array ( 'GFForms' , 'update_form_active' ) );
//notification list ajax operations
add_action ( 'wp_ajax_rg_update_notification_active' , array (
'GFForms' ,
'update_notification_active'
) );
//confirmation list ajax operations
add_action ( 'wp_ajax_rg_update_confirmation_active' , array (
'GFForms' ,
'update_confirmation_active'
) );
//dynamic captcha image
add_action ( 'wp_ajax_rg_captcha_image' , array ( 'GFForms' , 'captcha_image' ) );
//dashboard message "dismiss upgrade" link
add_action ( 'wp_ajax_rg_dismiss_upgrade' , array ( 'GFForms' , 'dashboard_dismiss_upgrade' ) );
// entry detail: resend notifications
add_action ( 'wp_ajax_gf_resend_notifications' , array ( 'GFForms' , 'resend_notifications' ) );
// Shortcode UI
add_action ( 'wp_ajax_gf_do_shortcode' , array ( 'GFForms' , 'handle_ajax_do_shortcode' ) );
// Export
add_filter ( 'wp_ajax_gf_process_export' , array ( 'GFForms' , 'ajax_process_export' ) );
add_filter ( 'wp_ajax_gf_download_export' , array ( 'GFForms' , 'ajax_download_export' ) );
// Dismiss message
add_action ( 'wp_ajax_gf_dismiss_message' , array ( 'GFForms' , 'ajax_dismiss_message' ) );
// Check background tasks for the system report
add_action ( 'wp_ajax_gf_check_background_tasks' , array ( 'GFForms' , 'check_background_tasks' ) );
// Check status of upgrade
add_action ( 'wp_ajax_gf_force_upgrade' , array ( 'GFForms' , 'ajax_force_upgrade' ) );
}
add_filter ( 'plugins_api' , array ( 'GFForms' , 'get_addon_info' ), 100 , 3 );
add_action ( 'after_plugin_row' , array ( 'GFForms' , 'plugin_row' ) );
add_action ( 'in_plugin_update_message-gravityforms/gravityforms.php' , array ( 'GFForms' , 'in_plugin_update_message' ), 10 , 2 );
add_action ( 'install_plugins_pre_plugin-information' , array ( 'GFForms' , 'display_changelog' ), 9 );
add_filter ( 'plugin_action_links' , array ( 'GFForms' , 'plugin_settings_link' ), 10 , 2 );
}
}
add_action ( 'admin_init' , array ( 'GFForms' , 'ajax_parse_request' ), 10 );
$gf_page = self :: get_page ();
if ( $gf_page == 'entry_list' && ! isset ( $_GET [ 'filter' ] ) ) {
require_once ( GFCommon :: get_base_path () . '/entry_list.php' );
$default_filter = GFEntryList :: get_default_filter ();
if ( $default_filter !== 'all' ) {
$url = add_query_arg ( array ( 'filter' => $default_filter ) );
$url = esc_url_raw ( $url );
wp_safe_redirect ( $url );
}
}
if ( $gf_page == 'entry_list' ) {
add_filter ( 'set-screen-option' , array ( 'GFForms' , 'set_screen_options' ), 10 , 3 );
add_filter ( 'screen_settings' , array ( 'GFForms' , 'show_screen_options' ), 10 , 2 );
}
if ( $gf_page == 'form_list' ) {
add_filter ( 'set-screen-option' , array ( 'GFForms' , 'set_screen_options' ), 10 , 3 );
}
} else {
add_action ( 'wp_enqueue_scripts' , array ( 'GFForms' , 'enqueue_scripts' ), 11 );
add_action ( 'wp' , array ( 'GFForms' , 'ajax_parse_request' ), 10 );
}
// Add admin bar items
add_action ( 'wp_before_admin_bar_render' , array ( 'GFForms' , 'admin_bar' ) );
add_shortcode ( 'gravityform' , array ( 'GFForms' , 'parse_shortcode' ) );
add_shortcode ( 'gravityforms' , array ( 'GFForms' , 'parse_shortcode' ) );
// ManageWP premium update filters
add_filter ( 'mwp_premium_update_notification' , array ( 'GFForms' , 'premium_update_push' ) );
add_filter ( 'mwp_premium_perform_update' , array ( 'GFForms' , 'premium_update' ) );
// Push Gravity Forms to the top of the list of plugins to make sure it's loaded before any add-ons
add_action ( 'activated_plugin' , array ( 'GFForms' , 'load_first' ) );
// Add the "Add Form" button to the editor. The customizer doesn't run in the admin context.
if ( GFForms :: page_supports_add_form_button () ) {
require_once ( GFCommon :: get_base_path () . '/tooltips.php' );
// Adding "embed form" button to the editor
add_action ( 'media_buttons' , array ( 'GFForms' , 'add_form_button' ), 20 );
// Adding the modal
add_action ( 'admin_print_footer_scripts' , array ( 'GFForms' , 'add_mce_popup' ) );
}
}
/**
* Ensures that Gravity Forms is loaded first .
*
* @ since Unknown
* @ access public
*
* @ return void
*/
public static function load_first () {
$plugin_path = basename ( dirname ( __FILE__ ) ) . '/gravityforms.php' ;
$active_plugins = array_values ( maybe_unserialize ( self :: get_wp_option ( 'active_plugins' ) ) );
$key = array_search ( $plugin_path , $active_plugins );
if ( $key > 0 ) {
array_splice ( $active_plugins , $key , 1 );
array_unshift ( $active_plugins , $plugin_path );
update_option ( 'active_plugins' , $active_plugins );
}
}
/**
* Performs Gravity Forms deactivation tasks .
*
* @ since Unknown
* @ access public
*
* @ uses GFCache :: flush ()
*
* @ return void
*/
public static function deactivation_hook () {
GFCache :: flush ( true );
flush_rewrite_rules ();
}
/**
* Performs Gravity Forms activation tasks .
*
* @ since 2.3
* @ access public
*/
public static function activation_hook () {
self :: init_background_upgrader ();
gf_upgrade () -> maybe_upgrade ();
}
/**
* Add Gravity Forms to the plugins that support logging .
*
* @ since Unknown
* @ access public
*
* @ param array $plugins Existing plugins that support logging .
*
* @ return array $plugins Supported plugins .
*/
public static function set_logging_supported ( $plugins ) {
$plugins [ 'gravityforms' ] = 'Gravity Forms Core' ;
return $plugins ;
}
/**
* Gets the value of an option from the wp_options table .
*
* @ since Unknown
* @ access public
* @ global $wpdb
*
* @ param string $option_name The option to find .
*
* @ return string The option value , if found .
*/
public static function get_wp_option ( $option_name ) {
global $wpdb ;
return $wpdb -> get_var ( $wpdb -> prepare ( " SELECT option_value FROM { $wpdb -> prefix } options WHERE option_name=%s " , $option_name ) );
}
/**
* Determines if a form should be processed , and passes it off to processing .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: get_form ()
* @ uses GFCommon :: get_base_path ()
* @ uses GFFormDisplay :: process_form ()
* @ uses GFFormDisplay :: process_send_resume_link ()
*
* @ return void
*/
public static function maybe_process_form () {
$form_id = isset ( $_POST [ 'gform_submit' ] ) ? absint ( $_POST [ 'gform_submit' ] ) : 0 ;
if ( $form_id ) {
$form_info = RGFormsModel :: get_form ( $form_id );
$is_valid_form = $form_info && $form_info -> is_active ;
if ( $is_valid_form ) {
require_once ( GFCommon :: get_base_path () . '/form_display.php' );
GFFormDisplay :: process_form ( $form_id );
}
} elseif ( isset ( $_POST [ 'gform_send_resume_link' ] ) ) {
require_once ( GFCommon :: get_base_path () . '/form_display.php' );
GFFormDisplay :: process_send_resume_link ();
}
}
/**
* Processes pages that are not loaded directly within WordPress
*
* @ since Unknown
* @ access public
*
* @ uses GFCommon :: get_upload_page_slug ()
* @ uses GFCommon :: get_base_path ()
*
* @ return void
*/
public static function process_exterior_pages () {
if ( rgempty ( 'gf_page' , $_GET ) ) {
return ;
}
$page = rgget ( 'gf_page' );
$is_legacy_upload_page = $_SERVER [ 'REQUEST_METHOD' ] == 'POST' && $page == 'upload' ;
if ( $is_legacy_upload_page && ( ! defined ( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
_doing_it_wrong ( 'gf_page=upload' , 'gf_page=upload is now deprecated. Use GFCommon::get_upload_page_slug() instead' , '1.9.6.13' );
}
$is_upload_page = $_SERVER [ 'REQUEST_METHOD' ] == 'POST' && $page == GFCommon :: get_upload_page_slug ();
if ( $is_upload_page || $is_legacy_upload_page ) {
require_once ( GFCommon :: get_base_path () . '/includes/upload.php' );
exit ();
}
// Ensure users are logged in
if ( ! is_user_logged_in () ) {
auth_redirect ();
}
switch ( $page ) {
case 'preview' :
require_once ( GFCommon :: get_base_path () . '/preview.php' );
break ;
case 'print-entry' :
require_once ( GFCommon :: get_base_path () . '/print-entry.php' );
break ;
case 'select_columns' :
require_once ( GFCommon :: get_base_path () . '/select_columns.php' );
break ;
}
exit ();
}
/**
* Checks for Gravity Forms updates .
*
* @ since Unknown
* @ access public
*
* @ uses GFCommon :: check_update ()
*
* @ param GFAutoUpgrade $update_plugins_option The GFAutoUpgrade object .
*
* @ return GFAutoUpgrade The GFAutoUpgrade object .
*/
public static function check_update ( $update_plugins_option ) {
if ( ! class_exists ( 'GFCommon' ) ) {
require_once ( 'common.php' );
}
return GFCommon :: check_update ( $update_plugins_option , true );
}
/**
* Adds index and htaccess files to the upload root for security .
*
* @ since Unknown
* @ access public
*
* @ return void
*/
public static function add_security_files () {
GFCommon :: log_debug ( __METHOD__ . '(): Start adding security files' );
$upload_root = GFFormsModel :: get_upload_root ();
if ( ! is_dir ( $upload_root ) ) {
return ;
}
GFCommon :: recursive_add_index_file ( $upload_root );
GFCommon :: add_htaccess_file ();
}
/**
* Self - heals suspicious files .
*
* @ since Unknown
* @ access private
*
* @ uses GFForms :: heal_wp_upload_dir ()
* @ uses GFFormsModel :: get_upload_root ()
* @ uses GFForms :: rename_suspicious_files_recursive ()
*
* @ return void
*/
private static function do_self_healing () {
GFCommon :: log_debug ( __METHOD__ . '(): Start self healing' );
self :: heal_wp_upload_dir ();
$gf_upload_root = GFFormsModel :: get_upload_root ();
if ( ! is_dir ( $gf_upload_root ) || is_link ( $gf_upload_root ) ) {
return ;
}
self :: rename_suspicious_files_recursive ( $gf_upload_root );
}
/**
* Renames files with a . bak extension if they have a file extension that is not allowed in the Gravity Forms uploads folder .
*
* @ since Unknown
* @ access private
*
* @ used - by GFForms :: do_self_healing ()
*
* @ param string $dir The path to process .
*/
private static function rename_suspicious_files_recursive ( $dir ) {
if ( ! is_dir ( $dir ) || is_link ( $dir ) ) {
return ;
}
if ( ! ( $dir_handle = opendir ( $dir ) ) ) {
return ;
}
// Ignores all errors
set_error_handler ( '__return_false' , E_ALL );
while ( false !== ( $file = readdir ( $dir_handle ) ) ) {
if ( is_dir ( $dir . DIRECTORY_SEPARATOR . $file ) && $file != '.' && $file != '..' ) {
self :: rename_suspicious_files_recursive ( $dir . DIRECTORY_SEPARATOR . $file );
} elseif ( GFCommon :: file_name_has_disallowed_extension ( $file )
&& ! GFCommon :: match_file_extension ( $file , array ( 'htaccess' , 'bak' , 'html' ) )
) {
$mini_hash = substr ( wp_hash ( $file ), 0 , 6 );
$newName = sprintf ( '%s/%s.%s.bak' , $dir , $file , $mini_hash );
rename ( $dir . '/' . $file , $newName );
}
}
// Restores error handler
restore_error_handler ();
closedir ( $dir_handle );
return ;
}
/**
* Renames suspicious content within the wp_upload directory .
*
* @ since Unknown
* @ access private
*
* @ used - by GFForms :: do_self_healing ()
*/
private static function heal_wp_upload_dir () {
$wp_upload_dir = wp_upload_dir ();
$wp_upload_path = $wp_upload_dir [ 'basedir' ];
if ( ! is_dir ( $wp_upload_path ) || is_link ( $wp_upload_path ) ) {
return ;
}
// ignores all errors
set_error_handler ( '__return_false' , E_ALL );
foreach ( glob ( $wp_upload_path . DIRECTORY_SEPARATOR . '*_input_*.{php,php5}' , GLOB_BRACE ) as $filename ) {
$mini_hash = substr ( wp_hash ( $filename ), 0 , 6 );
$newName = sprintf ( '%s.%s.bak' , $filename , $mini_hash );
rename ( $filename , $newName );
}
// restores error handler
restore_error_handler ();
return ;
}
/**
* Defines styles needed for " no conflict mode "
*
* @ since Unknown
* @ access public
* @ global $wp_styles
*
* @ uses GFForms :: no_conflict_mode ()
*/
public static function no_conflict_mode_style () {
if ( ! get_option ( 'gform_enable_noconflict' ) ) {
return ;
}
global $wp_styles ;
$wp_required_styles = array ( 'admin-bar' , 'colors' , 'ie' , 'wp-admin' , 'editor-style' );
$gf_required_styles = array (
'common' => array ( 'gform_tooltip' , 'gform_font_awesome' , 'gform_admin' ),
'gf_edit_forms' => array (
'thickbox' ,
'editor-buttons' ,
'wp-jquery-ui-dialog' ,
'media-views' ,
'buttons' ,
'wp-pointer' ,
'gform_chosen' ,
),
'gf_edit_forms_notification' => array (
'thickbox' ,
'editor-buttons' ,
'wp-jquery-ui-dialog' ,
'media-views' ,
'buttons' ,
),
'gf_new_form' => array ( 'thickbox' ),
'gf_entries' => array ( 'thickbox' , 'gform_chosen' ),
'gf_settings' => array (),
'gf_export' => array (),
'gf_help' => array (),
'gf_system_status' => array ( 'thickbox' ),
);
self :: no_conflict_mode ( $wp_styles , $wp_required_styles , $gf_required_styles , 'styles' );
}
/**
* Defines scripts needed for " no conflict mode " .
*
* @ since Unknown
* @ access public
* @ global $wp_scripts
*
* @ uses GFForms :: no_conflict_mode ()
*/
public static function no_conflict_mode_script () {
if ( ! get_option ( 'gform_enable_noconflict' ) ) {
return ;
}
global $wp_scripts ;
$wp_required_scripts = array ( 'admin-bar' , 'common' , 'jquery-color' , 'utils' , 'svg-painter' );
$gf_required_scripts = array (
'common' => array ( 'gform_tooltip_init' , 'sack' ),
'gf_edit_forms' => array (
'backbone' ,
'editor' ,
'gform_floatmenu' ,
'gform_forms' ,
'gform_form_admin' ,
'gform_form_editor' ,
'gform_gravityforms' ,
'gform_json' ,
'gform_menu' ,
'gform_placeholder' ,
'jquery-ui-autocomplete' ,
'jquery-ui-core' ,
'jquery-ui-datepicker' ,
'jquery-ui-sortable' ,
'jquery-ui-draggable' ,
'jquery-ui-droppable' ,
'jquery-ui-tabs' ,
'json2' ,
'media-editor' ,
'media-models' ,
'media-upload' ,
'media-views' ,
'plupload' ,
'plupload-flash' ,
'plupload-html4' ,
'plupload-html5' ,
'quicktags' ,
'rg_currency' ,
'thickbox' ,
'word-count' ,
'wp-plupload' ,
'wpdialogs-popup' ,
'wplink' ,
'wp-pointer' ,
'gform_chosen' ,
),
'gf_edit_forms_notification' => array (
'editor' ,
'word-count' ,
'quicktags' ,
'wpdialogs-popup' ,
'media-upload' ,
'wplink' ,
'backbone' ,
'jquery-ui-sortable' ,
'json2' ,
'media-editor' ,
'media-models' ,
'media-views' ,
'plupload' ,
'plupload-flash' ,
'plupload-html4' ,
'plupload-html5' ,
'plupload-silverlight' ,
'wp-plupload' ,
'gform_placeholder' ,
'gform_json' ,
'jquery-ui-autocomplete' ,
),
'gf_new_form' => array (
'thickbox' ,
'jquery-ui-core' ,
'jquery-ui-sortable' ,
'jquery-ui-tabs' ,
'rg_currency' ,
'gform_gravityforms' ,
'gform_json' ,
'gform_form_admin' ,
),
'gf_entries' => array (
'thickbox' ,
'gform_gravityforms' ,
'wp-lists' ,
'gform_json' ,
'gform_field_filter' ,
'plupload-all' ,
'postbox' ,
'gform_chosen' ,
),
'gf_settings' => array (),
'gf_export' => array ( 'gform_form_admin' , 'jquery-ui-datepicker' , 'gform_field_filter' ),
'gf_help' => array (),
'gf_system_status' => array (
'gform_system_report_clipboard' ,
'thickbox' ,
'gform_placeholder' ),
);
self :: no_conflict_mode ( $wp_scripts , $wp_required_scripts , $gf_required_scripts , 'scripts' );
}
/**
* Runs " no conflict mode " .
*
* @ since Unknown
* @ access private
*
* @ used - by GFForms :: no_conflict_mode_style ()
* @ used - by GFForms :: no_conflict_mode_script ()
*
* @ param WP_Scripts $wp_objects WP_Scripts object .
* @ param array $wp_required_objects Scripts required by WordPress Core .
* @ param array $gf_required_objects Scripts required by Gravity Forms .
* @ param string $type Determines if scripts or styles are being run through the function .
*/
private static function no_conflict_mode ( & $wp_objects , $wp_required_objects , $gf_required_objects , $type = 'scripts' ) {
$current_page = trim ( strtolower ( rgget ( 'page' ) ) );
if ( empty ( $current_page ) ) {
$current_page = trim ( strtolower ( rgget ( 'gf_page' ) ) );
}
if ( empty ( $current_page ) ) {
$current_page = RG_CURRENT_PAGE ;
}
$view = rgempty ( 'view' , $_GET ) ? 'default' : rgget ( 'view' );
$page_objects = isset ( $gf_required_objects [ $current_page . '_' . $view ] ) ? $gf_required_objects [ $current_page . '_' . $view ] : rgar ( $gf_required_objects , $current_page );
//disable no-conflict if $page_objects is false
if ( $page_objects === false ) {
return ;
}
if ( ! is_array ( $page_objects ) ) {
$page_objects = array ();
}
//merging wp scripts with gravity forms scripts
$required_objects = array_merge ( $wp_required_objects , $gf_required_objects [ 'common' ], $page_objects );
//allowing addons or other products to change the list of no conflict scripts
$required_objects = apply_filters ( " gform_noconflict_ { $type } " , $required_objects );
$queue = array ();
foreach ( $wp_objects -> queue as $object ) {
if ( in_array ( $object , $required_objects ) ) {
$queue [] = $object ;
}
}
$wp_objects -> queue = $queue ;
$required_objects = self :: add_script_dependencies ( $wp_objects -> registered , $required_objects );
//unregistering scripts
$registered = array ();
foreach ( $wp_objects -> registered as $script_name => $script_registration ) {
if ( in_array ( $script_name , $required_objects ) ) {
$registered [ $script_name ] = $script_registration ;
}
}
$wp_objects -> registered = $registered ;
}
/**
* Adds script dependencies needed .
*
* @ since Unknown
* @ access private
*
* @ used - by GFForms :: no_conflict_mode ()
*
* @ param array $registered Registered scripts .
* @ param array $scripts Required scripts .
*
* @ return array $scripts Scripts including dependencies .
*/
private static function add_script_dependencies ( $registered , $scripts ) {
//gets all dependent scripts linked to the $scripts array passed
do {
$dependents = array ();
foreach ( $scripts as $script ) {
$deps = isset ( $registered [ $script ] ) && is_array ( $registered [ $script ] -> deps ) ? $registered [ $script ] -> deps : array ();
foreach ( $deps as $dep ) {
if ( ! in_array ( $dep , $scripts ) && ! in_array ( $dep , $dependents ) ) {
$dependents [] = $dep ;
}
}
}
$scripts = array_merge ( $scripts , $dependents );
} while ( ! empty ( $dependents ) );
return $scripts ;
}
/**
* Integration with ManageWP .
*
* @ since Unknown
* @ access public
*
* @ param array $premium_update ManageWP update array .
*
* @ return array $premium_update
*/
public static function premium_update_push ( $premium_update ) {
if ( ! function_exists ( 'get_plugin_data' ) ) {
include_once ( ABSPATH . 'wp-admin/includes/plugin.php' );
}
$update = GFCommon :: get_version_info ();
if ( rgar ( $update , 'is_valid_key' ) == true && version_compare ( GFCommon :: $version , $update [ 'version' ], '<' ) ) {
$gforms = get_plugin_data ( __FILE__ );
$gforms [ 'type' ] = 'plugin' ;
$gforms [ 'slug' ] = 'gravityforms/gravityforms.php' ;
$gforms [ 'new_version' ] = ! rgempty ( 'version' , $update ) ? $update [ 'version' ] : false ;
$premium_update [] = $gforms ;
}
return $premium_update ;
}
/**
* Integration with ManageWP .
*
* @ since Unknown
* @ access public
*
* @ param array $premium_update ManageWP update array .
*
* @ return array $premium_update .
*/
public static function premium_update ( $premium_update ) {
if ( ! function_exists ( 'get_plugin_data' ) ) {
include_once ( ABSPATH . 'wp-admin/includes/plugin.php' );
}
$update = GFCommon :: get_version_info ();
if ( rgar ( $update , 'is_valid_key' ) == true && version_compare ( GFCommon :: $version , $update [ 'version' ], '<' ) ) {
$gforms = get_plugin_data ( __FILE__ );
$gforms [ 'slug' ] = 'gravityforms/gravityforms.php' ; // If not set by default, always pass theme template
$gforms [ 'type' ] = 'plugin' ;
$gforms [ 'url' ] = ! rgempty ( 'url' , $update ) ? $update [ 'url' ] : false ; // OR provide your own callback function for managing the update
array_push ( $premium_update , $gforms );
}
return $premium_update ;
}
/**
* Validates that Gravity Forms is doing the database upgrade , and has permissions to do so .
*
* @ since Unknown
* @ access public
*
* @ param null $do_upgrade Not used .
* @ param string $hook_extra The plugin triggering the upgrade .
*
* @ return bool | WP_Error True if successful . Otherwise WP_Error object .
*/
public static function validate_upgrade ( $do_upgrade , $hook_extra ) {
return gf_upgrade () -> validate_upgrade ( $do_upgrade , $hook_extra );
}
/**
* Determines if a user has a particular capability .
*
* @ since Unknown
* @ access public
*
* @ param array $all_caps All capabilities .
* @ param array $cap Required capability . Stored in the [ 0 ] key .
* @ param array $args Not used .
*
* @ return array $all_caps All capabilities .
*/
public static function user_has_cap ( $all_caps , $cap , $args ) {
$gf_caps = GFCommon :: all_caps ();
$capability = rgar ( $cap , 0 );
if ( $capability != 'gform_full_access' ) {
return $all_caps ;
}
if ( ! self :: has_members_plugin () ) {
//give full access to administrators if the members plugin is not installed
if ( current_user_can ( 'administrator' ) || is_super_admin () ) {
$all_caps [ 'gform_full_access' ] = true ;
}
} else if ( current_user_can ( 'administrator' ) || is_super_admin () ) {
//checking if user has any GF permission.
$has_gf_cap = false ;
foreach ( $gf_caps as $gf_cap ) {
if ( rgar ( $all_caps , $gf_cap ) ) {
$has_gf_cap = true ;
}
}
if ( ! $has_gf_cap ) {
//give full access to administrators if none of the GF permissions are active by the Members plugin
$all_caps [ 'gform_full_access' ] = true ;
}
}
return $all_caps ;
}
/**
* Provides the Members plugin with Gravity Forms lists of capabilities .
*
* @ since Unknown
* @ access public
*
* @ param array $caps All capabilities .
*
* @ return array $caps The capabilities list .
*/
public static function members_get_capabilities ( $caps ) {
return array_merge ( $caps , GFCommon :: all_caps () );
}
/**
* Tests if the upload folder is writable and displays an error message if not .
*
* @ since Unknown
* @ access public
*
* @ return void
*/
public static function check_upload_folder () {
// Check if upload folder is writable
$folder = RGFormsModel :: get_upload_root ();
if ( empty ( $folder ) ) {
echo " <div class='error'>Upload folder is not writable. Export and file upload features will not be functional.</div> " ;
}
}
/**
* Checks if a Gravity Forms AJAX action is being performed .
*
* @ since Unknown
* @ access public
*
* @ return bool True if performing a Gravity Forms AJAX request . False , otherwise .
*/
public static function is_gravity_ajax_action () {
//Gravity Forms AJAX requests
$current_action = self :: post ( 'action' );
$gf_ajax_actions = array (
'rg_save_form' ,
'rg_change_input_type' ,
'rg_refresh_field_preview' ,
'rg_add_field' ,
'rg_duplicate_field' ,
'rg_delete_field' ,
'rg_select_export_form' ,
'rg_start_export' ,
'gf_upgrade_license' ,
'gf_delete_custom_choice' ,
'gf_save_custom_choice' ,
'gf_get_notification_post_categories' ,
'rg_update_lead_property' ,
'delete-gf_entry' ,
'rg_update_form_active' ,
'rg_update_notification_active' ,
'rg_update_confirmation_active' ,
'gf_resend_notifications' ,
'rg_dismiss_upgrade' ,
'gf_save_confirmation' ,
'gf_process_export' ,
'gf_download_export' ,
'gf_dismiss_message' ,
'gf_force_upgrade' ,
);
if ( defined ( 'DOING_AJAX' ) && DOING_AJAX && in_array ( $current_action , $gf_ajax_actions ) ) {
return true ;
}
// Not a Gravity Forms ajax request.
return false ;
}
// Returns true if the current page is one of Gravity Forms pages. Returns false if not
/**
* Determines if the current page is part of Gravity Forms .
*
* @ since Unknown
* @ access public
*
* @ return bool
*/
public static function is_gravity_page () {
// Gravity Forms pages
$current_page = trim ( strtolower ( self :: get ( 'page' ) ) );
$gf_pages = array ( 'gf_edit_forms' , 'gf_new_form' , 'gf_entries' , 'gf_settings' , 'gf_export' , 'gf_help' , 'gf_addons' , 'gf_system_status' );
return in_array ( $current_page , $gf_pages );
}
/**
* Creates the " Forms " left nav .
*
* WordPress generates the page hook suffix and screen ID by passing the translated menu title through sanitize_title () .
* Screen options and metabox preferences are stored using the screen ID therefore :
* 1. The page suffix or screen ID should never be hard - coded . Use get_current_screen () -> id .
* 2. The page suffix and screen ID must never change .
* e . g . When an update for Gravity Forms is available an icon will be added to the the menu title .
* The HTML for the icon will be stripped entirely by sanitize_title () because the number 1 is encoded .
*
* @ since Unknown
* @ access public
*
* @ return void
*/
public static function create_menu () {
$has_full_access = current_user_can ( 'gform_full_access' );
$min_cap = GFCommon :: current_user_can_which ( GFCommon :: all_caps () );
if ( empty ( $min_cap ) ) {
$min_cap = 'gform_full_access' ;
}
$addon_menus = array ();
$addon_menus = apply_filters ( 'gform_addon_navigation' , $addon_menus );
$parent_menu = self :: get_parent_menu ( $addon_menus );
// Add a top-level left nav.
$update_icon = GFCommon :: has_update () && current_user_can ( 'install_plugins' ) ? " <span title=' " . esc_attr ( __ ( 'Update Available' , 'gravityforms' ) ) . " ' class='update-plugins count-1'><span class='update-count'>1</span></span> " : '' ;
$admin_icon = self :: get_admin_icon_b64 ( GFForms :: is_gravity_page () ? '#fff' : false );
$forms_hook_suffix = add_menu_page ( __ ( 'Forms' , 'gravityforms' ), __ ( 'Forms' , 'gravityforms' ) . $update_icon , $has_full_access ? 'gform_full_access' : $min_cap , $parent_menu [ 'name' ], $parent_menu [ 'callback' ], $admin_icon , apply_filters ( 'gform_menu_position' , '16.9' ) );
add_action ( 'load-' . $forms_hook_suffix , array ( 'GFForms' , 'load_screen_options' ) );
// Adding submenu pages
add_submenu_page ( $parent_menu [ 'name' ], __ ( 'Forms' , 'gravityforms' ), __ ( 'Forms' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : 'gravityforms_edit_forms' , 'gf_edit_forms' , array (
'GFForms' ,
'forms'
) );
add_submenu_page ( $parent_menu [ 'name' ], __ ( 'New Form' , 'gravityforms' ), __ ( 'New Form' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : 'gravityforms_create_form' , 'gf_new_form' , array (
'GFForms' ,
'new_form'
) );
$entries_hook_suffix = add_submenu_page ( $parent_menu [ 'name' ], __ ( 'Entries' , 'gravityforms' ), __ ( 'Entries' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : 'gravityforms_view_entries' , 'gf_entries' , array (
'GFForms' ,
'all_leads_page'
) );
add_action ( 'load-' . $entries_hook_suffix , array ( 'GFForms' , 'load_screen_options' ) );
if ( is_array ( $addon_menus ) ) {
foreach ( $addon_menus as $addon_menu ) {
add_submenu_page ( esc_html ( $parent_menu [ 'name' ] ), esc_html ( $addon_menu [ 'label' ] ), esc_html ( $addon_menu [ 'label' ] ), $has_full_access ? 'gform_full_access' : $addon_menu [ 'permission' ], esc_html ( $addon_menu [ 'name' ] ), $addon_menu [ 'callback' ] );
}
}
add_submenu_page ( $parent_menu [ 'name' ], __ ( 'Settings' , 'gravityforms' ), __ ( 'Settings' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : 'gravityforms_view_settings' , 'gf_settings' , array (
'GFForms' ,
'settings_page'
) );
add_submenu_page ( $parent_menu [ 'name' ], __ ( 'Import/Export' , 'gravityforms' ), __ ( 'Import/Export' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : 'gravityforms_export_entries' , 'gf_export' , array (
'GFForms' ,
'export_page'
) );
if ( current_user_can ( 'install_plugins' ) ) {
add_submenu_page ( $parent_menu [ 'name' ], __ ( 'Add-Ons' , 'gravityforms' ), __ ( 'Add-Ons' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : 'gravityforms_view_addons' , 'gf_addons' , array (
'GFForms' ,
'addons_page'
) );
}
add_submenu_page ( $parent_menu [ 'name' ], __ ( 'System Status' , 'gravityforms' ), __ ( 'System Status' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : 'gravityforms_system_status' , 'gf_system_status' , array (
'GFForms' ,
'system_status'
) );
add_submenu_page ( $parent_menu [ 'name' ], __ ( 'Help' , 'gravityforms' ), __ ( 'Help' , 'gravityforms' ), $has_full_access ? 'gform_full_access' : $min_cap , 'gf_help' , array (
'GFForms' ,
'help_page'
) );
}
/**
* Gets the admin icon for the Forms menu item
*
* @ since Unknown
* @ access public
*
* @ param bool | string $color The hex color if changing the color of the icon . Defaults to false .
*
* @ return string Base64 encoded icon string .
*/
public static function get_admin_icon_b64 ( $color = false ) {
// Replace the hex color (default was #999999) to %s; it will be replaced by the passed $color
if ( $color ) {
$svg_xml = '<?xml version="1.0" encoding="utf-8"?>' . self :: get_admin_icon_svg ( $color );
$icon = sprintf ( 'data:image/svg+xml;base64,%s' , base64_encode ( sprintf ( $svg_xml , $color ) ) );
} else {
$svg_b64 = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSItMTUgNzcgNTgxIDY0MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAtMTUgNzcgNTgxIDY0MCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGcgaWQ9IkxheWVyXzIiPjxwYXRoIGZpbGw9IiM5OTk5OTkiIGQ9Ik00ODkuNSwyMjdMNDg5LjUsMjI3TDMxNS45LDEyNi44Yy0yMi4xLTEyLjgtNTguNC0xMi44LTgwLjUsMEw2MS44LDIyN2MtMjIuMSwxMi44LTQwLjMsNDQuMi00MC4zLDY5Ljd2MjAwLjVjMCwyNS42LDE4LjEsNTYuOSw0MC4zLDY5LjdsMTczLjYsMTAwLjJjMjIuMSwxMi44LDU4LjQsMTIuOCw4MC41LDBMNDg5LjUsNTY3YzIyLjItMTIuOCw0MC4zLTQ0LjIsNDAuMy02OS43VjI5Ni44QzUyOS44LDI3MS4yLDUxMS43LDIzOS44LDQ4OS41LDIyN3ogTTQwMSwzMDAuNHY1OS4zSDI0MXYtNTkuM0g0MDF6IE0xNjMuMyw0OTAuOWMtMTYuNCwwLTI5LjYtMTMuMy0yOS42LTI5LjZjMC0xNi40LDEzLjMtMjkuNiwyOS42LTI5LjZzMjkuNiwxMy4zLDI5LjYsMjkuNkMxOTIuOSw0NzcuNiwxNzkuNiw0OTAuOSwxNjMuMyw0OTAuOXogTTE2My4zLDM1OS43Yy0xNi40LDAtMjkuNi0xMy4zLTI5LjYtMjkuNnMxMy4zLTI5LjYsMjkuNi0yOS42czI5LjYsMTMuMywyOS42LDI5LjZTMTc5LjYsMzU5LjcsMTYzLjMsMzU5Ljd6IE0yNDEsNDkwLjl2LTU5LjNoMTYwdjU5LjNIMjQxeiIvPjwvZz48L3N2Zz4=' ;
$icon = 'data:image/svg+xml;base64,' . $svg_b64 ;
}
return $icon ;
}
/**
* Returns the admin icon in SVG format .
*
* @ since Unknown
* @ access public
*
* @ param string $color The hex color if changing the color of the icon . Defaults to #999999.
*
* @ return string
*/
public static function get_admin_icon_svg ( $color = '#999999' ) {
$svg = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-15 77 581 640" enable-background="new -15 77 581 640" xml:space="preserve"><g id="Layer_2"><path fill="%s" d="M489.5,227L489.5,227L315.9,126.8c-22.1-12.8-58.4-12.8-80.5,0L61.8,227c-22.1,12.8-40.3,44.2-40.3,69.7v200.5c0,25.6,18.1,56.9,40.3,69.7l173.6,100.2c22.1,12.8,58.4,12.8,80.5,0L489.5,567c22.2-12.8,40.3-44.2,40.3-69.7V296.8C529.8,271.2,511.7,239.8,489.5,227z M401,300.4v59.3H241v-59.3H401z M163.3,490.9c-16.4,0-29.6-13.3-29.6-29.6c0-16.4,13.3-29.6,29.6-29.6s29.6,13.3,29.6,29.6C192.9,477.6,179.6,490.9,163.3,490.9z M163.3,359.7c-16.4,0-29.6-13.3-29.6-29.6s13.3-29.6,29.6-29.6s29.6,13.3,29.6,29.6S179.6,359.7,163.3,359.7z M241,490.9v-59.3h160v59.3H241z"/></g></svg>' ;
return sprintf ( $svg , $color );
}
/**
* Returns the parent menu item .
*
* It needs to be the same as the first sub - menu ( otherwise WP will duplicate the main menu as a sub - menu ) .
*
* @ since Unknown
* @ access public
*
* @ param array $addon_menus Contains the add - on menu items .
*
* @ return array $parent The parent menu array .
*/
public static function get_parent_menu ( $addon_menus ) {
if ( GFCommon :: current_user_can_any ( 'gravityforms_edit_forms' ) ) {
$parent = array ( 'name' => 'gf_edit_forms' , 'callback' => array ( 'GFForms' , 'forms' ) );
} else if ( GFCommon :: current_user_can_any ( 'gravityforms_create_form' ) ) {
$parent = array ( 'name' => 'gf_new_form' , 'callback' => array ( 'GFForms' , 'new_form' ) );
} else if ( GFCommon :: current_user_can_any ( 'gravityforms_view_entries' ) ) {
$parent = array ( 'name' => 'gf_entries' , 'callback' => array ( 'GFForms' , 'all_leads_page' ) );
} else if ( is_array ( $addon_menus ) && sizeof ( $addon_menus ) > 0 ) {
foreach ( $addon_menus as $addon_menu ) {
if ( GFCommon :: current_user_can_any ( $addon_menu [ 'permission' ] ) ) {
$parent = array ( 'name' => $addon_menu [ 'name' ], 'callback' => $addon_menu [ 'callback' ] );
break ;
}
}
} else if ( GFCommon :: current_user_can_any ( 'gravityforms_view_settings' ) ) {
$parent = array ( 'name' => 'gf_settings' , 'callback' => array ( 'GFForms' , 'settings_page' ) );
} else if ( GFCommon :: current_user_can_any ( 'gravityforms_export_entries' ) ) {
$parent = array ( 'name' => 'gf_export' , 'callback' => array ( 'GFForms' , 'export_page' ) );
} else if ( GFCommon :: current_user_can_any ( 'gravityforms_view_addons' ) ) {
$parent = array ( 'name' => 'gf_addons' , 'callback' => array ( 'GFForms' , 'addons_page' ) );
} else if ( GFCommon :: current_user_can_any ( 'gravityforms_system_status' ) ) {
$parent = array ( 'name' => 'gf_system_status' , 'callback' => array ( 'GFForms' , 'system_status_page' ) );
} else if ( GFCommon :: current_user_can_any ( GFCommon :: all_caps () ) ) {
$parent = array ( 'name' => 'gf_help' , 'callback' => array ( 'GFForms' , 'help_page' ) );
}
return $parent ;
}
/**
* Modifies the page title when on Gravity Forms settings pages .
*
* @ since Unknown
* @ access public
*
* @ param string $admin_title The current admin title
* @ param string $title Not used .
*
* @ return string The modified admin title .
*/
public static function modify_admin_title ( $admin_title , $title ) {
$subview = rgget ( 'subview' );
$form_id = rgget ( 'id' );
if ( ! $form_id || rgget ( 'page' ) != 'gf_edit_forms' || rgget ( 'view' ) != 'settings' ) {
return $admin_title ;
}
require_once ( GFCommon :: get_base_path () . '/form_settings.php' );
$setting_tabs = GFFormSettings :: get_tabs ( $form_id );
$page_title = '' ;
foreach ( $setting_tabs as $tab ) {
if ( $tab [ 'name' ] == $subview ) {
$page_title = $tab [ 'label' ];
}
}
if ( $page_title ) {
$admin_title = sprintf ( __ ( '%1$s ‹ %2$s — WordPress' , 'gravityforms' ), esc_html ( $page_title ), $admin_title );
}
return $admin_title ;
}
/**
* Parses Gravity Forms shortcode attributes and displays the form .
*
* @ since Unknown
* @ access public
*
* @ param array $attributes The shortcode attributes .
* @ param null $content Defines the content of the shortcode . Defaults to null .
*
* @ return mixed | string | void
*/
public static function parse_shortcode ( $attributes , $content = null ) {
extract (
shortcode_atts (
array (
'title' => true ,
'description' => true ,
'id' => 0 ,
'name' => '' ,
'field_values' => '' ,
'ajax' => false ,
'tabindex' => 0 ,
'action' => 'form' ,
), $attributes , 'gravityforms'
)
);
$shortcode_string = '' ;
switch ( $action ) {
case 'conditional' :
$shortcode_string = GFCommon :: conditional_shortcode ( $attributes , $content );
break ;
default :
// don't retrieve form markup for custom actions
if ( $action && $action != 'form' ) {
break ;
}
//displaying form
$title = strtolower ( $title ) == 'false' ? false : true ;
$description = strtolower ( $description ) == 'false' ? false : true ;
$field_values = htmlspecialchars_decode ( $field_values );
$field_values = str_replace ( '&' , '&' , $field_values );
$ajax = strtolower ( $ajax ) == 'true' ? true : false ;
//using name to lookup form if id is not specified
if ( empty ( $id ) ) {
$id = $name ;
}
parse_str ( $field_values , $field_value_array ); //parsing query string like string for field values and placing them into an associative array
$field_value_array = stripslashes_deep ( $field_value_array );
$shortcode_string = self :: get_form ( $id , $title , $description , false , $field_value_array , $ajax , $tabindex );
}
/**
* Filters the shortcode .
*
* @ since Unknown
*
* @ param string $shortcode_string The full shortcode string .
* @ param array $attributes The attributes within the shortcode .
* @ param string $content The content of the shortcode , if available .
*/
$shortcode_string = apply_filters ( " gform_shortcode_ { $action } " , $shortcode_string , $attributes , $content );
return $shortcode_string ;
}
/**
* Includes the add - on framework .
*
* @ since Unknown
* @ access public
*/
public static function include_addon_framework () {
require_once ( GFCommon :: get_base_path () . '/includes/addon/class-gf-addon.php' );
}
/**
* Includes the feed class for the add - on framework .
*
* @ since Unknown
* @ access public
*/
public static function include_feed_addon_framework () {
require_once ( GFCommon :: get_base_path () . '/includes/addon/class-gf-feed-addon.php' );
}
/**
* Includes the payment class for te add - on framework .
*
* @ since Unknown
* @ access public
*/
public static function include_payment_addon_framework () {
require_once ( GFCommon :: get_base_path () . '/includes/addon/class-gf-payment-addon.php' );
}
/**
* Includes the Gravity API
*
* @ since Unknown
* @ access public
*/
public static function include_gravity_api () {
require_once ( GFCommon :: get_base_path () . '/includes/class-gravity-api.php' );
}
//-------------------------------------------------
//----------- AJAX --------------------------------
/**
* Parses AJAX requests .
*
* @ since Unknown
* @ access public
*
* @ param null $wp Not used .
*/
public static function ajax_parse_request ( $wp ) {
if ( isset ( $_POST [ 'gform_ajax' ] ) ) {
parse_str ( $_POST [ 'gform_ajax' ], $args );
$form_id = absint ( $args [ 'form_id' ] );
$display_title = ( bool ) $args [ 'title' ];
$display_description = ( bool ) $args [ 'description' ];
$tabindex = isset ( $args [ 'tabindex' ] ) ? absint ( $args [ 'tabindex' ] ) : 1 ;
parse_str ( $_POST [ 'gform_field_values' ], $field_values );
require_once ( GFCommon :: get_base_path () . '/form_display.php' );
$result = GFFormDisplay :: get_form ( $form_id , $display_title , $display_description , false , $field_values , true , $tabindex );
die ( $result );
}
}
//------------------------------------------------------
//------------- PAGE/POST EDIT PAGE ---------------------
/**
* Determines if the " Add Form " button should be added to the page .
*
* @ since Unknown
* @ access public
*
* @ return boolean $display_add_form_button True if the page is supported . False otherwise .
*/
public static function page_supports_add_form_button () {
$is_post_edit_page = in_array ( RG_CURRENT_PAGE , array (
'post.php' ,
'page.php' ,
'page-new.php' ,
'post-new.php' ,
'customize.php' ,
) );
$display_add_form_button = apply_filters ( 'gform_display_add_form_button' , $is_post_edit_page );
return $display_add_form_button ;
}
/**
* Creates the " Add Form " button .
*
* @ since Unknown
* @ access public
*/
public static function add_form_button () {
$is_add_form_page = self :: page_supports_add_form_button ();
if ( ! $is_add_form_page ) {
return ;
}
// display button matching new UI
echo ' < style >. gform_media_icon {
background - position : center center ;
background - repeat : no - repeat ;
background - size : 16 px auto ;
float : left ;
height : 16 px ;
margin : 0 ;
text - align : center ;
width : 16 px ;
padding - top : 10 px ;
}
. gform_media_icon : before {
color : #999;
padding : 7 px 0 ;
transition : all 0.1 s ease - in - out 0 s ;
}
. wp - core - ui a . gform_media_link {
padding - left : 0.4 em ;
}
</ style >
< a href = " # " class = " button gform_media_link " id = " add_gform " title = " ' . esc_attr__( 'Add Gravity Form', 'gravityforms' ) . ' " >< div class = " gform_media_icon svg " style = " background-image: url( \ '' . self::get_admin_icon_b64() . ' \ ') " >< br /></ div >< div style = " padding-left: 20px; " > ' . esc_html__( ' Add Form ', ' gravityforms ' ) . ' </ div ></ a > ' ;
}
/**
* Displays the popup to insert a form to a post / page .
*
* @ since Unknown
* @ access public
*/
public static function add_mce_popup () {
?>
< script >
function InsertForm () {
var form_id = jQuery ( " #add_form_id " ) . val ();
if ( form_id == " " ) {
alert ( < ? php echo json_encode ( __ ( 'Please select a form' , 'gravityforms' ) ); ?> );
return ;
}
var form_name = jQuery ( " #add_form_id option[value=' " + form_id + " '] " ) . text () . replace ( / [ \ [ \ ]] / g , '' );
var display_title = jQuery ( " #display_title " ) . is ( " :checked " );
var display_description = jQuery ( " #display_description " ) . is ( " :checked " );
var ajax = jQuery ( " #gform_ajax " ) . is ( " :checked " );
var title_qs = ! display_title ? " title= \" false \" " : " " ;
var description_qs = ! display_description ? " description= \" false \" " : " " ;
var ajax_qs = ajax ? " ajax= \" true \" " : " " ;
window . send_to_editor ( " [gravityform id= \" " + form_id + " \" name= \" " + form_name + " \" " + title_qs + description_qs + ajax_qs + " ] " );
}
</ script >
< div id = " select_gravity_form " style = " display:none; " >
< div id = " gform-shortcode-ui-wrap " class = " wrap <?php echo GFCommon::get_browser_class() ?> " >
< div id = " gform-shortcode-ui-container " ></ div >
</ div >
</ div >
< ? php
}
//------------------------------------------------------
//------------- PLUGINS PAGE ---------------------------
//------------------------------------------------------
/**
* Creates the Settings link within the Plugins page .
*
* @ since Unknown
* @ access public
*
* @ param array $links Links associated with the plugin .
* @ param string $file The plugin filename .
*
* @ return array $links Links associated with the plugin , after the Settings link is added .
*/
public static function plugin_settings_link ( $links , $file ) {
if ( $file != plugin_basename ( __FILE__ ) ) {
return $links ;
}
array_unshift ( $links , '<a href="' . esc_url ( admin_url ( 'admin.php' ) ) . '?page=gf_settings">' . esc_html__ ( 'Settings' , 'gravityforms' ) . '</a>' );
return $links ;
}
/**
* Displays messages for the Gravity Forms listing on the Plugins page .
*
* Displays if the key is invalid or an update is available .
*
* @ since Unknown
* @ access public
*
* @ param string $plugin_name The plugin filename . Immediately overwritten .
*/
public static function plugin_row ( $plugin_name ) {
if ( $plugin_name == 'gravityforms/gravityforms.php' ) {
$version_info = GFCommon :: get_version_info ();
if ( ! rgar ( $version_info , 'is_valid_key' ) ) {
$new_version = version_compare ( GFCommon :: $version , $version_info [ 'version' ], '<' ) ? esc_html__ ( 'There is a new version of Gravity Forms available.' , 'gravityforms' ) . ' <a class="thickbox" title="Gravity Forms" href="plugin-install.php?tab=plugin-information&plugin=gravityforms&TB_iframe=true&width=640&height=808">' . sprintf ( esc_html__ ( 'View version %s Details' , 'gravityforms' ), $version_info [ 'version' ] ) . '</a>. ' : '' ;
echo '</tr><tr class="plugin-update-tr"><td colspan="3" class="plugin-update"><div class="update-message">' . $new_version . sprintf ( esc_html__ ( '%sRegister%s your copy of Gravity Forms to receive access to automatic upgrades and support. Need a license key? %sPurchase one now%s.' , 'gravityforms' ), '<a href="' . admin_url () . 'admin.php?page=gf_settings">' , '</a>' , '<a href="https://www.gravityforms.com">' , '</a>' ) . '</div></td>' ;
}
return ;
}
$add_ons = gf_upgrade () -> get_min_addon_requirements ();
if ( isset ( $add_ons [ $plugin_name ] ) ) {
$plugin_path = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin_name ;
if ( ! file_exists ( $plugin_path ) ) {
return ;
}
$plugin_data = get_plugin_data ( $plugin_path , false , false );
$current_version = $plugin_data [ 'Version' ];
$add_on = $add_ons [ $plugin_name ];
$min_version = $add_on [ 'min_version' ];
if ( version_compare ( $current_version , $min_version , '<' ) ) {
$name = $add_on [ 'name' ];
/* translators: 1: The name of the add-on, 2: version number. */
$message = esc_html__ ( 'This version of the %1$s is not compatible with the version of Gravity Forms that is installed. Upgrade this add-on to version %2$s or greater to avoid compatibility issues and potential loss of data.' , 'gravityforms' );
echo '</tr><tr class="plugin-update-tr"><td colspan="3" style="border-left: 4px solid #dc3232;"><div class="update-message">' . sprintf ( $message , $name , $min_version ) . '</div></td>' ;
}
}
}
/**
* Hooks into in_plugin_update_message - gravityforms / gravityforms . php and displays an update message specifically for Gravity Forms 2.3 .
*
* @ param $args
* @ param $response
*/
public static function in_plugin_update_message ( $args , $response ) {
if ( empty ( $args [ 'update' ] ) ) {
return ;
}
if ( version_compare ( $args [ 'new_version' ], '2.3' , '>=' ) && version_compare ( GFForms :: $version , '2.3' , '<' ) ) {
$message = esc_html__ ( 'IMPORTANT: As this is a major update, we strongly recommend creating a backup of your site before updating.' , 'gravityforms' );
require_once ( GFCommon :: get_base_path () . '/includes/system-status/class-gf-update.php' );
$updates = GF_Update :: available_updates ();
$addons_requiring_updates = array ();
foreach ( $updates as $update ) {
if ( $update [ 'slug' ] == 'gravityforms' ) {
continue ;
}
$update_available = version_compare ( $update [ 'installed_version' ], $update [ 'latest_version' ], '<' );
if ( $update_available ) {
$addons_requiring_updates [] = $update [ 'name' ] . ' ' . $update [ 'installed_version' ];
}
}
if ( count ( $addons_requiring_updates ) > 0 ) {
/* translators: %s: version number */
$message .= '<br />' . sprintf ( esc_html__ ( " The versions of the following add-ons you're running haven't been tested with Gravity Forms %s. Please update them or confirm compatibility before updating Gravity Forms, or you may experience issues: " , 'gravityforms' ), $args [ 'new_version' ] );
$message .= ' ' . join ( ', ' , $addons_requiring_updates );
}
echo sprintf ( '<br /><br /><span style="display:inline-block;background-color: #d54e21; padding: 10px; color: #f9f9f9;">%s</span><br /><br />' , $message );
}
}
/**
* Displays current version details on Plugins page
*
* @ since Unknown
* @ access public
*/
public static function display_changelog () {
if ( $_REQUEST [ 'plugin' ] != 'gravityforms' ) {
return ;
}
$page_text = self :: get_changelog ();
echo $page_text ;
exit ;
}
/**
* Gets the changelog for the newest version
*
* @ since Unknown
* @ access public
*
* @ return string $page_text The changelog . Error message if there ' s an issue .
*/
public static function get_changelog () {
$key = GFCommon :: get_key ();
$body = " key= $key " ;
$options = array ( 'method' => 'POST' , 'timeout' => 3 , 'body' => $body );
$options [ 'headers' ] = array (
'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option ( 'blog_charset' ),
'Content-Length' => strlen ( $body ),
'User-Agent' => 'WordPress/' . get_bloginfo ( 'version' ),
'Referer' => get_bloginfo ( 'url' )
);
$raw_response = GFCommon :: post_to_manager ( 'changelog.php' , GFCommon :: get_remote_request_params (), $options );
if ( is_wp_error ( $raw_response ) || 200 != $raw_response [ 'response' ][ 'code' ] ) {
$page_text = sprintf ( esc_html__ ( 'Oops!! Something went wrong. %sPlease try again or %scontact us%s.' , 'gravityforms' ), '<br/>' , " <a href='https://www.gravityforms.com/support/'> " , '</a>' );
} else {
$page_text = $raw_response [ 'body' ];
if ( substr ( $page_text , 0 , 10 ) != '<!--GFM-->' ) {
$page_text = '' ;
} else {
$page_text = '<div style="background-color:white">' . $page_text . '<div>' ;
}
}
return stripslashes ( $page_text );
}
//------------------------------------------------------
//-------------- DASHBOARD PAGE -------------------------
/**
* Registers the dashboard widget .
*
* @ since Unknown
* @ access public
*/
public static function dashboard_setup () {
/**
* Changes the dashboard widget title
*
* @ param string $dashboard_title The dashboard widget title .
*/
$dashboard_title = apply_filters ( 'gform_dashboard_title' , __ ( 'Forms' , 'gravityforms' ) );
wp_add_dashboard_widget ( 'rg_forms_dashboard' , $dashboard_title , array ( 'GFForms' , 'dashboard' ) );
}
/**
* Displays the dashboard UI .
*
* @ since Unknown
* @ access public
*/
public static function dashboard () {
$forms = RGFormsModel :: get_form_summary ();
if ( sizeof ( $forms ) > 0 ) {
?>
< table class = " widefat gf_dashboard_view " cellspacing = " 0 " style = " border:0px; " >
< thead >
< tr >
< td class = " gf_dashboard_form_title_header " style = " text-align:left; padding:8px 18px!important; font-weight:bold; " >
< i >< ? php esc_html_e ( 'Title' , 'gravityforms' ) ?> </i></td>
< td class = " gf_dashboard_entries_unread_header " style = " text-align:center; padding:8px 18px!important; font-weight:bold; " >
< i >< ? php esc_html_e ( 'Unread' , 'gravityforms' ) ?> </i></td>
< td class = " gf_dashboard_entries_total_header " style = " text-align:center; padding:8px 18px!important; font-weight:bold; " >
< i >< ? php esc_html_e ( 'Total' , 'gravityforms' ) ?> </i></td>
</ tr >
</ thead >
< tbody class = " list:user user-list " >
< ? php
foreach ( $forms as $form ) {
if ( $form [ 'is_trash' ] ) {
continue ;
}
$date_display = GFCommon :: format_date ( $form [ 'last_entry_date' ] );
if ( ! empty ( $form [ 'total_entries' ] ) ) {
?>
< tr class = 'author-self status-inherit' valign = " top " >
< td class = " gf_dashboard_form_title column-title " style = " padding:8px 18px; " >
< a < ? php echo $form [ 'unread_count' ] > 0 ? " class='form_title_unread' style='font-weight:bold;' " : '' ?> href="admin.php?page=gf_entries&view=entries&id=<?php echo absint( $form['id'] ) ?>" title="<?php echo esc_attr( $form['title'] ) ?> : <?php esc_attr_e( 'View All Entries', 'gravityforms' ) ?>"><?php echo esc_html( $form['title'] ) ?></a>
</ td >
< td class = " gf_dashboard_entries_unread column-date " style = " padding:8px 18px; text-align:center; " >
< a < ? php echo $form [ 'unread_count' ] > 0 ? " class='form_entries_unread' style='font-weight:bold;' " : '' ?> href="admin.php?page=gf_entries&view=entries&filter=unread&id=<?php echo absint( $form['id'] ) ?>" title="<?php printf( esc_attr__( 'Last Entry: %s', 'gravityforms' ), $date_display ); ?>"><?php echo absint( $form['unread_count'] ) ?></a>
</ td >
< td class = " gf_dashboard_entries_total column-date " style = " padding:8px 18px; text-align:center; " >
< a href = " admin.php?page=gf_entries&view=entries&id=<?php echo absint( $form['id'] ) ?> " title = " <?php esc_attr_e( 'View All Entries', 'gravityforms' ) ?> " >< ? php echo absint ( $form [ 'total_entries' ] ) ?> </a>
</ td >
</ tr >
< ? php
}
}
?>
</ tbody >
</ table >
< ? php if ( GFCommon :: current_user_can_any ( 'gravityforms_edit_forms' ) ) : ?>
< p class = " textright " >
< a class = " gf_dashboard_button button " href = " admin.php?page=gf_edit_forms " >< ? php esc_html_e ( 'View All Forms' , 'gravityforms' ) ?> </a>
< ? php endif ; ?>
</ p >
< ? php
} else {
?>
< div class = " gf_dashboard_noforms_notice " >
< ? php echo sprintf ( esc_html__ ( " You don't have any forms. Let's go %screate one %s! " , 'gravityforms' ), '<a href="admin.php?page=gf_new_form">' , '</a>' ); ?>
</ div >
< ? php
}
if ( GFCommon :: current_user_can_any ( 'gravityforms_view_updates' ) && ( ! function_exists ( 'is_multisite' ) || ! is_multisite () || is_super_admin () ) ) {
//displaying update message if there is an update and user has permission
self :: dashboard_update_message ();
}
}
/**
* Displays the update message on the dashboard .
*
* @ since Unknown
* @ access public
*/
public static function dashboard_update_message () {
$version_info = GFCommon :: get_version_info ();
//don't display a message if use has dismissed the message for this version
$ary_dismissed = get_option ( 'gf_dismissed_upgrades' );
$is_dismissed = ! empty ( $ary_dismissed ) && in_array ( $version_info [ 'version' ], $ary_dismissed );
if ( $is_dismissed ) {
return ;
}
if ( version_compare ( GFCommon :: $version , $version_info [ 'version' ], '<' ) ) {
$message = sprintf ( esc_html__ ( 'There is an update available for Gravity Forms. %sView Details%s' , 'gravityforms' ), " <a href='admin.php?page=page=gf_system_status&subview=updates'> " , '</a>' );
?>
< div class = 'updated' style = 'padding:15px; position:relative;' id = 'gf_dashboard_message' >< ? php echo $message ?>
< a href = " javascript:void(0); " onclick = " GFDismissUpgrade(); " onkeypress = " GFDismissUpgrade(); " style = 'float:right;' >< ? php esc_html_e ( 'Dismiss' , 'gravityforms' ) ?> </a>
</ div >
< script type = " text/javascript " >
function GFDismissUpgrade () {
jQuery ( " #gf_dashboard_message " ) . slideUp ();
jQuery . post ( ajaxurl , {
action : 'rg_dismiss_upgrade' ,
version : < ? php echo json_encode ( $version_info [ 'version' ] ); ?> });
}
</ script >
< ? php
}
}
/**
* Dismisses the dashboard update message .
*
* @ since Unknown
* @ access public
*/
public static function dashboard_dismiss_upgrade () {
$ary = get_option ( 'gf_dismissed_upgrades' );
if ( ! is_array ( $ary ) ) {
$ary = array ();
}
$ary [] = $_POST [ 'version' ];
update_option ( 'gf_dismissed_upgrades' , $ary );
}
//------------------------------------------------------
//--------------- ALL OTHER PAGES ----------------------
/**
* Registers Gravity Forms scripts .
*
* If SCRIPT_DEBUG constant is set , uses the un - minified version .
*
* @ since Unknown
* @ access public
*/
public static function register_scripts () {
$base_url = GFCommon :: get_base_url ();
$version = GFForms :: $version ;
$min = defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || isset ( $_GET [ 'gform_debug' ] ) ? '' : '.min' ;
wp_register_script ( 'gform_chosen' , $base_url . " /js/chosen.jquery.min.js " , array ( 'jquery' ), $version );
wp_register_script ( 'gform_conditional_logic' , $base_url . " /js/conditional_logic { $min } .js " , array (
'jquery' ,
'gform_gravityforms'
), $version );
wp_register_script ( 'gform_datepicker_init' , $base_url . " /js/datepicker { $min } .js " , array (
'jquery' ,
'jquery-ui-datepicker' ,
'gform_gravityforms'
), $version , true );
wp_register_script ( 'gform_floatmenu' , $base_url . " /js/floatmenu_init { $min } .js " , array ( 'jquery' ), $version );
wp_register_script ( 'gform_form_admin' , $base_url . " /js/form_admin { $min } .js " , array (
'jquery' ,
'jquery-ui-autocomplete' ,
'gform_placeholder' ,
'gform_gravityforms' ,
), $version );
wp_register_script ( 'gform_form_editor' , $base_url . " /js/form_editor { $min } .js " , array (
'jquery' ,
'gform_json' ,
'gform_placeholder'
), $version , true );
wp_register_script ( 'gform_forms' , $base_url . " /js/forms { $min } .js " , array ( 'jquery' ), $version );
wp_register_script ( 'gform_gravityforms' , $base_url . " /js/gravityforms { $min } .js " , array (
'jquery' ,
'gform_json'
), $version );
wp_register_script ( 'gform_json' , $base_url . " /js/jquery.json { $min } .js " , array ( 'jquery' ), $version , true );
wp_register_script ( 'gform_masked_input' , $base_url . " /js/jquery.maskedinput { $min } .js " , array ( 'jquery' ), $version );
wp_register_script ( 'gform_menu' , $base_url . " /js/menu { $min } .js " , array ( 'jquery' ), $version );
wp_register_script ( 'gform_placeholder' , $base_url . '/js/placeholders.jquery.min.js' , array ( 'jquery' ), $version );
wp_register_script ( 'gform_tooltip_init' , $base_url . " /js/tooltip_init { $min } .js " , array ( 'jquery-ui-tooltip' ), $version );
wp_register_script ( 'gform_textarea_counter' , $base_url . " /js/jquery.textareaCounter.plugin { $min } .js " , array ( 'jquery' ), $version );
wp_register_script ( 'gform_field_filter' , $base_url . " /js/gf_field_filter { $min } .js " , array (
'jquery' ,
'gform_datepicker_init'
), $version );
wp_register_script ( 'gform_shortcode_ui' , $base_url . " /js/shortcode-ui { $min } .js " , array (
'jquery' ,
'wp-backbone'
), $version , true );
wp_register_script ( 'gform_system_report_clipboard' , $base_url . '/includes/system-status/js/clipboard.min.js' , array ( 'jquery' ), $version , true );
wp_register_style ( 'gform_admin' , $base_url . " /css/admin { $min } .css " , array (), $version );
wp_register_style ( 'gform_chosen' , $base_url . " /css/chosen { $min } .css " , array (), $version );
wp_register_style ( 'gform_shortcode_ui' , $base_url . " /css/shortcode-ui { $min } .css " , array (), $version );
wp_register_style ( 'gform_font_awesome' , $base_url . " /css/font-awesome { $min } .css " , null , $version );
wp_register_style ( 'gform_tooltip' , $base_url . " /css/tooltip { $min } .css " , array ( 'gform_font_awesome' ), $version );
wp_register_style ( 'gforms_reset_css' , $base_url . " /css/formreset { $min } .css " , null , $version );
wp_register_style ( 'gforms_datepicker_css' , $base_url . " /css/datepicker { $min } .css " , null , $version );
wp_register_style ( 'gforms_formsmain_css' , $base_url . " /css/formsmain { $min } .css " , null , $version );
wp_register_style ( 'gforms_ready_class_css' , $base_url . " /css/readyclass { $min } .css " , null , $version );
wp_register_style ( 'gforms_browsers_css' , $base_url . " /css/browsers { $min } .css " , null , $version );
wp_register_style ( 'gforms_rtl_css' , $base_url . " /css/rtl { $min } .css " , null , $version );
}
/**
* Enqueues registered Gravity Forms scripts .
*
* @ since Unknown
* @ access public
*
* @ param null $hook Not used .
*/
public static function enqueue_admin_scripts ( $hook ) {
$scripts = array ();
$page = self :: get_page ();
switch ( $page ) {
case 'new_form' :
case 'form_list' :
$scripts = array (
'gform_gravityforms' ,
'gform_json' ,
'gform_form_admin' ,
'thickbox' ,
'sack' ,
);
break ;
case 'form_settings' :
$scripts = array (
'gform_gravityforms' ,
'gform_forms' ,
'gform_json' ,
'gform_form_admin' ,
'gform_placeholder' ,
'jquery-ui-datepicker' ,
'gform_masked_input' ,
'jquery-ui-sortable' ,
'sack' ,
);
break ;
case 'form_editor' :
$thickbox = 'thickbox' ;
$scripts = array (
$thickbox ,
'jquery-ui-core' ,
'jquery-ui-sortable' ,
'jquery-ui-draggable' ,
'jquery-ui-droppable' ,
'jquery-ui-tabs' ,
'gform_gravityforms' ,
'gform_forms' ,
'gform_json' ,
'gform_form_admin' ,
'gform_floatmenu' ,
'gform_menu' ,
'gform_placeholder' ,
'jquery-ui-autocomplete' ,
'sack' ,
);
if ( wp_is_mobile () ) {
$scripts [] = 'jquery-touch-punch' ;
}
break ;
case 'entry_detail' :
$scripts = array (
'gform_json' ,
'sack' ,
'postbox' ,
);
break ;
case 'entry_detail_edit' :
$scripts = array (
'gform_gravityforms' ,
'plupload-all' ,
'sack' ,
'postbox' ,
);
break ;
case 'entry_list' :
$scripts = array (
'wp-lists' ,
'wp-ajax-response' ,
'thickbox' ,
'gform_json' ,
'gform_field_filter' ,
'sack' ,
);
break ;
case 'notification_list' :
$scripts = array (
'gform_forms' ,
'gform_json' ,
'gform_form_admin' ,
'sack' ,
);
break ;
case 'notification_new' :
case 'notification_edit' :
$scripts = array (
'jquery-ui-autocomplete' ,
'gform_gravityforms' ,
'gform_placeholder' ,
'gform_form_admin' ,
'gform_forms' ,
'gform_json' ,
'sack' ,
);
break ;
case 'confirmation' :
$scripts = array (
'gform_form_admin' ,
'gform_forms' ,
'gform_gravityforms' ,
'gform_placeholder' ,
'gform_json' ,
'wp-pointer' ,
'sack' ,
);
break ;
case 'addons' :
$scripts = array (
'thickbox' ,
'sack' ,
);
break ;
case 'export_entry' :
$scripts = array (
'jquery-ui-datepicker' ,
'gform_form_admin' ,
'gform_field_filter' ,
'sack' ,
);
break ;
case 'updates' :
$scripts = array (
'thickbox' ,
'sack' ,
);
break ;
case 'system_status' :
$scripts = array (
'gform_system_report_clipboard' ,
'thickbox' ,
'gform_placeholder' ,
);
break ;
}
if ( self :: page_supports_add_form_button () ) {
wp_enqueue_script ( 'gform_shortcode_ui' );
wp_enqueue_style ( 'gform_shortcode_ui' );
wp_localize_script ( 'gform_shortcode_ui' , 'gfShortcodeUIData' , array (
'shortcodes' => self :: get_shortcodes (),
'previewNonce' => wp_create_nonce ( 'gf-shortcode-ui-preview' ),
/**
* Allows the enabling ( false ) or disabling ( true ) of a shortcode preview of a form
*
* @ param bool $preview_disabled Defaults to true . False to enable .
*/
'previewDisabled' => apply_filters ( 'gform_shortcode_preview_disabled' , true ),
'strings' => array (
'pleaseSelectAForm' => esc_html__ ( 'Please select a form.' , 'gravityforms' ),
'errorLoadingPreview' => esc_html__ ( 'Failed to load the preview for this form.' , 'gravityforms' ),
)
) );
}
if ( empty ( $scripts ) ) {
return ;
}
foreach ( $scripts as $script ) {
wp_enqueue_script ( $script );
}
GFCommon :: localize_gform_gravityforms_multifile ();
}
/**
* Gets current page name .
*
* @ since Unknown
* @ access public
*
* @ return bool | string Page name or false .
* Page names :
*
* new_form
* form_list
* form_editor
* form_settings
* confirmation
* notification_list
* notification_new
* notification_edit
* entry_list
* entry_detail
* entry_detail_edit
* settings
* addons
* export_entry
* export_form
* import_form
* updates
*/
public static function get_page () {
if ( rgget ( 'page' ) == 'gf_new_form' ) {
return 'new_form' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && ! rgget ( 'id' ) ) {
return 'form_list' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && ! rgget ( 'view' ) ) {
return 'form_editor' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && rgget ( 'view' ) == 'settings' && ( ! rgget ( 'subview' ) || rgget ( 'subview' ) == 'settings' ) ) {
return 'form_settings' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && rgget ( 'view' ) == 'settings' && rgget ( 'subview' ) == 'confirmation' ) {
return 'confirmation' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && rgget ( 'view' ) == 'settings' && rgget ( 'subview' ) == 'notification' && rgget ( 'nid' ) ) {
return 'notification_edit' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && rgget ( 'view' ) == 'settings' && rgget ( 'subview' ) == 'notification' && isset ( $_GET [ 'nid' ] ) ) {
return 'notification_edit' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && rgget ( 'view' ) == 'settings' && rgget ( 'subview' ) == 'notification' ) {
return 'notification_list' ;
}
if ( rgget ( 'page' ) == 'gf_edit_forms' && rgget ( 'view' ) == 'settings' && rgget ( 'subview' ) ) {
return 'form_settings_' . rgget ( 'subview' );
}
if ( rgget ( 'page' ) == 'gf_entries' && ( ! rgget ( 'view' ) || rgget ( 'view' ) == 'entries' ) ) {
return 'entry_list' ;
}
if ( rgget ( 'page' ) == 'gf_entries' && rgget ( 'view' ) == 'entry' && isset ( $_POST [ 'screen_mode' ] ) && $_POST [ 'screen_mode' ] == 'edit' ) {
return 'entry_detail_edit' ;
}
if ( rgget ( 'page' ) == 'gf_entries' && rgget ( 'view' ) == 'entry' ) {
return 'entry_detail' ;
}
if ( rgget ( 'page' ) == 'gf_settings' ) {
return 'settings' ;
}
if ( rgget ( 'page' ) == 'gf_addons' ) {
return 'addons' ;
}
if ( rgget ( 'page' ) == 'gf_export' && ( rgget ( 'view' ) == 'export_entry' || ! isset ( $_GET [ 'view' ] ) ) ) {
return 'export_entry' ;
}
if ( rgget ( 'page' ) == 'gf_export' && rgget ( 'view' ) == 'export_form' ) {
return 'export_form' ;
}
if ( rgget ( 'page' ) == 'gf_export' && rgget ( 'view' ) == 'import_form' ) {
return 'import_form' ;
}
if ( rgget ( 'page' ) == 'gf_system_status' ) {
return rgget ( 'subview' ) === 'updates' ? 'updates' : 'system_status' ;
}
if ( defined ( 'DOING_AJAX' ) && DOING_AJAX && ( ( isset ( $_POST [ 'form_id' ] ) && rgpost ( 'action' ) === 'rg_select_export_form' ) || ( isset ( $_POST [ 'export_form' ] ) && rgpost ( 'action' ) === 'gf_process_export' ) ) ) {
return 'export_entry_ajax' ;
}
return false ;
}
/**
* Gets the form .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDisplay :: get_form ()
* @ uses GFCommon :: get_base_path ()
*/
public static function get_form ( $form_id , $display_title = true , $display_description = true , $force_display = false , $field_values = null , $ajax = false , $tabindex = 0 ) {
require_once ( GFCommon :: get_base_path () . '/form_display.php' );
return GFFormDisplay :: get_form ( $form_id , $display_title , $display_description , $force_display , $field_values , $ajax , $tabindex );
}
/**
* Runs when the Forms menu item is clicked .
*
* Checks to see if the installation wizard should be displayed instead .
*
* @ since Unknown
* @ access public
*/
public static function new_form () {
if ( self :: maybe_display_wizard () ) {
return ;
};
self :: form_list_page ();
}
/**
* Enqueues scripts
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDisplay :: enqueue_scripts ()
*/
public static function enqueue_scripts () {
require_once ( GFCommon :: get_base_path () . '/form_display.php' );
GFFormDisplay :: enqueue_scripts ();
}
/**
* Prints form scripts .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDisplay :: print_form_scripts ()
*/
public static function print_form_scripts ( $form , $ajax ) {
require_once ( GFCommon :: get_base_path () . '/form_display.php' );
GFFormDisplay :: print_form_scripts ( $form , $ajax );
}
/**
* Displays the Forms page
*
* Passes everything off to GFFormDetail :: forms_page
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: forms_page ()
*/
public static function forms_page ( $form_id ) {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: forms_page ( $form_id );
}
/**
* Runs the Gravity Forms settings page .
*
* Checks to see if the installation wizard should be displayed .
*
* @ since Unknown
* @ access public
*
* @ uses GFSettings :: settings_page ()
*/
public static function settings_page () {
if ( self :: maybe_display_wizard () ) {
return ;
};
require_once ( GFCommon :: get_base_path () . '/settings.php' );
GFSettings :: settings_page ();
}
/**
* Runs the Gravity Forms system status page .
*
* @ since 2.2
* @ access public
*
* @ uses GFSystemStatus :: system_status_page ()
*/
public static function system_status () {
require_once ( GFCommon :: get_base_path () . '/includes/system-status/class-gf-system-status.php' );
require_once ( GFCommon :: get_base_path () . '/includes/system-status/class-gf-system-report.php' );
require_once ( GFCommon :: get_base_path () . '/includes/system-status/class-gf-update.php' );
GF_System_Status :: system_status_page ();
}
/**
* Adds pages to the Gravity Forms Settings page
*
* @ since Unknown
* @ access public
*
* @ used - by GFSettings :: add_settings_page ()
*/
public static function add_settings_page ( $name , $handle = '' , $icon_path = '' ) {
require_once ( GFCommon :: get_base_path () . '/settings.php' );
GFSettings :: add_settings_page ( $name , $handle , $icon_path );
}
/**
* Displays the help page
*
* @ since Unknown
* @ access public
*
* @ uses GFHelp :: help_page ()
*/
public static function help_page () {
require_once ( GFCommon :: get_base_path () . '/help.php' );
GFHelp :: help_page ();
}
/**
* Displays the Gravity Forms Export page
*
* @ since Unknown
* @ access public
*
* @ uses GFForms :: maybe_display_wizard ()
* @ uses GFExport :: export_page ()
*/
public static function export_page () {
if ( self :: maybe_display_wizard () ) {
return ;
};
require_once ( GFCommon :: get_base_path () . '/export.php' );
GFExport :: export_page ();
}
/**
* Target for the wp_ajax_gf_process_export ajax action requested from the export entries page .
*
* @ since 2.0 . 0
* @ access public
*
* @ uses GFCommon :: get_base_path ()
* @ uses GFExport :: ajax_process_export ()
*/
public static function ajax_process_export () {
require_once ( GFCommon :: get_base_path () . '/export.php' );
GFExport :: ajax_process_export ();
}
/**
* Target for the wp_ajax_gf_download_export ajax action requested from the export entries page .
*
* @ since 2.0 . 0
* @ access public
*
* @ uses GFCommon :: get_base_path ()
* @ uses GFExport :: ajax_download_export ()
*/
public static function ajax_download_export () {
require_once ( GFCommon :: get_base_path () . '/export.php' );
GFExport :: ajax_download_export ();
}
/**
* Target for the wp_ajax_gf_dismiss_message ajax action requested from the Gravity Forms admin pages .
*
* @ since 2.0 . 0
* @ access public
*
* @ uses GFCommon :: dismiss_message ()
*/
public static function ajax_dismiss_message () {
check_admin_referer ( 'gf_dismissible_nonce' , 'nonce' );
$key = rgget ( 'message_key' );
$key = sanitize_key ( $key );
GFCommon :: dismiss_message ( $key );
}
/**
* Target for the wp_ajax_gf_force_upgrade ajax action requested from the System Status page .
*
* Outputs a JSON string with the status and then triggers the background upgrader usually handled byt the cron healthcheck .
*
* @ since 2.3 . 0.4
*/
public static function ajax_force_upgrade () {
check_ajax_referer ( 'gf_force_upgrade' , 'nonce' );
$status_label = get_option ( 'gform_upgrade_status' );
if ( empty ( $status_label ) ) {
$status = 'complete' ;
$status_label = __ ( 'Finished' , 'gravityforms' );
$percent_complete = 100 ;
} else {
$status = 'in_progress' ;
require_once ( GFCommon :: get_base_path () . '/includes/system-status/class-gf-system-report.php' );
$percent_complete = GF_System_Report :: get_upgrade_percent_complete ();
}
$response = json_encode (
array (
'status' => $status ,
'status_label' => $status_label ,
'percent' => ( string ) $percent_complete ,
)
);
echo $response ;
ob_end_flush ();
// Simuate the healthcheck cron.
GFForms :: $background_upgrader -> handle_cron_healthcheck ();
// The healthcheck task will terminate anyway but exit just in case.
exit ;
}
/**
* Runs the add - ons page
*
* If the display wizard needs to be displayed , do that instead .
*
* @ since Unknown
* @ access public
*/
public static function addons_page () {
if ( self :: maybe_display_wizard () ) {
return ;
};
wp_print_styles ( array ( 'thickbox' ) );
$plugins = get_plugins ();
$installed_plugins = array ();
foreach ( $plugins as $key => $plugin ) {
$is_active = is_plugin_active ( $key );
$installed_plugin = array (
'plugin' => $key ,
'name' => $plugin [ 'Name' ],
'is_active' => $is_active
);
$installed_plugin [ 'activation_url' ] = $is_active ? '' : wp_nonce_url ( " plugins.php?action=activate&plugin= { $key } " , " activate-plugin_ { $key } " );
$installed_plugin [ 'deactivation_url' ] = ! $is_active ? '' : wp_nonce_url ( " plugins.php?action=deactivate&plugin= { $key } " , " deactivate-plugin_ { $key } " );
$installed_plugins [] = $installed_plugin ;
}
$nonces = self :: get_addon_nonces ();
$body = array (
'plugins' => urlencode ( serialize ( $installed_plugins ) ),
'nonces' => urlencode ( serialize ( $nonces ) ),
'key' => GFCommon :: get_key ()
);
$options = array ( 'body' => $body , 'headers' => array ( 'Referer' => get_bloginfo ( 'url' ) ), 'timeout' => 15 );
$raw_response = GFCommon :: post_to_manager ( 'api.php' , " op=plugin_browser& { $_SERVER [ 'QUERY_STRING' ] } " , $options );
if ( is_wp_error ( $raw_response ) || $raw_response [ 'response' ][ 'code' ] != 200 ) {
echo " <div class='error' style='margin-top:50px; padding:20px;'> " . esc_html__ ( 'Add-On browser is currently unavailable. Please try again later.' , 'gravityforms' ) . '</div>' ;
} else {
echo GFCommon :: get_remote_message ();
echo $raw_response [ 'body' ];
}
}
/**
* Gets all add - on information .
*
* @ since Unknown
* @ access public
*
* @ param string $api The API URL .
* @ param string $action The action needed . Determines the view .
* @ param object $args Additional arguments sent to the API
*
* @ return bool | object API object if successful . False if error .
*/
public static function get_addon_info ( $api , $action , $args ) {
if ( $action == 'plugin_information' && empty ( $api ) && ( ! rgempty ( 'rg' , $_GET ) || $args -> slug == 'gravityforms' ) ) {
$key = GFCommon :: get_key ();
$raw_response = GFCommon :: post_to_manager ( 'api.php' , " op=get_plugin&slug= { $args -> slug } &key= { $key } " , array () );
if ( is_wp_error ( $raw_response ) || $raw_response [ 'response' ][ 'code' ] != 200 ) {
return false ;
}
$plugin = unserialize ( $raw_response [ 'body' ] );
$api = new stdClass ();
$api -> name = $plugin [ 'title' ];
$api -> version = $plugin [ 'version' ];
$api -> download_link = $plugin [ 'download_url' ];
$api -> tested = '10.0' ;
}
return $api ;
}
/**
* Creates nonces for add - on installation pages .
*
* @ since Unknown
* @ access public
*
* @ return array | bool $nonces The nonces if the API response is fine . Otherwise , false .
*/
public static function get_addon_nonces () {
$raw_response = GFCommon :: post_to_manager ( 'api.php' , 'op=get_plugins' , array () );
if ( is_wp_error ( $raw_response ) || $raw_response [ 'response' ][ 'code' ] != 200 ) {
return false ;
}
$addons = unserialize ( $raw_response [ 'body' ] );
$nonces = array ();
foreach ( $addons as $addon ) {
$nonces [ $addon [ 'key' ] ] = wp_create_nonce ( " install-plugin_ { $addon [ 'key' ] } " );
}
return $nonces ;
}
/**
* Begins exports .
*
* @ since Unknown
* @ access public
*
* @ uses GFExport :: start_export ()
*/
public static function start_export () {
require_once ( GFCommon :: get_base_path () . '/export.php' );
GFExport :: start_export ();
}
/**
* Gets the post categories .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: get_post_category_values ()
*/
public static function get_post_category_values () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: get_post_category_values ();
}
/**
* Gets and displays the rules for an address field , depending on the address type .
*
* @ since Unknown
* @ access public
*/
public static function get_address_rule_values_select () {
$address_type = rgpost ( 'address_type' );
$value = rgpost ( 'value' );
$id = sanitize_text_field ( rgpost ( 'id' ) );
$form_id = absint ( rgpost ( 'form_id' ) );
$address_field = new GF_Field_Address ();
$address_types = $address_field -> get_address_types ( $form_id );
$markup = '' ;
$type_obj = $address_type && isset ( $address_types [ $address_type ] ) ? $address_types [ $address_type ] : 'international' ;
switch ( $address_type ) {
case 'international' :
$items = $address_field -> get_countries ();
break ;
default :
$items = $type_obj [ 'states' ];
}
$markup = sprintf ( '<select id="%1$s" name="%1$s" class="gfield_rule_select gfield_rule_value_dropdown">%2$s</select>' , esc_attr ( $id ), $address_field -> get_state_dropdown ( $items , $value ) );
echo $markup ;
die ();
}
/**
* Gets post categories for display in Notifications .
*
* @ since Unknown
* @ access public
*
* @ uses GFNotification :: get_post_category_values ()
*/
public static function get_notification_post_category_values () {
require_once ( GFCommon :: get_base_path () . '/notification.php' );
GFNotification :: get_post_category_values ();
}
/**
* Fires off the entries page .
*
* Checks if the installation wizard is needed . If so , does that instead .
*
* @ since Unknown
* @ access public
*
* @ uses GFForms :: maybe_display_wizard ()
* @ uses GFEntryDetail :: lead_detail_page ()
* @ uses GFEntryList :: all_entries_page ()
*/
public static function all_leads_page () {
if ( self :: maybe_display_wizard () ) {
return ;
};
$view = rgget ( 'view' );
$lead_id = rgget ( 'lid' );
if ( $view == 'entry' && ( rgget ( 'lid' ) || ! rgblank ( rgget ( 'pos' ) ) ) ) {
require_once ( GFCommon :: get_base_path () . '/entry_detail.php' );
GFEntryDetail :: lead_detail_page ();
} else if ( $view == 'entries' || empty ( $view ) ) {
require_once ( GFCommon :: get_base_path () . '/entry_list.php' );
GFEntryList :: all_entries_page ();
} else {
$form_id = rgget ( 'id' );
$form_id = absint ( $form_id );
/**
* Fires when viewing entries of a certain form
*
* @ since Unknown
*
* @ param string $view The current view / entry type
* @ param string $form_id The current form ID
* @ param string $lead_id The current entry ID
*/
do_action ( 'gform_entries_view' , $view , $form_id , $lead_id );
}
}
/**
* Gets the Form List page .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormList :: form_list_page ()
*/
public static function form_list_page () {
require_once ( GFCommon :: get_base_path () . '/form_list.php' );
GFFormList :: form_list_page ();
}
/**
* Handles the view when accessing specific forms
*
* If needed , displays the installation wizard instead .
*
* @ since Unknown
* @ access public
*
* @ uses GFForms :: maybe_display_wizard ()
* @ uses GFCommon :: ensure_wp_version ()
* @ uses GFForms :: get ()
* @ uses GFEntryList :: leads_page ()
* @ uses GFEntryDetail :: lead_detail_page ()
* @ uses GFFormSettings :: form_settings_page ()
* @ uses GFForms :: forms_page ()
* @ uses GFForms :: form_list_page ()
*/
public static function forms () {
if ( ! GFCommon :: ensure_wp_version () ) {
return ;
}
if ( self :: maybe_display_wizard () ) {
return ;
};
$id = RGForms :: get ( 'id' );
$view = RGForms :: get ( 'view' );
if ( $view == 'entries' ) {
require_once ( GFCommon :: get_base_path () . '/entry_list.php' );
GFEntryList :: leads_page ( $id );
} else if ( $view == 'entry' ) {
require_once ( GFCommon :: get_base_path () . '/entry_detail.php' );
GFEntryDetail :: lead_detail_page ();
} else if ( $view == 'notification' ) {
require_once ( GFCommon :: get_base_path () . '/notification.php' );
//GFNotification::notification_page($id);
} else if ( $view == 'settings' ) {
require_once ( GFCommon :: get_base_path () . '/form_settings.php' );
GFFormSettings :: form_settings_page ( $id );
} else if ( empty ( $view ) ) {
if ( is_numeric ( $id ) ) {
self :: forms_page ( $id );
} else {
self :: form_list_page ();
}
}
/**
* Fires an action based on the form view
*
* @ since Unknown
*
* @ param string $view The current view
* @ param string $id The form ID
*/
do_action ( 'gform_view' , $view , $id );
}
/**
* Obtains $_GET values or values from an array .
*
* @ since Unknown
* @ access public
*
* @ param string $name The ID of a specific value .
* @ param array $array An optional array to search through . Defaults to null .
*
* @ return string The value . Empty if not found .
*/
public static function get ( $name , $array = null ) {
if ( ! isset ( $array ) ) {
$array = $_GET ;
}
if ( isset ( $array [ $name ] ) ) {
return $array [ $name ];
}
return '' ;
}
/**
* Obtains $_POST values .
*
* @ since Unknown
* @ access public
*
* @ param string $name The ID of the value to obtain
* @ param bool $do_stripslashes If stripslashes_deep should be run on the result . Defaults to true .
*
* @ return string The value . Empty if not found .
*/
public static function post ( $name , $do_stripslashes = true ) {
if ( isset ( $_POST [ $name ] ) ) {
return $do_stripslashes ? stripslashes_deep ( $_POST [ $name ] ) : $_POST [ $name ];
}
return '' ;
}
/**
* Resends failed notifications
*
* @ since Unknown
* @ access public
*
* @ uses GFCommon :: send_notification ()
*/
public static function resend_notifications () {
check_admin_referer ( 'gf_resend_notifications' , 'gf_resend_notifications' );
$form_id = absint ( rgpost ( 'formId' ) );
$leads = rgpost ( 'leadIds' ); // may be a single ID or an array of IDs
if ( 0 == $leads ) {
// get all the lead ids for the current filter / search
$filter = rgpost ( 'filter' );
$search = rgpost ( 'search' );
$star = $filter == 'star' ? 1 : null ;
$read = $filter == 'unread' ? 0 : null ;
$status = in_array ( $filter , array ( 'trash' , 'spam' ) ) ? $filter : 'active' ;
$search_criteria [ 'status' ] = $status ;
if ( $star ) {
$search_criteria [ 'field_filters' ][] = array ( 'key' => 'is_starred' , 'value' => ( bool ) $star );
}
if ( ! is_null ( $read ) ) {
$search_criteria [ 'field_filters' ][] = array ( 'key' => 'is_read' , 'value' => ( bool ) $read );
}
$search_field_id = rgpost ( 'fieldId' );
if ( isset ( $_POST [ 'fieldId' ] ) && $_POST [ 'fieldId' ] !== '' ) {
$key = $search_field_id ;
$val = $search ;
$strpos_row_key = strpos ( $search_field_id , '|' );
if ( $strpos_row_key !== false ) { //multi-row
$key_array = explode ( '|' , $search_field_id );
$key = $key_array [ 0 ];
$val = $key_array [ 1 ] . ':' . $val ;
}
$search_criteria [ 'field_filters' ][] = array (
'key' => $key ,
'operator' => rgempty ( 'operator' , $_POST ) ? 'is' : rgpost ( 'operator' ),
'value' => $val ,
);
}
$leads = GFFormsModel :: search_lead_ids ( $form_id , $search_criteria );
} else {
$leads = ! is_array ( $leads ) ? array ( $leads ) : $leads ;
}
/**
* Filters the notifications to be re - sent
*
* @ since Unknown
*
* @ param array $form_meta The Form Object
* @ param array $leads The entry IDs
*/
$form = gf_apply_filters ( array (
'gform_before_resend_notifications' ,
$form_id
), RGFormsModel :: get_form_meta ( $form_id ), $leads );
if ( empty ( $leads ) || empty ( $form ) ) {
esc_html_e ( 'There was an error while resending the notifications.' , 'gravityforms' );
die ();
};
$notifications = json_decode ( rgpost ( 'notifications' ) );
if ( ! is_array ( $notifications ) ) {
die ( esc_html__ ( 'No notifications have been selected. Please select a notification to be sent.' , 'gravityforms' ) );
}
if ( ! rgempty ( 'sendTo' , $_POST ) && ! GFCommon :: is_valid_email_list ( rgpost ( 'sendTo' ) ) ) {
die ( sprintf ( esc_html__ ( 'The %sSend To%s email address provided is not valid.' , 'gravityforms' ), '<strong>' , '</strong>' ) );
}
foreach ( $leads as $lead_id ) {
$lead = RGFormsModel :: get_lead ( $lead_id );
foreach ( $notifications as $notification_id ) {
$notification = $form [ 'notifications' ][ $notification_id ];
if ( ! $notification ) {
continue ;
}
//overriding To email if one was specified
if ( rgpost ( 'sendTo' ) ) {
$notification [ 'to' ] = rgpost ( 'sendTo' );
$notification [ 'toType' ] = 'email' ;
}
/**
* Allow the resend notification email to be skipped
*
* @ since 2.3
*
* @ param bool $abort_email Should we prevent this email being sent ?
* @ param array $notification The current notification object .
* @ param array $form The current form object .
* @ param array $lead The current entry object .
*/
$abort_email = apply_filters ( 'gform_disable_resend_notification' , false , $notification , $form , $lead );
if ( ! $abort_email ) {
GFCommon :: send_notification ( $notification , $form , $lead );
}
/**
* Fires after the current notification processing is finished
*
* @ since 2.3
*
* @ param array $notification The current notification object .
* @ param array $form The current form object .
* @ param array $lead The current entry object .
*/
do_action ( 'gform_post_resend_notification' , $notification , $form , $lead );
}
}
/**
* Fires after the resend notifications processing is finished
*
* @ since 2.3
*
* @ param array $form The current form object .
* @ param array $lead The current entry object .
*/
do_action ( 'gform_post_resend_all_notifications' , $form , $lead );
die ();
}
//-------------------------------------------------
//----------- AJAX CALLS --------------------------
/**
* Gets the CAPTCHA image for the form editor and displays it .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*/
public static function captcha_image () {
$field_properties = array (
'type' => 'captcha' ,
'simpleCaptchaSize' => $_GET [ 'size' ],
'simpleCaptchaFontColor' => $_GET [ 'fg' ],
'simpleCaptchaBackgroundColor' => $_GET [ 'bg' ]
);
/* @var GF_Field_CAPTCHA $field */
$field = GF_Fields :: create ( $field_properties );
if ( $_GET [ 'type' ] == 'math' ) {
$captcha = $field -> get_math_captcha ( $_GET [ 'pos' ] );
} else {
$captcha = $field -> get_captcha ();
}
@ ini_set ( 'memory_limit' , '256M' );
$image = imagecreatefrompng ( $captcha [ 'path' ] );
include_once ( ABSPATH . 'wp-admin/includes/image-edit.php' );
wp_stream_image ( $image , 'image/png' , 0 );
imagedestroy ( $image );
die ();
}
/**
* Updates the form status ( active / inactive ) .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: update_form_active ()
*/
public static function update_form_active () {
check_ajax_referer ( 'rg_update_form_active' , 'rg_update_form_active' );
RGFormsModel :: update_form_active ( $_POST [ 'form_id' ], $_POST [ 'is_active' ] );
}
/**
* Updates the notification status ( active / inactive ) .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: update_notification_active ()
*/
public static function update_notification_active () {
check_ajax_referer ( 'rg_update_notification_active' , 'rg_update_notification_active' );
RGFormsModel :: update_notification_active ( $_POST [ 'form_id' ], $_POST [ 'notification_id' ], $_POST [ 'is_active' ] );
}
/**
* Updates the confirmation status ( active / inactive ) .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ since GFFormsModel :: update_confirmation_active ()
*/
public static function update_confirmation_active () {
check_ajax_referer ( 'rg_update_confirmation_active' , 'rg_update_confirmation_active' );
RGFormsModel :: update_confirmation_active ( $_POST [ 'form_id' ], $_POST [ 'confirmation_id' ], $_POST [ 'is_active' ] );
}
/**
* Updates the entry properties .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: update_entry_property ()
*/
public static function update_lead_property () {
check_ajax_referer ( 'rg_update_lead_property' , 'rg_update_lead_property' );
GFFormsModel :: update_entry_property ( $_POST [ 'lead_id' ], $_POST [ 'name' ], $_POST [ 'value' ] );
}
/**
* Updates the entry status .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: update_lead_property ()
* @ uses GFFormsModel :: delete_lead ()
*/
public static function update_lead_status () {
check_ajax_referer ( 'gf_delete_entry' );
$status = rgpost ( 'status' );
$lead_id = rgpost ( 'entry' );
$entry = GFAPI :: get_entry ( $lead_id );
$form = GFAPI :: get_form ( $entry [ 'form_id' ] );
switch ( $status ) {
case 'unspam' :
GFFormsModel :: update_entry_property ( $lead_id , 'status' , 'active' );
break ;
case 'delete' :
if ( GFCommon :: current_user_can_any ( 'gravityforms_delete_entries' ) ) {
RGFormsModel :: delete_entry ( $lead_id );
}
break ;
default :
RGFormsModel :: update_entry_property ( $lead_id , 'status' , $status );
break ;
}
require_once ( 'entry_list.php' );
$filter_links = GFEntryList :: get_filter_links ( $form );
$counts = array ();
foreach ( $filter_links as $filter_link ) {
$id = $filter_link [ 'id' ] == '' ? 'all' : $filter_link [ 'id' ];
$counts [ $id . '_count' ] = $filter_link [ 'count' ];
}
$x = new WP_Ajax_Response ();
$x -> add ( array (
'what' => 'gf_entry' ,
'id' => $lead_id ,
'supplemental' => $counts ,
) );
$x -> send ();
}
// Settings
/**
* Runs the license upgrade .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFSettings :: upgrade_license ()
*/
public static function upgrade_license () {
require_once ( GFCommon :: get_base_path () . '/settings.php' );
GFSettings :: upgrade_license ();
}
// Form detail
/**
* Saves the form in the form editor .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: save_form ()
*/
public static function save_form () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: save_form ();
}
/**
* Adds fields in the form editor .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: add_field ()
*/
public static function add_field () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: add_field ();
}
/**
* Duplicates fields in the form editor .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: duplicate_field ()
*/
public static function duplicate_field () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: duplicate_field ();
}
/**
* Deletes fields in the form editor .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses \GFFormDetail :: delete_field ()
*/
public static function delete_field () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: delete_field ();
}
/**
* Changes the input type in the form editor .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: change_input_type ()
*/
public static function change_input_type () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: change_input_type ();
}
/**
* Refreshes the field preview .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses \GFFormDetail :: refresh_field_preview
*/
public static function refresh_field_preview () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: refresh_field_preview ();
}
/**
* Deletes custom choices from radio / checkbox / select / etc fields .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: delete_custom_choice ()
*/
public static function delete_custom_choice () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: delete_custom_choice ();
}
/**
* Saves custom choices from radio / checkbox / select / etc fields .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormDetail :: save_custom_choice ()
*/
public static function save_custom_choice () {
require_once ( GFCommon :: get_base_path () . '/form_detail.php' );
GFFormDetail :: save_custom_choice ();
}
/**
* Deletes a file from the entry detail view .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: delete_file ()
*/
public static function delete_file () {
check_ajax_referer ( 'rg_delete_file' , 'rg_delete_file' );
$lead_id = intval ( $_POST [ 'lead_id' ] );
$field_id = intval ( $_POST [ 'field_id' ] );
$file_index = intval ( $_POST [ 'file_index' ] );
RGFormsModel :: delete_file ( $lead_id , $field_id , $file_index );
die ( " EndDeleteFile( $field_id , $file_index ); " );
}
/**
* Gets the form export data .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: get_form_meta ()
*/
public static function select_export_form () {
check_ajax_referer ( 'rg_select_export_form' , 'rg_select_export_form' );
$form_id = intval ( $_POST [ 'form_id' ] );
$form = RGFormsModel :: get_form_meta ( $form_id );
/**
* Filters through the Form Export Page
*
* @ since Unknown
*
* @ param int $form The Form Object of the form to export
*/
$form = gf_apply_filters ( array ( 'gform_form_export_page' , $form_id ), $form );
$filter_settings = GFCommon :: get_field_filter_settings ( $form );
$filter_settings_json = json_encode ( $filter_settings );
$fields = array ();
$form = GFExport :: add_default_export_fields ( $form );
if ( is_array ( $form [ 'fields' ] ) ) {
/* @var GF_Field $field */
foreach ( $form [ 'fields' ] as $field ) {
$inputs = $field -> get_entry_inputs ();
if ( is_array ( $inputs ) ) {
foreach ( $inputs as $input ) {
$fields [] = array ( $input [ 'id' ], GFCommon :: get_label ( $field , $input [ 'id' ] ) );
}
} else if ( ! $field -> displayOnly ) {
$fields [] = array ( $field -> id , GFCommon :: get_label ( $field ) );
}
}
}
$field_json = GFCommon :: json_encode ( $fields );
die ( " EndSelectExportForm( $field_json , $filter_settings_json ); " );
}
/**
* Saves a form confirmation .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormSettings :: save_confirmation ()
*/
// public static function save_confirmation() {
// require_once( GFCommon::get_base_path() . '/form_settings.php' );
// GFFormSettings::save_confirmation();
// }
/**
* Saves the form title .
*
* Called via AJAX .
*
* @ since 2.0 . 2.5
* @ access public
*
* @ uses GFFormSettings :: save_form_title ()
*/
public static function save_form_title () {
require_once ( GFCommon :: get_base_path () . '/form_settings.php' );
GFFormSettings :: save_form_title ();
}
/**
* Deletes a form confirmation .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormSettings :: delete_confirmation ()
*/
public static function delete_confirmation () {
require_once ( GFCommon :: get_base_path () . '/form_settings.php' );
GFFormSettings :: delete_confirmation ();
}
// Form list
/**
* Saves a new form .
*
* Called via AJAX .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormList :: save_new_form ()
*/
public static function save_new_form () {
require_once ( GFCommon :: get_base_path () . '/form_list.php' );
GFFormList :: save_new_form ();
}
/**
* Used to check that background tasks are working .
*
* @ since 2.3
*/
public static function check_background_tasks () {
check_ajax_referer ( 'gf_check_background_tasks' , 'nonce' );
echo 'ok' ;
die ();
}
/**
* Displays the edit title popup .
*
* @ since Unknown
* @ access public
*
* @ param array $form The Form Object .
*/
public static function edit_form_title ( $form ) {
//Only allow users with form edit permissions to edit forms
if ( ! GFCommon :: current_user_can_any ( 'gravityforms_edit_forms' ) ) {
return ;
}
?>
< div id = " edit-title-container " class = " add_field_button_container " >
< div class = " button-title-link gf_button_title_active " >
< div id = " edit-title-header " >
< ? php esc_html_e ( 'Form Title' , 'gravityforms' ); ?>
< span id = " edit-title-close " onclick = " GF_CloseEditTitle(); " >< i class = " fa fa-times " ></ i ></ span >
</ div >
</ div >
< div class = " add-buttons " >
< input type = " text " id = 'edit-title-input' value = '<?php echo esc_attr( $form[' title '] ); ?>' />
< div class = " edit-form-footer " >
< input type = " button " value = " <?php esc_html_e( 'Update', 'gravityforms' ); ?> " class = " button-primary " onclick = " GF_SaveTitle(); " />
< span id = " gform_settings_page_title_error " ></ span >
</ div >
</ div >
</ div >
< script type = " text/javascript " >
function GF_ShowEditTitle () {
jQuery ( '#edit-title-container' ) . css ( 'visibility' , 'visible' )
. find ( '#edit-title-input' ) . focus ();
}
function GF_CloseEditTitle () {
jQuery ( '#edit-title-container' ) . css ( 'visibility' , 'hidden' );
jQuery ( '#edit-title-input' ) . val ( jQuery ( '#gform_settings_page_title' ) . text () );
jQuery ( '#gform_settings_page_title_error' ) . text ( '' );
}
function GF_SaveTitle (){
var title = jQuery ( '#edit-title-input' ) . val ();
jQuery . post ( ajaxurl , {
action : " gf_save_title " ,
gf_save_title : '<?php echo wp_create_nonce( ' gf_save_title ' ); ?>' ,
title : jQuery . toJSON ( title ),
formId : '<?php echo absint( $form[' id '] ); ?>'
})
. done ( function ( data ) {
result = jQuery . parseJSON ( data );
var isValid = result && result . isValid ;
if ( ! isValid ) {
var errorMessage = result ? result . message : '<?php esc_attr_e( ' Oops ! There was an error saving the form title . Please refresh the page and try again . ', ' gravityforms ' ); ?>' ;
jQuery ( '#gform_settings_page_title_error' ) . text ( errorMessage );
}
else {
var title = jQuery ( '#edit-title-input' ) . val ();
jQuery ( '#gform_settings_page_title' ) . text ( title );
jQuery ( '#form_title_input' ) . val ( title );
< ? php echo GFCommon :: is_form_editor () ? 'form.title = title;' : '' ; ?>
GF_CloseEditTitle ();
}
})
. fail ( function () {
alert ( '<?php esc_attr_e( ' Oops ! There was an error saving the form title . Please refresh the page and try again . ', ' gravityforms ' ); ?>' );
GF_CloseEditTitle ();
});
}
function GF_IsOutsideTitleWindow ( element ) {
var parents = jQuery ( element ) . parents ( '#edit-title-container' );
return parents . length == 0 ;
}
jQuery ( document ) . mousedown ( function ( event ) {
if ( GF_IsOutsideTitleWindow ( event . target )) {
GF_CloseEditTitle ();
}
});
jQuery ( document ) . ready ( function () {
jQuery ( '#edit-title-input' ) . keypress ( function ( event ) {
if ( event . keyCode == 13 ) {
GF_SaveTitle ();
}
});
});
</ script >
< ? php
}
/**
* Displays the form switcher dropdown .
*
* @ since Unknown
* @ access public
*/
public static function form_switcher () {
// Get all forms.
$all_forms = RGFormsModel :: get_forms ( null , 'title' );
// Sort forms by active state.
$forms = array ( 'active' => array (), 'inactive' => array (), );
foreach ( $all_forms as $form ) {
if ( '1' === $form -> is_active ) {
$forms [ 'active' ][] = $form ;
} else if ( '0' === $form -> is_active ) {
$forms [ 'inactive' ][] = $form ;
}
}
// Enqueuing Chosen script and styling.
wp_enqueue_script ( 'gform_chosen' , false , array ( 'jquery' ), GFCommon :: $version , true );
wp_enqueue_style ( 'gform_chosen' );
?>
< a href = " # " onclick = " GF_SetupChosen( this ); event.stopPropagation(); " id = 'form_switcher_arrow' class = 'form_switcher_arrow' >< i class = 'fa fa-angle-down' ></ i ></ a >
< div id = " form_switcher_container " >
< select data - placeholder = " <?php esc_attr_e( 'Switch Form', 'gravityforms' ) ?> " name = " form_switcher " id = " form_switcher " onchange = " GF_SwitchForm(jQuery(this).val()); " >
< option ></ option >
< ? php
foreach ( $all_forms as $form_info ) {
$title = $form_info -> title ;
?>
< option value = " <?php echo absint( $form_info->id ); ?> " >< ? php echo esc_html ( $title ) ?> </option>
< ? php
}
?>
</ select >
</ div >
< script type = " text/javascript " >
function GF_ReplaceQuery ( key , newValue ) {
var new_query = " " ;
var query = document . location . search . substring ( 1 );
var ary = query . split ( " & " );
var has_key = false ;
for ( i = 0 ; i < ary . length ; i ++ ) {
var key_value = ary [ i ] . split ( " = " );
if ( key_value [ 0 ] == key ) {
new_query += key + " = " + newValue + " & " ;
has_key = true ;
}
else if ( key_value [ 0 ] != " display_settings " ) {
new_query += key_value [ 0 ] + " = " + key_value [ 1 ] + " & " ;
}
}
if ( new_query . length > 0 )
new_query = new_query . substring ( 0 , new_query . length - 1 );
if ( ! has_key )
new_query += new_query . length > 0 ? " & " + key + " = " + newValue : " ? " + key + " = " + newValue ;
return new_query ;
}
function GF_RemoveQuery ( key , query ) {
var new_query = " " ;
if ( query == " " ) {
query = document . location . search . substring ( 1 );
}
var ary = query . split ( " & " );
for ( i = 0 ; i < ary . length ; i ++ ) {
var key_value = ary [ i ] . split ( " = " );
if ( key_value [ 0 ] != key ) {
new_query += key_value [ 0 ] + " = " + key_value [ 1 ] + " & " ;
}
}
if ( new_query . length > 0 )
new_query = new_query . substring ( 0 , new_query . length - 1 );
return new_query ;
}
function GF_SwitchForm ( id ) {
if ( id . length > 0 ) {
id = parseInt ( id );
var query = GF_ReplaceQuery ( " id " , id );
//remove paging from querystring when changing forms
var new_query = GF_RemoveQuery ( " paged " , query );
new_query = new_query . replace ( " gf_new_form " , " gf_edit_forms " );
//remove filter vars from querystring when changing forms
new_query = GF_RemoveQuery ( " s " , new_query );
new_query = GF_RemoveQuery ( " operator " , new_query );
new_query = GF_RemoveQuery ( " type " , new_query );
new_query = GF_RemoveQuery ( " field_id " , new_query );
new_query = GF_RemoveQuery ( " lid " , new_query );
new_query = GF_RemoveQuery ( " filter " , new_query );
new_query = GF_RemoveQuery ( " pos " , new_query );
//When switching forms within any form settings tab, go back to main form settings tab
var is_form_settings = new_query . indexOf ( " page=gf_edit_forms " ) >= 0 && new_query . indexOf ( " view=settings " ) >= 0 ;
if ( is_form_settings ) {
//going back to main form settings tab
new_query = " page=gf_edit_forms&view=settings&id= " + id ;
}
//When switching forms within any form entries tab, go back to main form entries tab
var is_form_entries = new_query . indexOf ( " page=gf_entries " ) >= 0 ;
if ( is_form_entries ) {
//going back to main form settings tab
new_query = " page=gf_entries&id= " + id ;
}
document . location = " ? " + new_query ;
}
}
function ToggleFormSettings () {
FieldClick ( jQuery ( '#gform_heading' )[ 0 ]);
}
function GF_PositionFormSwitcher () {
var $container = jQuery ( '#form_switcher_container' );
var position = jQuery ( '#form_switcher_arrow' ) . position () . left ,
width = $container . outerWidth (),
offset = width > position ? 0 : position - width + 20 ;
$container . css ( 'left' , offset + 'px' );
}
function GF_SetupChosen ( elem ) {
//displaying container
var $container = jQuery ( '#form_switcher_container' );
$container . show ();
//initializing and activating chosen
var $ch = jQuery ( '#form_switcher' ) . chosen ();
$ch . trigger ( 'chosen:open' );
//setting form switcher position
GF_PositionFormSwitcher ();
//binding to close event
$ch . bind ( 'chosen:hiding_dropdown' , function ( ch ) {
jQuery ( '#form_switcher_container' ) . hide ();
});
}
jQuery ( document ) . ready ( function () {
if ( document . location . search . indexOf ( " display_settings " ) > 0 )
ToggleFormSettings ()
jQuery ( 'a.gf_toolbar_disabled' ) . click ( function ( event ) {
event . preventDefault ();
});
});
jQuery ( window ) . resize ( function () {
GF_PositionFormSwitcher ();
});
</ script >
< ? php
}
/**
* Displays the top toolbar withing Gravity Forms pages .
*
* @ since Unknown
* @ access public
*
* @ uses GFFormsModel :: get_forms ()
* @ uses GFForms :: get_toolbar_menu_items ()
* @ uses GFForms :: format_toolbar_menu_items ()
*/
public static function top_toolbar () {
$forms = RGFormsModel :: get_forms ( null , 'title' );
$id = rgempty ( 'id' , $_GET ) ? count ( $forms ) > 0 ? $forms [ 0 ] -> id : '0' : rgget ( 'id' );
?>
< div id = " gf_form_toolbar " >
< ul id = " gf_form_toolbar_links " >
< ? php
$menu_items = apply_filters ( 'gform_toolbar_menu' , self :: get_toolbar_menu_items ( $id ), $id );
echo self :: format_toolbar_menu_items ( $menu_items );
?>
</ ul >
</ div >
< ? php
}
/**
* Formats the menu items for display in the Gravity Forms toolbar .
*
* @ since Unknown
* @ access public
*
* @ used - by GFForms :: top_toolbar ()
* @ uses GFForms :: toolbar_sub_menu_items ()
*
* @ param array $menu_items Contains the menu items to be displayed
* @ param bool $compact If true , uses the compact labels . Defaults to false .
*
* @ return string $output The formatted toolbar menu items
*/
public static function format_toolbar_menu_items ( $menu_items , $compact = false ) {
if ( empty ( $menu_items ) ) {
return '' ;
}
$output = '' ;
$priorities = array ();
foreach ( $menu_items as $k => $menu_item ) {
$priorities [ $k ] = rgar ( $menu_item , 'priority' );
}
array_multisort ( $priorities , SORT_DESC , $menu_items );
$keys = array_keys ( $menu_items );
$last_key = array_pop ( $keys ); // array_pop(array_keys($menu_items)) causes a Strict Standards warning in WP 3.6 on PHP 5.4
foreach ( $menu_items as $key => $menu_item ) {
if ( is_array ( $menu_item ) ) {
if ( GFCommon :: current_user_can_any ( rgar ( $menu_item , 'capabilities' ) ) ) {
$sub_menu_str = '' ;
$count_sub_menu_items = 0 ;
$sub_menu_items = rgar ( $menu_item , 'sub_menu_items' );
if ( is_array ( $sub_menu_items ) ) {
foreach ( $sub_menu_items as $k => $val ) {
if ( false === GFCommon :: current_user_can_any ( rgar ( $sub_menu_items [ $k ], 'capabilities' ) ) ) {
unset ( $sub_menu_items [ $k ] );
}
}
$sub_menu_items = array_values ( $sub_menu_items ); //reset numeric keys
$count_sub_menu_items = count ( $sub_menu_items );
}
$menu_class = rgar ( $menu_item , 'menu_class' );
if ( $count_sub_menu_items == 1 ) {
$label = $compact ? rgar ( $menu_item , 'label' ) : rgar ( $sub_menu_items [ 0 ], 'label' );
$menu_item = $sub_menu_items [ 0 ];
} else {
$label = rgar ( $menu_item , 'label' );
$sub_menu_str = self :: toolbar_sub_menu_items ( $sub_menu_items , $compact );
}
$link_class = esc_attr ( rgar ( $menu_item , 'link_class' ) );
$icon = rgar ( $menu_item , 'icon' );
$url = esc_url ( rgar ( $menu_item , 'url' ) );
$title = esc_attr ( rgar ( $menu_item , 'title' ) );
$onclick = esc_attr ( rgar ( $menu_item , 'onclick' ) );
$label = esc_html ( $label );
$target = rgar ( $menu_item , 'target' );
$link = " <a class=' { $link_class } ' onclick=' { $onclick } ' onkeypress=' { $onclick } ' title=' { $title } ' href=' { $url } ' target=' { $target } '> { $icon } { $label } </a> " . $sub_menu_str ;
if ( $compact ) {
if ( $key == 'delete' ) {
/**
* A filter to allow the modification of the HTML link to delete a form
*
* @ since Unknown
*
* @ param string $link The HTML " Delete Form " Link
*/
$link = apply_filters ( 'gform_form_delete_link' , $link );
}
$divider = $key == $last_key ? '' : ' | ' ;
if ( $count_sub_menu_items > 0 ) {
$menu_class .= ' gf_form_action_has_submenu' ;
}
$output .= '<span class="' . $menu_class . '">' . $link . $divider . '</span>' ;
} else {
$output .= " <li class=' { $menu_class } '> { $link } </li> " ;
}
}
} elseif ( $compact ) {
//for backwards compatibility <1.7: form actions only
$divider = $key == $last_key ? '' : ' | ' ;
$output .= '<span class="edit">' . $menu_item . $divider . '</span>' ;
}
}
return $output ;
}
/**
* Gets the menu items to be displayed within the toolbar .
*
* @ since Unknown
* @ access public
*
* @ used - by GFForms :: top_toolbar ()
* @ uses GFForms :: toolbar_class ()
*
* @ param string $form_id The form ID .
* @ param bool $compact True if the compact label should be used . Defaults to false .
*
* @ return array $menu_items The menu items to be displayed .
*/
public static function get_toolbar_menu_items ( $form_id , $compact = false ) {
$menu_items = array ();
$is_mobile = wp_is_mobile ();
$form_id = absint ( $form_id );
// ---- Form Editor ----
$edit_capabilities = array ( 'gravityforms_edit_forms' );
$menu_items [ 'edit' ] = array (
'label' => __ ( 'Edit' , 'gravityforms' ),
'short_label' => esc_html__ ( 'Editor' , 'gravityforms' ),
'icon' => '<i class="fa fa-pencil-square-o fa-lg"></i>' ,
'title' => __ ( 'Edit this form' , 'gravityforms' ),
'url' => '?page=gf_edit_forms&id=' . $form_id ,
'menu_class' => 'gf_form_toolbar_editor' ,
'link_class' => self :: toolbar_class ( 'editor' ),
'capabilities' => $edit_capabilities ,
'priority' => 1000 ,
);
// ---- Form Settings ----
$sub_menu_items = self :: get_form_settings_sub_menu_items ( $form_id );
$menu_items [ 'settings' ] = array (
'label' => __ ( 'Settings' , 'gravityforms' ),
'icon' => '<i class="fa fa-cogs fa-lg"></i>' ,
'title' => __ ( 'Edit settings for this form' , 'gravityforms' ),
'url' => $is_mobile ? '#' : '?page=gf_edit_forms&view=settings&id=' . $form_id ,
'menu_class' => 'gf_form_toolbar_settings' ,
'link_class' => self :: toolbar_class ( 'settings' ),
'sub_menu_items' => $sub_menu_items ,
'capabilities' => $edit_capabilities ,
'priority' => 900 ,
);
// ---- Entries ----
$entries_capabilities = array (
'gravityforms_view_entries' ,
'gravityforms_edit_entries' ,
'gravityforms_delete_entries'
);
$menu_items [ 'entries' ] = array (
'label' => __ ( 'Entries' , 'gravityforms' ),
'icon' => '<i class="fa fa-comment-o fa-lg"></i>' ,
'title' => __ ( 'View entries generated by this form' , 'gravityforms' ),
'url' => '?page=gf_entries&id=' . $form_id ,
'menu_class' => 'gf_form_toolbar_entries' ,
'link_class' => self :: toolbar_class ( 'entries' ),
'capabilities' => $entries_capabilities ,
'priority' => 800 ,
);
// ---- Preview ----
$preview_capabilities = array (
'gravityforms_edit_forms' ,
'gravityforms_create_form' ,
'gravityforms_preview_forms'
);
$menu_items [ 'preview' ] = array (
'label' => __ ( 'Preview' , 'gravityforms' ),
'icon' => '<i class="fa fa-eye fa-lg"></i>' ,
'title' => __ ( 'Preview this form' , 'gravityforms' ),
'url' => trailingslashit ( site_url () ) . '?gf_page=preview&id=' . $form_id ,
'menu_class' => 'gf_form_toolbar_preview' ,
'link_class' => self :: toolbar_class ( 'preview' ),
'target' => '_blank' ,
'capabilities' => $preview_capabilities ,
'priority' => 700 ,
);
/*
// ---- Duplicate ----
$duplicate_capabilities = array ( 'gravityforms_edit_forms' , 'gravityforms_create_form' );
$menu_items [ 'duplicate' ] = array (
'label' => __ ( 'Duplicate' , 'gravityforms' ),
'icon' => '<i class="fa fa-files-o fa-lg"></i>' ,
'title' => __ ( 'Duplicate this form' , 'gravityforms' ),
'url' => wp_nonce_url ( " ?page=gf_edit_forms&action=duplicate&arg= { $form_id } " , " gf_duplicate_form_ { $form_id } " ),
'menu_class' => 'gf_form_toolbar_duplicate' ,
'link_class' => self :: toolbar_class ( 'duplicate' ),
'capabilities' => $duplicate_capabilities ,
'priority' => 600 ,
);
//---- Trash ----
$trash_capabilities = array ( 'gravityforms_delete_forms' );
$menu_items [ 'trash' ] = array (
'label' => __ ( 'Trash' , 'gravityforms' ),
'icon' => '<i class="fa fa-trash-o fa-lg"></i>' ,
'title' => __ ( 'Trash this form' , 'gravityforms' ),
'url' => wp_nonce_url ( " ?page=gf_edit_forms&action=trash&arg= { $form_id } " , " gf_delete_form_ { $form_id } " ),
'menu_class' => 'gf_form_toolbar_trash' ,
'link_class' => self :: toolbar_class ( 'trash' ),
'capabilities' => $trash_capabilities ,
'priority' => 500 ,
);
*/
return $menu_items ;
}
/**
* Builds the sub - menu items within the Gravity Forms toolbar .
*
* @ since Unknown
* @ access public
*
* @ used - by GFForms :: format_toolbar_menu_items ()
*
* @ param array $menu_items The menu items to be built
* @ param bool $compact True if the compact label should be used . False otherwise .
*
* @ return string $sub_menu_items_string The menu item HTML
*/
public static function toolbar_sub_menu_items ( $menu_items , $compact = false ) {
if ( empty ( $menu_items ) ) {
return '' ;
}
$sub_menu_items_string = '' ;
foreach ( $menu_items as $menu_item ) {
if ( GFCommon :: current_user_can_any ( rgar ( $menu_item , 'capabilities' ) ) ) {
$menu_class = esc_attr ( rgar ( $menu_item , 'menu_class' ) );
$link_class = esc_attr ( rgar ( $menu_item , 'link_class' ) );
$url = esc_url ( rgar ( $menu_item , 'url' ) );
$label = esc_html ( rgar ( $menu_item , 'label' ) );
$target = esc_attr ( rgar ( $menu_item , 'target' ) );
$sub_menu_items_string .= " <li class=' { $menu_class } '><a href=' { $url } ' class=' { $link_class } ' target=' { $target } '> { $label } </a></li> " ;
}
}
if ( $compact ) {
$sub_menu_items_string = '<div class="gf_submenu"><ul>' . $sub_menu_items_string . '</ul></div>' ;
} else {
$sub_menu_items_string = '<div class="gf_submenu"><ul>' . $sub_menu_items_string . '</ul></div>' ;
}
return $sub_menu_items_string ;
}
/**
* Gets the form settings sub - menu items .
*
* @ since Unknown
* @ access public
*
* @ used - by GFForms :: get_toolbar_menu_items ()
* @ uses GFFormSettings :: get_tabs ()
*
* @ param string $form_id The form ID .
*
* @ return array $sub_menu_items The sub - menu items .
*/
public static function get_form_settings_sub_menu_items ( $form_id ) {
require_once ( GFCommon :: get_base_path () . '/form_settings.php' );
$sub_menu_items = array ();
$tabs = GFFormSettings :: get_tabs ( $form_id );
foreach ( $tabs as $tab ) {
if ( $tab [ 'name' ] == 'settings' ) {
$form_setting_menu_item [ 'label' ] = 'Settings' ;
}
$sub_menu_items [] = array (
'url' => admin_url ( " admin.php?page=gf_edit_forms&view=settings&subview= { $tab [ 'name' ] } &id= { $form_id } " ),
'label' => $tab [ 'label' ],
'capabilities' => array ( 'gravityforms_edit_forms' )
);
}
return $sub_menu_items ;
}
/**
* Gets the CSS class to be used for the toolbar .
*
* @ since Unknown
* @ access private
*
* @ used - by GFForms :: get_toolbar_menu_items ()
*
* @ param string $item The Gravity Forms view ( current page ) .
*
* @ return string The class name . Empty string if the view isn ' t found .
*/
private static function toolbar_class ( $item ) {
switch ( $item ) {
case 'editor' :
if ( in_array ( rgget ( 'page' ), array (
'gf_edit_forms' ,
'gf_new_form'
) ) && rgempty ( 'view' , $_GET )
) {
return 'gf_toolbar_active' ;
}
break ;
case 'settings' :
if ( rgget ( 'view' ) == 'settings' ) {
return 'gf_toolbar_active' ;
}
break ;
case 'notifications' :
if ( rgget ( 'page' ) == 'gf_new_form' ) {
return 'gf_toolbar_disabled' ;
} else if ( rgget ( 'page' ) == 'gf_edit_forms' && rgget ( 'view' ) == 'notification' ) {
return 'gf_toolbar_active' ;
}
break ;
case 'entries' :
if ( rgget ( 'page' ) == 'gf_new_form' ) {
return 'gf_toolbar_disabled' ;
} else if ( rgget ( 'page' ) == 'gf_entries' && rgempty ( 'view' , $_GET ) ) {
return 'gf_toolbar_active' ;
}
break ;
case 'preview' :
if ( rgget ( 'page' ) == 'gf_new_form' ) {
return 'gf_toolbar_disabled' ;
}
break ;
}
return '' ;
}
/**
* Modifies the top WordPress toolbar to add Gravity Forms menu items .
*
* @ since Unknown
* @ access public
* @ global $wp_admin_bar
*
* @ used - by GFForms :: init ()
*/
public static function admin_bar () {
/**
* @ var WP_Admin_Bar $wp_admin_bar
*/
global $wp_admin_bar ;
if ( GFCommon :: current_user_can_any ( 'gravityforms_create_form' ) ) {
$wp_admin_bar -> add_node (
array (
'id' => 'gravityforms-new-form' ,
'parent' => 'new-content' ,
'title' => esc_attr__ ( 'Form' , 'gravityforms' ),
'href' => admin_url ( 'admin.php?page="gf_new_form' ),
)
);
}
if ( ! get_option ( 'gform_enable_toolbar_menu' ) ) {
return ;
}
if ( ! GFCommon :: current_user_can_any ( array (
'gravityforms_edit_forms' ,
'gravityforms_create_form' ,
'gravityforms_preview_forms' ,
'gravityforms_view_entries'
) )
) {
// The current user can't use anything on the menu so bail.
return ;
}
$args = array (
'id' => 'gform-forms' ,
'title' => '<div class="ab-item gforms-menu-icon svg" style="background-image: url(\'' . self :: get_admin_icon_b64 ( '#888888' ) . '\');"></div><span class="ab-label">' . esc_html__ ( 'Forms' , 'gravityforms' ) . '</span>' ,
'href' => admin_url ( 'admin.php?page=gf_edit_forms' ),
);
$wp_admin_bar -> add_node ( $args );
$recent_form_ids = GFFormsModel :: get_recent_forms ();
if ( $recent_form_ids ) {
$forms = GFFormsModel :: get_form_meta_by_id ( $recent_form_ids );
$wp_admin_bar -> add_node (
array (
'id' => 'gform-form-recent-forms' ,
'parent' => 'gform-forms' ,
'title' => esc_html__ ( 'Recent' , 'gravityforms' ),
'group' => true ,
)
);
foreach ( $recent_form_ids as $recent_form_id ) {
foreach ( $forms as $form ) {
if ( $form [ 'id' ] == $recent_form_id ) {
$wp_admin_bar -> add_node (
array (
'id' => 'gform-form-' . $recent_form_id ,
'parent' => 'gform-form-recent-forms' ,
'title' => $form [ 'title' ],
'href' => GFCommon :: current_user_can_any ( 'gravityforms_edit_forms' ) ? admin_url ( 'admin.php?page=gf_edit_forms&id=' . $recent_form_id ) : '' ,
)
);
if ( GFCommon :: current_user_can_any ( 'gravityforms_edit_forms' ) ) {
$wp_admin_bar -> add_node (
array (
'id' => 'gform-form-' . $recent_form_id . '-edit' ,
'parent' => 'gform-form-' . $recent_form_id ,
'title' => esc_html__ ( 'Edit' , 'gravityforms' ),
'href' => admin_url ( 'admin.php?page=gf_edit_forms&id=' . $recent_form_id ),
)
);
}
if ( GFCommon :: current_user_can_any ( 'gravityforms_view_entries' ) ) {
$wp_admin_bar -> add_node (
array (
'id' => 'gform-form-' . $recent_form_id . '-entries' ,
'parent' => 'gform-form-' . $recent_form_id ,
'title' => esc_html__ ( 'Entries' , 'gravityforms' ),
'href' => admin_url ( 'admin.php?page=gf_entries&id=' . $recent_form_id ),
)
);
}
if ( GFCommon :: current_user_can_any ( 'gravityforms_edit_forms' ) ) {
$wp_admin_bar -> add_node (
array (
'id' => 'gform-form-' . $recent_form_id . '-settings' ,
'parent' => 'gform-form-' . $recent_form_id ,
'title' => esc_html__ ( 'Settings' , 'gravityforms' ),
'href' => admin_url ( 'admin.php?page=gf_edit_forms&view=settings&subview=settings&id=' . $recent_form_id ),
)
);
}
if ( GFCommon :: current_user_can_any ( array (
'gravityforms_edit_forms' ,
'gravityforms_create_form' ,
'gravityforms_preview_forms'
) )
) {
$wp_admin_bar -> add_node (
array (
'id' => 'gform-form-' . $recent_form_id . '-preview' ,
'parent' => 'gform-form-' . $recent_form_id ,
'title' => esc_html__ ( 'Preview' , 'gravityforms' ),
'href' => trailingslashit ( site_url () ) . '?gf_page=preview&id=' . $recent_form_id ,
)
);
}
}
}
}
}
if ( GFCommon :: current_user_can_any ( 'gravityforms_edit_forms' ) ) {
$wp_admin_bar -> add_node (
array (
'id' => 'gform-forms-view-all' ,
'parent' => 'gform-forms' ,
'title' => esc_attr__ ( 'All Forms' , 'gravityforms' ),
'href' => admin_url ( 'admin.php?page=gf_edit_forms' ),
)
);
}
if ( GFCommon :: current_user_can_any ( 'gravityforms_create_form' ) ) {
$wp_admin_bar -> add_node (
array (
'id' => 'gform-forms-new-form' ,
'parent' => 'gform-forms' ,
'title' => esc_attr__ ( 'New Form' , 'gravityforms' ),
'href' => admin_url ( 'admin.php?page=gf_new_form' ),
)
);
}
}
/**
* Determines if automatic updating should be processed .
*
* @ since Unknown
* @ access public
*
* @ used - by WP_Automatic_Updater :: should_update ()
* @ uses GFForms :: is_auto_update_disabled ()
*
* @ param bool $update Whether or not to update .
* @ param object $item The update offer object .
*
* @ return bool True if update should be processed . False otherwise .
*/
public static function maybe_auto_update ( $update , $item ) {
if ( isset ( $item -> slug ) && $item -> slug == 'gravityforms' ) {
GFCommon :: log_debug ( 'GFForms::maybe_auto_update() - Starting auto-update for gravityforms.' );
$auto_update_disabled = self :: is_auto_update_disabled ();
GFCommon :: log_debug ( 'GFForms::maybe_auto_update() - $auto_update_disabled: ' . var_export ( $auto_update_disabled , true ) );
if ( $auto_update_disabled || version_compare ( GFForms :: $version , $item -> new_version , '=>' ) ) {
GFCommon :: log_debug ( 'GFForms::maybe_auto_update() - Aborting update.' );
return false ;
}
$current_major = implode ( '.' , array_slice ( preg_split ( '/[.-]/' , GFForms :: $version ), 0 , 1 ) );
$new_major = implode ( '.' , array_slice ( preg_split ( '/[.-]/' , $item -> new_version ), 0 , 1 ) );
$current_branch = implode ( '.' , array_slice ( preg_split ( '/[.-]/' , GFForms :: $version ), 0 , 2 ) );
$new_branch = implode ( '.' , array_slice ( preg_split ( '/[.-]/' , $item -> new_version ), 0 , 2 ) );
if ( $current_major == $new_major && $current_branch == $new_branch ) {
GFCommon :: log_debug ( __METHOD__ . '() - OK to update.' );
return true ;
} else {
GFCommon :: log_debug ( __METHOD__ . '() - Aborting update. Not on the same major version.' );
return false ;
}
}
return $update ;
}
/**
* Checks if automatic updates are disabled .
*
* @ since Unknown
* @ access public
*
* @ used - by GFForms :: maybe_auto_update ()
* @ used DISALLOW_FILE_MODS
* @ used WP_INSTALLING
* @ used AUTOMATIC_UPDATER_DISABLED
* @ used GFORM_DISABLE_AUTO_UPDATE
*
* @ return bool True if auto update is disabled . False otherwise .
*/
public static function is_auto_update_disabled () {
// Currently WordPress won't ask Gravity Forms to update if background updates are disabled.
// Let's double check anyway.
// WordPress background updates are disabled if you don't want file changes.
if ( defined ( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) {
return true ;
}
if ( defined ( 'WP_INSTALLING' ) ) {
return true ;
}
$wp_updates_disabled = defined ( 'AUTOMATIC_UPDATER_DISABLED' ) && AUTOMATIC_UPDATER_DISABLED ;
/**
* Overrides the WordPress AUTOMATIC_UPDATER_DISABLED constant .
*
* @ since Unknown
*
* @ param bool $wp_updates_disabled True if disables . False otherwise .
*/
$wp_updates_disabled = apply_filters ( 'automatic_updater_disabled' , $wp_updates_disabled );
if ( $wp_updates_disabled ) {
GFCommon :: log_debug ( __METHOD__ . '() - Background updates are disabled in WordPress.' );
return true ;
}
// Now check Gravity Forms Background Update Settings
$enabled = get_option ( 'gform_enable_background_updates' );
GFCommon :: log_debug ( 'GFForms::is_auto_update_disabled() - $enabled: ' . var_export ( $enabled , true ) );
/**
* Filter to disable Gravity Forms Automatic updates
*
* @ param bool $enabled Check if automatic updates are enabled , and then disable it
*/
$disabled = apply_filters ( 'gform_disable_auto_update' , ! $enabled );
GFCommon :: log_debug ( 'GFForms::is_auto_update_disabled() - $disabled: ' . var_export ( $disabled , true ) );
if ( ! $disabled ) {
$disabled = defined ( 'GFORM_DISABLE_AUTO_UPDATE' ) && GFORM_DISABLE_AUTO_UPDATE ;
GFCommon :: log_debug ( 'GFForms::is_auto_update_disabled() - GFORM_DISABLE_AUTO_UPDATE: ' . var_export ( $disabled , true ) );
}
return $disabled ;
}
public static function deprecate_add_on_methods () {
if ( ( defined ( 'DOING_AJAX' ) && DOING_AJAX ) || ( defined ( 'DOING_CRON' ) && DOING_CRON ) || ( defined ( 'WP_INSTALLING' ) && WP_INSTALLING ) ) {
return ;
}
$deprecated = GFAddOn :: get_all_deprecated_protected_methods ();
if ( ! empty ( $deprecated ) ) {
foreach ( $deprecated as $method ) {
_deprecated_function ( $method , '1.9' , 'public access level' );
}
}
}
/**
* Shortcode UI
*/
/**
* Output a shortcode .
*
* Called via AJAX .
* Used for displaying the shortcode in the TinyMCE editor .
*
* @ since Unknown
* @ access public
* @ global $post
*/
public static function handle_ajax_do_shortcode () {
$shortcode = ! empty ( $_POST [ 'shortcode' ] ) ? sanitize_text_field ( stripslashes ( $_POST [ 'shortcode' ] ) ) : null ;
$post_id = ! empty ( $_POST [ 'post_id' ] ) ? intval ( $_POST [ 'post_id' ] ) : null ;
if ( ! current_user_can ( 'edit_post' , $post_id ) || ! wp_verify_nonce ( $_POST [ 'nonce' ], 'gf-shortcode-ui-preview' ) ) {
echo esc_html__ ( 'Error' , 'gravityforms' );
exit ;
}
$form_id = ! empty ( $_POST [ 'form_id' ] ) ? intval ( $_POST [ 'form_id' ] ) : null ;
global $post ;
$post = get_post ( $post_id );
setup_postdata ( $post );
self :: enqueue_form_scripts ( $form_id , true );
wp_print_scripts ();
wp_print_styles ();
echo do_shortcode ( $shortcode );
// Disable the elements on the form
?>
< script type = " text/javascript " >
jQuery ( '.gform_wrapper input, .gform_wrapper select, .gform_wrapper textarea' ) . prop ( 'disabled' , true );
jQuery ( 'a img' ) . each ( function () {
var image = this . src ;
var img = jQuery ( '<img>' , { src : image });
$ ( this ) . parent () . replaceWith ( img );
});
jQuery ( 'a' ) . each ( function () {
jQuery ( this ) . replaceWith ( jQuery ( this ) . text ());
});
</ script >
< ? php
exit ;
}
/**
* Displays the shortcode editor .
*
* @ since Unknown
* @ access public
*
* @ used - by GFForms :: init ()
* @ used GFForms :: get_view ()
*
* @ return void
*/
public static function action_print_media_templates () {
echo GFForms :: get_view ( 'edit-shortcode-form' );
}
/**
* Gets the view and loads the appropriate template .
*
* @ since Unknown
* @ access public
*
* @ used - by GFForms :: action_print_media_templates ()
*
* @ param string $template The template to be loaded .
*
* @ return mixed The contents of the template file .
*/
public static function get_view ( $template ) {
if ( ! file_exists ( $template ) ) {
$template_dir = GFCommon :: get_base_path () . '/includes/templates/' ;
$template = $template_dir . $template . '.tpl.php' ;
if ( ! file_exists ( $template ) ) {
return '' ;
}
}
ob_start ();
include $template ;
return ob_get_clean ();
}
/**
* Modifies the TinyMCE editor styling .
*
* Called from the tiny_mce_before_init filter
*
* @ since Unknown
* @ access public
*
* @ used - by Filter : tiny_mce_before_init
*
* @ param array $init Init data passed from the tiny_mce_before_init filter .
*
* @ return array $init Data after filtering .
*/
public static function modify_tiny_mce_4 ( $init ) {
// Hack to fix compatibility issue with ACF PRO
if ( ! isset ( $init [ 'content_css' ] ) ) {
return $init ;
}
$base_url = GFCommon :: get_base_url ();
$min = defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || isset ( $_GET [ 'gform_debug' ] ) ? '' : '.min' ;
$editor_styles = $base_url . " /css/shortcode-ui-editor-styles { $min } .css, " ;
$form_styles = $base_url . " /css/formsmain { $min } .css " ;
if ( isset ( $init [ 'content_css' ] ) ) {
if ( empty ( $init [ 'content_css' ] ) ) {
$init [ 'content_css' ] = '' ;
} elseif ( is_array ( $init [ 'content_css' ] ) ) {
$init [ 'content_css' ][] = $editor_styles ;
$init [ 'content_css' ][] = $form_styles ;
return $init ;
} else {
$init [ 'content_css' ] = $init [ 'content_css' ] . ',' ;
}
}
// Note: Using .= here can trigger a fatal error
$init [ 'content_css' ] = $init [ 'content_css' ] . $editor_styles . $form_styles ;
return $init ;
}
/**
* Gets the available shortcode attributes .
*
* @ since Unknown
* @ access public
*
* @ return array $shortcodes Shortcode attributes .
*/
public static function get_shortcodes () {
$forms = RGFormsModel :: get_forms ( 1 , 'title' );
$forms_options [ '' ] = __ ( 'Select a Form' , 'gravityforms' );
foreach ( $forms as $form ) {
$forms_options [ absint ( $form -> id ) ] = $form -> title ;
}
$default_attrs = array (
array (
'label' => __ ( 'Select a form below to add it to your post or page.' , 'gravityforms' ),
'tooltip' => __ ( 'Select a form from the list to add it to your post or page.' , 'gravityforms' ),
'attr' => 'id' ,
'type' => 'select' ,
'section' => 'required' ,
'description' => __ ( " Can't find your form? Make sure it is active. " , 'gravityforms' ),
'options' => $forms_options ,
),
array (
'label' => __ ( 'Display form title' , 'gravityforms' ),
'attr' => 'title' ,
'default' => 'true' ,
'section' => 'standard' ,
'type' => 'checkbox' ,
'tooltip' => __ ( 'Whether or not to display the form title.' , 'gravityforms' )
),
array (
'label' => __ ( 'Display form description' , 'gravityforms' ),
'attr' => 'description' ,
'default' => 'true' ,
'section' => 'standard' ,
'type' => 'checkbox' ,
'tooltip' => __ ( 'Whether or not to display the form description.' , 'gravityforms' )
),
array (
'label' => __ ( 'Enable Ajax' , 'gravityforms' ),
'attr' => 'ajax' ,
'section' => 'standard' ,
'type' => 'checkbox' ,
'tooltip' => __ ( 'Specify whether or not to use Ajax to submit the form.' , 'gravityforms' )
),
array (
'label' => 'Tabindex' ,
'attr' => 'tabindex' ,
'type' => 'number' ,
'tooltip' => __ ( 'Specify the starting tab index for the fields of this form.' , 'gravityforms' )
),
);
/**
* Filters through the shortcode builder actions ( ajax , tabindex , form title ) for adding a new form to a post , page , etc .
*
* @ since Unknown
*
* @ param array () Array of additional shortcode builder actions . Empty by default .
*/
$add_on_actions = apply_filters ( 'gform_shortcode_builder_actions' , array () );
if ( ! empty ( $add_on_actions ) ) {
$action_options = array ( '' => __ ( 'Select an action' , 'gravityforms' ) );
foreach ( $add_on_actions as $add_on_action ) {
foreach ( $add_on_action as $key => $array ) {
$action_options [ $key ] = $array [ 'label' ];
}
}
$default_attrs [] = array (
'label' => 'Action' ,
'attr' => 'action' ,
'type' => 'select' ,
'options' => $action_options ,
'tooltip' => __ ( 'Select an action for this shortcode. Actions are added by some add-ons.' , 'gravityforms' )
);
}
$shortcode = array (
'shortcode_tag' => 'gravityform' ,
'action_tag' => '' ,
'label' => 'Gravity Forms' ,
'attrs' => $default_attrs ,
);
$shortcodes [] = $shortcode ;
if ( ! empty ( $add_on_actions ) ) {
foreach ( $add_on_actions as $add_on_action ) {
foreach ( $add_on_action as $key => $array ) {
$attrs = array_merge ( $default_attrs , $array [ 'attrs' ] );
$shortcode = array (
'shortcode_tag' => 'gravityform' ,
'action_tag' => $key ,
'label' => rgar ( $array , 'label' ),
'attrs' => $attrs ,
);
}
}
$shortcodes [] = $shortcode ;
}
return $shortcodes ;
}
/**
* Enqueues scripts needed to display the form .
*
* @ since Unknown
* @ access public
*
* @ used GFFormDisplay :: enqueue_form_scripts ()
* @ used GFAddOn :: get_registered_addons ()
*
* @ param string $form_id The displayed form ID .
* @ param bool $is_ajax True if form uses AJAX . False otherwise .
*/
public static function enqueue_form_scripts ( $form_id , $is_ajax = false ) {
require_once ( GFCommon :: get_base_path () . '/form_display.php' );
$form = RGFormsModel :: get_form_meta ( $form_id );
GFFormDisplay :: enqueue_form_scripts ( $form , $is_ajax );
$addons = GFAddOn :: get_registered_addons ();
foreach ( $addons as $addon ) {
$a = call_user_func ( array ( $addon , 'get_instance' ) );
$a -> enqueue_scripts ( $form , $is_ajax );
}
}
/**
* Displays the installation wizard or upgrade wizard when appropriate .
*
* @ since 2.2
* @ access public
*
* @ return bool Was a wizard displayed ?
*/
public static function maybe_display_wizard () {
return gf_upgrade () -> maybe_display_wizard ();
}
/**
* Sets the screen options for the entry list .
*
* @ since 2.0
* @ access public
*
* @ used - by Filter : set - screen - option
*
* @ param bool | int $status Screen option value . Not used . Defaults to false .
* @ param string $option The option to check .
* @ param int $value The number of rows to display per page .
*
* @ return array $return The filtered data
*/
public static function set_screen_options ( $status , $option , $value ) {
$return = false ;
if ( $option == 'gform_entries_screen_options' ) {
$return = array ();
$return [ 'default_filter' ] = sanitize_key ( rgpost ( 'gform_default_filter' ) );
$return [ 'per_page' ] = sanitize_key ( rgpost ( 'gform_per_page' ) );
} elseif ( $option = 'gform_forms_per_page' ) {
$return = $value ;
}
return $return ;
}
/**
* Returns the markup for the screen options for the entry list .
*
* @ since 2.0
* @ access public
*
* @ used - by Filter : screen_settings
* @ used GFEntryList :: get_screen_options_markup ()
*
* @ param string $status The current screen settings
* @ param WP_Screen $args WP_Screen object
*
* @ return string $return The filtered screen settings
*/
public static function show_screen_options ( $status , $args ) {
$return = $status ;
if ( self :: get_page () == 'entry_list' ) {
require_once ( GFCommon :: get_base_path () . '/entry_list.php' );
$return = GFEntryList :: get_screen_options_markup ( $status , $args );
}
return $return ;
}
/**
* Loads the screen options for the entry detail page .
*
* @ since 2.0
* @ access public
*
* @ used GFEntryDetail :: add_meta_boxes ()
*/
public static function load_screen_options () {
$screen = get_current_screen ();
if ( ! is_object ( $screen ) ) {
return ;
}
$page = GFForms :: get_page ();
if ( $page == 'form_list' ) {
$args = array (
'label' => __ ( 'Forms per page' , 'gravityforms' ),
'default' => 20 ,
'option' => 'gform_forms_per_page' ,
);
add_screen_option ( 'per_page' , $args );
} elseif ( in_array ( $page , array ( 'entry_detail' , 'entry_detail_edit' ) ) ) {
require_once ( GFCommon :: get_base_path () . '/entry_detail.php' );
GFEntryDetail :: add_meta_boxes ();
}
}
/**
* Daily cron task . Target for the gravityforms_cron action .
*
* - Performs self - healing
* - Adds empty index files
* - Deletes unclaimed export files .
* - Deleted old log files .
* - Deletes orphaned entry rows from the lead table .
*
* @ since 2.0 . 0
* @ access public
*
* @ used - by Action : gravityforms_cron
* @ used GFForms :: add_security_files ()
* @ used GFForms :: delete_old_export_files ()
* @ used GFForms :: delete_old_log_files ()
* @ used GFForms :: do_self_healing ()
* @ used GFForms :: delete_orphaned_entries ()
*/
public static function cron () {
GFCommon :: log_debug ( __METHOD__ . '(): Starting cron.' );
self :: add_security_files ();
self :: delete_old_export_files ();
self :: delete_old_log_files ();
self :: do_self_healing ();
self :: delete_orphaned_entries ();
GFCommon :: log_debug ( __METHOD__ . '(): Done.' );
}
/**
* Deletes all entry export files from the server that haven ' t been claimed within 24 hours .
*
* @ since 2.0 . 0
* @ access public
*/
public static function delete_old_export_files () {
GFCommon :: log_debug ( __METHOD__ . '(): Starting.' );
$uploads_folder = RGFormsModel :: get_upload_root ();
if ( ! is_dir ( $uploads_folder ) || is_link ( $uploads_folder ) ) {
GFCommon :: log_debug ( __METHOD__ . '(): No upload root - bailing.' );
return ;
}
$export_folder = $uploads_folder . 'export' ;
if ( ! is_dir ( $export_folder ) || is_link ( $export_folder ) ) {
GFCommon :: log_debug ( __METHOD__ . '(): No export root - bailing.' );
return ;
}
GFCommon :: log_debug ( __METHOD__ . '(): Start deleting old export files' );
foreach ( glob ( $export_folder . DIRECTORY_SEPARATOR . '*.csv' , GLOB_BRACE ) as $filename ) {
$timestamp = filemtime ( $filename );
if ( $timestamp < time () - DAY_IN_SECONDS ) {
// Delete files over a day old
GFCommon :: log_debug ( __METHOD__ . '(): Proceeding to delete ' . $filename );
$success = unlink ( $filename );
GFCommon :: log_debug ( __METHOD__ . '(): Delete successful: ' . ( $success ? 'yes' : 'no' ) );
}
}
}
/**
* Deletes any log files that are older than one month .
*
* @ since 2.0 . 0
* @ access public
*/
public static function delete_old_log_files () {
GFCommon :: log_debug ( __METHOD__ . '(): Starting.' );
$uploads_folder = RGFormsModel :: get_upload_root ();
if ( ! is_dir ( $uploads_folder ) || is_link ( $uploads_folder ) ) {
GFCommon :: log_debug ( __METHOD__ . '(): No upload root - bailing.' );
return ;
}
$logs_folder = $uploads_folder . 'logs' ;
if ( ! is_dir ( $logs_folder ) || is_link ( $logs_folder ) ) {
GFCommon :: log_debug ( __METHOD__ . '(): No logs folder - bailing.' );
return ;
}
GFCommon :: log_debug ( __METHOD__ . '(): Start deleting old log files' );
foreach ( glob ( $logs_folder . DIRECTORY_SEPARATOR . '*.txt' , GLOB_BRACE ) as $filename ) {
$timestamp = filemtime ( $filename );
if ( $timestamp < time () - MONTH_IN_SECONDS ) {
// Delete files over one month old
GFCommon :: log_debug ( __METHOD__ . '(): Proceeding to delete ' . $filename );
$success = unlink ( $filename );
GFCommon :: log_debug ( __METHOD__ . '(): Delete successful: ' . ( $success ? 'yes' : 'no' ) );
}
}
}
/**
* Deletes all rows in the lead table that don ' t have corresponding rows in the details table .
*
* @ since 2.0 . 0
* @ access public
* @ global $wpdb
*/
public static function delete_orphaned_entries () {
global $wpdb ;
if ( version_compare ( GFFormsModel :: get_database_version (), '2.3-beta-1' , '<' ) ) {
return ;
}
GFCommon :: log_debug ( __METHOD__ . '(): Starting to delete orphaned entries' );
$entry_table = GFFormsModel :: get_entry_table_name ();
$entry_meta_table = GFFormsModel :: get_entry_meta_table_name ();
$sql = " DELETE FROM { $entry_table } WHERE id NOT IN( SELECT entry_id FROM { $entry_meta_table } ) " ;
$result = $wpdb -> query ( $sql );
GFCommon :: log_debug ( __METHOD__ . '(): Delete result: ' . print_r ( $result , true ) );
}
/**
* Hooked into the 'admin_head' action .
*
* Outputs the styles for the Forms Toolbar menu .
* Outputs gf vars if required .
*
* @ since 2.0 . 1.2
* @ access public
*/
public static function load_admin_bar_styles () {
if ( ! get_option ( 'gform_enable_toolbar_menu' ) ) {
return ;
}
if ( ! GFCommon :: current_user_can_any ( array (
'gravityforms_edit_forms' ,
'gravityforms_create_form' ,
'gravityforms_preview_forms' ,
'gravityforms_view_entries'
) )
) {
// The current user can't use anything on the menu so bail.
return ;
}
?>
< style >
. gforms - menu - icon {
float : left ;
width : 26 px ! important ;
height : 30 px ! important ;
background - repeat : no - repeat ;
background - position : 0 6 px ;
background - size : 20 px ;
}
@ media screen and ( max - width : 782 px ) {
#wpadminbar #wp-admin-bar-gform-forms .ab-item {
line - height : 53 px ;
height : 46 px ! important ;
width : 52 px ! important ;
display : block ;
background - size : 36 px 36 px ;
background - position : 7 px 6 px ;
}
#wpadminbar li#wp-admin-bar-gform-forms {
display : block ;
}
}
</ style >
< ? php
}
/**
* Drops a table index .
*
* @ access public
* @ global $wpdb
*
* @ param string $table The table that the index will be dropped from .
* @ param string $index The index to be dropped .
*
* @ return void
* @ deprecated Use gf_upgrade () -> drop_index () instead
*/
public static function drop_index ( $table , $index ) {
_deprecated_function ( 'This function has been deprecated. Use gf_upgrade()->drop_index() instead' , '2.2' , 'gf_upgrade()->drop_index()' );
gf_upgrade () -> drop_index ( $table , $index );
}
/**
* Fixes case for database queries .
*
* @ deprecated 2.2
*
* @ since Unknown
* @ access public
*
* @ param array $cqueries Queries to be fixed .
*
* @ return array $queries Queries after processing .
*/
public static function dbdelta_fix_case ( $cqueries ) {
_deprecated_function ( 'dbdelta_fix_case' , '2.2' , 'gf_upgrade()->dbdelta_fix_case()' );
return gf_upgrade () -> dbdelta_fix_case ( $cqueries );
}
public static function setup ( $force_setup = false ) {
_deprecated_function ( 'This function has been deprecated. Use gf_upgrade()->maybe_upgrade() or gf_upgrade()->upgrade() instead' , '2.2' , 'gf_upgrade()->upgrade() or gf_upgrade()->maybe_upgrade()' );
if ( $force_setup ) {
$current_version = get_option ( 'rg_form_version' );
gf_upgrade () -> upgrade ( $current_version , true );
} else {
gf_upgrade () -> maybe_upgrade ();
}
}
public static function setup_database () {
_deprecated_function ( 'This function has been deprecated. Use gf_upgrade()->upgrade_schema()' , '2.2' , 'gf_upgrade()->upgrade_schema()' );
gf_upgrade () -> upgrade_schema ();
}
/**
* Creates an instance of GF_Background_Upgrader and stores it in GFForms :: $background_upgrader
*
* @ since 2.3
*/
public static function init_background_upgrader () {
if ( empty ( self :: $background_upgrader ) ) {
require_once ( plugin_dir_path ( __FILE__ ) . 'includes/class-gf-background-upgrader.php' );
self :: $background_upgrader = new GF_Background_Upgrader ();
}
}
/**
* Target for the WordPress 'query' filter . Triggers an PHP Notice if an outdated add - on or custom code attempts to
* access tables that are not valid for this version of Gravity Forms .
*
* @ since 2.3
*
* @ param $query
*
* @ return string
*/
public static function filter_query ( $query ) {
global $wpdb ;
if ( preg_match ( " / $wpdb->prefix (rg_lead_detail|rg_lead_meta|rg_lead_notes|rg_lead|rg_form_meta|rg_form_view|rg_form|rg_incomplete_submissions)/ " , $query , $matches ) ) {
if ( version_compare ( GFFormsModel :: get_database_version (), '2.3-dev-1' , '>' ) ) {
$table_name = $matches [ 0 ];
$url = 'https://docs.gravityforms.com/database-storage-structure-reference/#changes-from-gravity-forms-2-2' ;
/* translators: 1: The table name 2: the URL with further details */
$message = esc_html__ ( 'An outdated add-on or custom code is attempting to access the %1$s table which is not valid in this version of Gravity Forms. Update your add-ons and custom code to prevent loss of form data. Further details: %2$s' , 'gravityforms' );
$notice = sprintf ( $message , $table_name , $url );
trigger_error ( $notice );
}
}
return $query ;
}
/**
* Target for the admin_notices action .
*
* @ since 2.3
*
* Displays site - side dismissible notices .
*/
public static function action_admin_notices () {
GFCommon :: display_dismissible_message ( false , 'site-wide' );
}
}
/**
* Class RGForms
*
* @ deprecated
* Exists only for backwards compatibility . Used GFForms instead .
*/
class RGForms extends GFForms {
}
/**
* Main Gravity Forms function call .
*
* Should be used to insert a Gravity Form from code .
*
* @ param string $id The form ID
* @ param bool $display_title If the form title should be displayed in the form . Defaults to true .
* @ param bool $display_description If the form description should be displayed in the form . Defaults to true .
* @ param bool $display_inactive If the form should be displayed if marked as inactive . Defaults to false .
* @ param array | null $field_values Default field values . Defaults to null .
* @ param bool $ajax If submission should be processed via AJAX . Defaults to false .
* @ param int $tabindex Starting tabindex . Defaults to 1.
* @ param bool $echo If the field should be echoed . Defaults to true .
*
* @ return string | void
*/
function gravity_form ( $id , $display_title = true , $display_description = true , $display_inactive = false , $field_values = null , $ajax = false , $tabindex = 1 , $echo = true ) {
if ( ! $echo ) {
return GFForms :: get_form ( $id , $display_title , $display_description , $display_inactive , $field_values , $ajax , $tabindex );
}
echo GFForms :: get_form ( $id , $display_title , $display_description , $display_inactive , $field_values , $ajax , $tabindex );
}
/**
* @ return GF_Upgrade
*/
function gf_upgrade () {
require_once ( GFCommon :: get_base_path () . '/includes/class-gf-upgrade.php' );
return GF_Upgrade :: get_instance ();
}
/**
* Enqueues form scripts for the specified form .
*
* @ uses GFForms :: enqueue_form_scripts ()
*
* @ param string $form_id The form ID .
* @ param bool $is_ajax If the form is submitted via AJAX . Defaults to false .
*/
function gravity_form_enqueue_scripts ( $form_id , $is_ajax = false ) {
GFForms :: enqueue_form_scripts ( $form_id , $is_ajax );
}
if ( ! function_exists ( 'rgget' ) ) {
/**
* Helper function for getting values from query strings or arrays
*
* @ param string $name The key
* @ param array $array The array to search through . If null , checks query strings . Defaults to null .
*
* @ return string The value . If none found , empty string .
*/
function rgget ( $name , $array = null ) {
if ( ! isset ( $array ) ) {
$array = $_GET ;
}
if ( ! is_array ( $array ) ) {
return '' ;
}
if ( isset ( $array [ $name ] ) ) {
return $array [ $name ];
}
return '' ;
}
}
if ( ! function_exists ( 'rgpost' ) ) {
/**
* Helper function to obtain POST values .
*
* @ param string $name The key
* @ param bool $do_stripslashes Optional . Performs stripslashes_deep . Defaults to true .
*
* @ return string The value . If none found , empty string .
*/
function rgpost ( $name , $do_stripslashes = true ) {
if ( isset ( $_POST [ $name ] ) ) {
return $do_stripslashes ? stripslashes_deep ( $_POST [ $name ] ) : $_POST [ $name ];
}
return '' ;
}
}
if ( ! function_exists ( 'rgar' ) ) {
/**
* Get a specific property of an array without needing to check if that property exists .
*
* Provide a default value if you want to return a specific value if the property is not set .
*
* @ since Unknown
* @ access public
*
* @ param array $array Array from which the property ' s value should be retrieved .
* @ param string $prop Name of the property to be retrieved .
* @ param string $default Optional . Value that should be returned if the property is not set or empty . Defaults to null .
*
* @ return null | string | mixed The value
*/
function rgar ( $array , $prop , $default = null ) {
if ( ! is_array ( $array ) && ! ( is_object ( $array ) && $array instanceof ArrayAccess ) ) {
return $default ;
}
if ( isset ( $array [ $prop ] ) ) {
$value = $array [ $prop ];
} else {
$value = '' ;
}
return empty ( $value ) && $default !== null ? $default : $value ;
}
}
if ( ! function_exists ( 'rgars' ) ) {
/**
* Gets a specific property within a multidimensional array .
*
* @ since Unknown
* @ access public
*
* @ param array $array The array to search in .
* @ param string $name The name of the property to find .
* @ param string $default Optional . Value that should be returned if the property is not set or empty . Defaults to null .
*
* @ return null | string | mixed The value
*/
function rgars ( $array , $name , $default = null ) {
if ( ! is_array ( $array ) && ! ( is_object ( $array ) && $array instanceof ArrayAccess ) ) {
return $default ;
}
$names = explode ( '/' , $name );
$val = $array ;
foreach ( $names as $current_name ) {
$val = rgar ( $val , $current_name , $default );
}
return $val ;
}
}
if ( ! function_exists ( 'rgempty' ) ) {
/**
* Determines if a value is empty .
*
* @ since Unknown
* @ access public
*
* @ param string $name The property name to check .
* @ param array $array Optional . An array to check through . Otherwise , checks for POST variables .
*
* @ return bool True if empty . False otherwise .
*/
function rgempty ( $name , $array = null ) {
if ( is_array ( $name ) ) {
return empty ( $name );
}
if ( ! $array ) {
$array = $_POST ;
}
$val = rgar ( $array , $name );
return empty ( $val );
}
}
if ( ! function_exists ( 'rgblank' ) ) {
/**
* Checks if the string is empty
*
* @ since Unknown
* @ access public
*
* @ param string $text The string to check .
*
* @ return bool True if empty . False otherwise .
*/
function rgblank ( $text ) {
return empty ( $text ) && ! is_array ( $text ) && strval ( $text ) != '0' ;
}
}
if ( ! function_exists ( 'rgobj' ) ) {
/**
* Gets a property value from an object
*
* @ since Unknown
* @ access public
*
* @ param object $obj The object to check
* @ param string $name The property name to check for
*
* @ return string The property value
*/
function rgobj ( $obj , $name ) {
if ( isset ( $obj -> $name ) ) {
return $obj -> $name ;
}
return '' ;
}
}
if ( ! function_exists ( 'rgexplode' ) ) {
/**
* Converts a delimiter separated string to an array .
*
* @ since Unknown
* @ access public
*
* @ param string $sep The delimiter between values
* @ param string $string The string to convert
* @ param int $count The expected number of items in the resulting array
*
* @ return array $ary The exploded array
*/
function rgexplode ( $sep , $string , $count ) {
$ary = explode ( $sep , $string );
while ( count ( $ary ) < $count ) {
$ary [] = '' ;
}
return $ary ;
}
}
if ( ! function_exists ( 'gf_apply_filters' ) ) {
//function gf_apply_filters( $filter, $modifiers, $value ) {
/**
* Gravity Forms pre - processing for apply_filters
*
* Allows additional filters based on form and field ID to be defined easily .
*
* @ since Unknown
* @ access public
*
* @ param string | array $filter The name of the filter .
* @ param mixed $value The value to filter .
*
* @ return mixed The filtered value .
*/
function gf_apply_filters ( $filter , $value ) {
$args = func_get_args ();
if ( is_array ( $filter ) ) {
// func parameters are: $filter, $value
$modifiers = array_splice ( $filter , 1 , count ( $filter ) );
$filter = $filter [ 0 ];
$args = array_slice ( $args , 2 );
} else {
//_deprecated_argument( 'gf_apply_filters', '1.9.14.20', "Modifiers should no longer be passed as a separate parameter. Combine the filter name and modifier(s) into an array and pass that array as the first parameter of the function. Example: gf_apply_filters( array( 'action_name', 'mod1', 'mod2' ), \$value, \$arg1, \$arg2 );" );
// func parameters are: $filter, $modifier, $value
$modifiers = ! is_array ( $value ) ? array ( $value ) : $value ;
$value = $args [ 2 ];
$args = array_slice ( $args , 3 );
}
// Add an empty modifier so the base filter will be applied as well
array_unshift ( $modifiers , '' );
$args = array_pad ( $args , 10 , null );
// Apply modified versions of filter
foreach ( $modifiers as $modifier ) {
$modifier = empty ( $modifier ) ? '' : sprintf ( '_%s' , $modifier );
$filter .= $modifier ;
$value = apply_filters ( $filter , $value , $args [ 0 ], $args [ 1 ], $args [ 2 ], $args [ 3 ], $args [ 4 ], $args [ 5 ], $args [ 6 ], $args [ 7 ], $args [ 8 ], $args [ 9 ] );
}
return $value ;
}
}
if ( ! function_exists ( 'gf_do_action' ) ) {
/**
* Gravity Forms pre - processing for do_action .
*
* Allows additional actions based on form and field ID to be defined easily .
*
* @ since 1.9 . 14.20 Modifiers should no longer be passed as a separate parameter .
* @ since 1.9 . 12
* @ access public
*
* @ param string | array $action The action .
*/
function gf_do_action ( $action ) {
$args = func_get_args ();
if ( is_array ( $action ) ) {
// Func parameters are: $action, $value
$modifiers = array_splice ( $action , 1 , count ( $action ) );
$action = $action [ 0 ];
$args = array_slice ( $args , 1 );
} else {
//_deprecated_argument( 'gf_do_action', '1.9.14.20', "Modifiers should no longer be passed as a separate parameter. Combine the action name and modifier(s) into an array and pass that array as the first parameter of the function. Example: gf_do_action( array( 'action_name', 'mod1', 'mod2' ), \$arg1, \$arg2 );" );
// Func parameters are: $action, $modifier, $value
$modifiers = ! is_array ( $args [ 1 ] ) ? array ( $args [ 1 ] ) : $args [ 1 ];
$args = array_slice ( $args , 2 );
}
// Add an empty modifier so the base filter will be applied as well
array_unshift ( $modifiers , '' );
$args = array_pad ( $args , 10 , null );
// Apply modified versions of filter
foreach ( $modifiers as $modifier ) {
$modifier = empty ( $modifier ) ? '' : sprintf ( '_%s' , $modifier );
$action .= $modifier ;
do_action ( $action , $args [ 0 ], $args [ 1 ], $args [ 2 ], $args [ 3 ], $args [ 4 ], $args [ 5 ], $args [ 6 ], $args [ 7 ], $args [ 8 ], $args [ 9 ] );
}
}
}