plugin install
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
/**
|
||||
* Handles logic for duplicate submission prevention services.
|
||||
*
|
||||
* @package Gravity_Forms\Gravity_Forms\Duplicate_Submissions
|
||||
*/
|
||||
|
||||
namespace Gravity_Forms\Gravity_Forms\Duplicate_Submissions;
|
||||
|
||||
/**
|
||||
* Class GF_Duplicate_Submissions_Handler
|
||||
*
|
||||
* @since 2.9.1
|
||||
*
|
||||
* Provides functionality for handling duplicate submissions while avoiding multiple
|
||||
* entries being submitted.
|
||||
*/
|
||||
class GF_Duplicate_Submissions_Handler {
|
||||
|
||||
/**
|
||||
* The URL parameter used for redirect protection in Safari.
|
||||
*/
|
||||
const SAFARI_REDIRECT_PARAM = 'gf_protect_submission';
|
||||
|
||||
/**
|
||||
* The base URL for this plugin
|
||||
*
|
||||
* @var string $base_url.
|
||||
*/
|
||||
private $base_url;
|
||||
|
||||
/**
|
||||
* GF_Duplicate_Submissions_Handler constructor.
|
||||
*
|
||||
* @param string $base_url The Base URL for this Plugin.
|
||||
*/
|
||||
public function __construct( $base_url ) {
|
||||
$this->base_url = $base_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if duplicate submission protection is enabled. false otherwise.
|
||||
*
|
||||
* @returns bool $is_enabled true if duplicate protection is active/enabled. false otherwise
|
||||
*/
|
||||
public function is_enabled() {
|
||||
|
||||
$form_id = filter_input( INPUT_POST, 'gform_submit', FILTER_SANITIZE_NUMBER_INT );
|
||||
|
||||
if ( empty( $form_id ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows users to disable duplicate submissions protection, either globally
|
||||
* or on a form-by-form basis.
|
||||
*
|
||||
* @since 2.5.15
|
||||
*
|
||||
* @param bool Passes a false value by default.
|
||||
* @param int|string Passes the current form ID.
|
||||
*/
|
||||
$is_disabled = gf_apply_filters( array( 'gform_is_disabled_duplicate_submissions_protection', $form_id ), false, $form_id );
|
||||
|
||||
return ! $is_disabled;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue the JS file if this is a form submission configured for duplicate protection.
|
||||
*/
|
||||
public function maybe_enqueue_scripts() {
|
||||
|
||||
if ( $this->is_enabled() ) {
|
||||
$min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG || isset( $_GET['gform_debug'] ) ? '' : '.min';
|
||||
wp_enqueue_script( 'gform_duplicate_submissions', $this->base_url . "/js/duplicate-submissions{$min}.js", array(), true );
|
||||
wp_localize_script( 'gform_duplicate_submissions', 'gf_duplicate_submissions', $this->get_localized_script_data() );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the correct data to localize to the JS file.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function get_localized_script_data() {
|
||||
return array(
|
||||
'is_gf_submission' => (int) $this->is_valid_submission(),
|
||||
'safari_redirect_param' => self::SAFARI_REDIRECT_PARAM,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the current submission exists, and is valid.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function is_valid_submission() {
|
||||
$form_id = filter_input( INPUT_POST, 'gform_submit', FILTER_SANITIZE_NUMBER_INT );
|
||||
|
||||
if ( empty( $form_id ) || ! class_exists( '\GFFormDisplay' ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$entry_id = rgars( \GFFormDisplay::$submission, $form_id . '/lead/id' );
|
||||
|
||||
if ( empty( $entry_id ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
\GFCommon::log_debug( __METHOD__ . sprintf( '(): form #%d. entry #%d.', $form_id, $entry_id ) );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirect to a $_GET request if we detect a dupe submission from Safari.
|
||||
*/
|
||||
public function maybe_handle_safari_redirect() {
|
||||
if ( rgget( self::SAFARI_REDIRECT_PARAM ) != '1' || ! $this->is_enabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the submission URL from the $_SERVER, and strip out our redirect param.
|
||||
$submission_url = filter_input( INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_URL );
|
||||
$base_url = esc_url( remove_query_arg( self::SAFARI_REDIRECT_PARAM, $submission_url ) );
|
||||
|
||||
// Redirect to the form's page URL as a GET request.
|
||||
wp_safe_redirect( $base_url, 303 );
|
||||
exit;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
/**
|
||||
* Service Provider for Duplicate Submission Service
|
||||
*
|
||||
* @package Gravity_Forms\Gravity_Forms\Duplicate_Submissions
|
||||
*/
|
||||
|
||||
namespace Gravity_Forms\Gravity_Forms\Duplicate_Submissions;
|
||||
|
||||
use Gravity_Forms\Gravity_Forms\GF_Service_Container;
|
||||
use Gravity_Forms\Gravity_Forms\GF_Service_Provider;
|
||||
use Gravity_Forms\Gravity_Forms\Util\GF_Util_Service_Provider;
|
||||
|
||||
/**
|
||||
* Class GF_License_Service_Provider
|
||||
*
|
||||
* Service provider for the Duplicate Submission Service.
|
||||
*/
|
||||
class GF_Duplicate_Submissions_Service_Provider extends GF_Service_Provider {
|
||||
|
||||
const GF_DUPLICATE_SUBMISSION_HANDLER = 'gf_duplicate_submission_handler';
|
||||
|
||||
/**
|
||||
* Includes all related files and adds all containers.
|
||||
*
|
||||
* @param GF_Service_Container $container Container singleton object.
|
||||
*/
|
||||
public function register( GF_Service_Container $container ) {
|
||||
\GFForms::include_gravity_api();
|
||||
|
||||
require_once plugin_dir_path( __FILE__ ) . 'class-gf-duplicate-submissions-handler.php';
|
||||
|
||||
$container->add(
|
||||
self::GF_DUPLICATE_SUBMISSION_HANDLER,
|
||||
function () {
|
||||
return new GF_Duplicate_Submissions_Handler( \GFCommon::get_base_url() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes service.
|
||||
*
|
||||
* @param GF_Service_Container $container Service Container.
|
||||
*/
|
||||
public function init( GF_Service_Container $container ) {
|
||||
parent::init( $container );
|
||||
|
||||
$duplicate_submission_handler = $container->get( self::GF_DUPLICATE_SUBMISSION_HANDLER );
|
||||
|
||||
add_action( 'gform_enqueue_scripts', array( $duplicate_submission_handler, 'maybe_enqueue_scripts' ) );
|
||||
add_action( 'wp_loaded', array( $duplicate_submission_handler, 'maybe_handle_safari_redirect' ), 8, 0 );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user