Skip to content

Instantly share code, notes, and snippets.

@spivurno
Last active April 20, 2024 21:21
Show Gist options
  • Save spivurno/a14ef4a18f57d0c67811e1b4d8791781 to your computer and use it in GitHub Desktop.
Save spivurno/a14ef4a18f57d0c67811e1b4d8791781 to your computer and use it in GitHub Desktop.
Gravity Wiz // Gravity Forms // Checkbox Count
<?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 <david@gravitywiz.com>
* @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
) );
@lavalldesign
Copy link

lavalldesign commented Apr 16, 2020

@spivurno. FANTASTIC!!!!!!!!

@Amir-Tayabali
Copy link

Amazing thank you so much for sharing this

@spivurno
Copy link
Author

Our pleasure, @Amir-Tayabali!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment