Last active
April 20, 2024 21:21
-
-
Save spivurno/a14ef4a18f57d0c67811e1b4d8791781 to your computer and use it in GitHub Desktop.
Gravity Wiz // Gravity Forms // Checkbox Count
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* -------------------------------------------------------------------------- | |
* IMPORTANT! | |
* This snippet has been superceded by the Choice Counter snippet. | |
* https://gist.github.com/spivurno/00af5ee7e21dd5d6903fbae6fecd85ce | |
* -------------------------------------------------------------------------- | |
* | |
* Gravity Wiz // Gravity Forms // Checkbox Count | |
* | |
* Get the total number of checkboxes checked. Useful when wanting to apply conditional logic based on the number of | |
* checkboxes checked. | |
* | |
* @version 2.5 | |
* @author David Smith <[email protected]> | |
* @license GPL-2.0+ | |
* @link http://gravitywiz.com/... | |
* @copyright 2018 Gravity Wiz | |
*/ | |
class GW_Checkbox_Count { | |
private static $is_script_output; | |
function __construct( $args ) { | |
$this->_args = wp_parse_args( $args, array( | |
'form_id' => false, | |
'count_field_id' => false, | |
'checkbox_field_id' => null, | |
'checkbox_field_ids' => false | |
) ); | |
if( isset( $this->_args['checkbox_field_id'] ) ) { | |
$this->_args['checkbox_field_ids'] = array( $this->_args['checkbox_field_id'] ); | |
} | |
add_filter( 'gform_pre_render', array( $this, 'load_form_script' ), 10, 2 ); | |
add_action( 'gform_register_init_scripts', array( $this, 'add_init_script' ) ); | |
//add_action( 'gform_pre_validation', array( $this, 'override_submitted_value') ); | |
} | |
public function load_form_script( $form, $is_ajax_enabled ) { | |
if( $this->is_applicable_form( $form ) && ! has_action( 'wp_footer', array( $this, 'output_script' ) ) ) { | |
add_action( 'wp_footer', array( $this, 'output_script' ) ); | |
add_action( 'gform_preview_footer', array( $this, 'output_script' ) ); | |
} | |
return $form; | |
} | |
function output_script() { | |
?> | |
<script type="text/javascript"> | |
( function( $ ) { | |
window.GWCheckboxCount = function( args ) { | |
var self = this; | |
// copy all args to current object: formId, fieldId | |
for( prop in args ) { | |
if( args.hasOwnProperty( prop ) ) | |
self[prop] = args[prop]; | |
} | |
self.init = function() { | |
for( var i = 0; i < self.checkboxFieldIds.length; i++ ) { | |
var checkboxFieldId = self.checkboxFieldIds[ i ], | |
checkboxField = $( '#input_' + self.formId + '_' + checkboxFieldId ); | |
checkboxField.find( 'input[type="checkbox"]' ).click( function() { | |
self.updateCheckboxCount( self.formId, self.checkboxFieldIds, self.countFieldId ); | |
} ); | |
} | |
self.updateCheckboxCount( self.formId, self.checkboxFieldIds, self.countFieldId ); | |
}; | |
self.updateCheckboxCount = function( formId, checkboxFieldIds, countFieldId ) { | |
var countField = $( '#input_' + formId + '_' + countFieldId ), | |
count = 0; | |
for( var i = 0; i < checkboxFieldIds.length; i++ ) { | |
var checkboxField = $( '#input_' + formId + '_' + checkboxFieldIds[ i ] ); | |
count += checkboxField.find( 'input[type="checkbox"]' ).filter(':checked').not(' #choice_' + checkboxFieldIds[ i ] + '_select_all').length; | |
} | |
if( parseInt( countField.val() ) != parseInt( count ) ) { | |
countField.val( count ).change(); | |
} | |
}; | |
self.init(); | |
} | |
} )( jQuery ); | |
</script> | |
<?php | |
self::$is_script_output = true; | |
} | |
function add_init_script( $form ) { | |
if( ! $this->is_applicable_form( $form['id'] ) ) | |
return; | |
$args = array( | |
'formId' => $this->_args['form_id'], | |
'countFieldId' => $this->_args['count_field_id'], | |
'checkboxFieldIds' => $this->_args['checkbox_field_ids'] | |
); | |
$script = 'new GWCheckboxCount( ' . json_encode( $args ) . ' );'; | |
$slug = implode( '_', array( 'gw_checkbox_count', $this->_args['form_id'], $this->_args['count_field_id'] ) ); | |
GFFormDisplay::add_init_script( $this->_args['form_id'], $slug, GFFormDisplay::ON_PAGE_RENDER, $script ); | |
return; | |
} | |
function override_submitted_value( $form ) { | |
//$_POST["input_{$this->count_field_id}"] = $day_count; | |
return $form; | |
} | |
public function is_applicable_form( $form ) { | |
$form_id = isset( $form['id'] ) ? $form['id'] : $form; | |
return empty( $this->_args['form_id'] ) || $form_id == $this->_args['form_id']; | |
} | |
public function is_ajax_submission( $form_id, $is_ajax_enabled ) { | |
return isset( GFFormDisplay::$submission[ $form_id ] ) && $is_ajax_enabled; | |
} | |
} | |
# Configuration | |
new GW_Checkbox_Count( array( | |
'form_id' => 123, // the ID of your form | |
'count_field_id' => 2, // any Number field on your form in which the number of checked checkboxes should be dynamically populated; you can configure conditional logic based on the value of this field. | |
'checkbox_field_ids' => array( 5, 8 ) // any array of Checkbox field IDs which should be counted | |
) ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@spivurno. FANTASTIC!!!!!!!!