Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Gravity Wiz // Gravity Forms // Checkbox Count
<?php
/**
* 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.4
* @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').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
) );
@ghost

This comment has been minimized.

Copy link

commented Jan 16, 2018

Unreal. This is exactly what I need right now.

What’s the best way to retrieve the value from this function on my thank you page? At the moment, users are redirected after form submission.

Thanks so much, David!

:)

@Nab59

This comment has been minimized.

Copy link

commented Jan 28, 2018

Hello,
I was looking for this function since 1 week, so i am very happy :-)

Can you tell me how to use it please ?
Regards

@UnionDesign

This comment has been minimized.

Copy link

commented Feb 9, 2018

This saved my live. Thank you. Really needs to make it into the core. The conditional logic options in GF are really limited.

@cassihl

This comment has been minimized.

Copy link

commented May 3, 2018

I added the code and changed the IDs in the configuration section, I get these errors:

Uncaught ReferenceError: GWCheckboxCount is not defined
at HTMLDocument. ((index):642)
at HTMLDocument.dispatch (jquery.js?ver=1.12.4:3)
at HTMLDocument.r.handle (jquery.js?ver=1.12.4:3)
at Object.trigger (jquery.js?ver=1.12.4:3)
at Object.a.event.trigger (jquery-migrate.min.js?ver=1.4.1:2)
at HTMLDocument. (jquery.js?ver=1.12.4:3)
at Function.each (jquery.js?ver=1.12.4:2)
at a.fn.init.each (jquery.js?ver=1.12.4:2)
at a.fn.init.trigger (jquery.js?ver=1.12.4:3)
at HTMLDocument. ((index):642)

Can you help me figure out why?

Thanks!

@adamthomson

This comment has been minimized.

Copy link

commented May 23, 2018

This was the perfect solution after weeks of pulling my hair out. Thanks so much.

@jandreaucodes

This comment has been minimized.

Copy link

commented Aug 28, 2018

Is there any solution if you’re using the “Select All” option?

If you use that, you’ll have an extra checkbox counted.

For example, if I have 5 checkboxes and someone checks the Select All checkbox, the count is actually 6. The 5 checkboxes, plus the Select All one.

@ryeradio

This comment has been minimized.

Copy link

commented Oct 8, 2018

I have this added to my functions file, but what do I do after that? Should there be an added function/field to get this to work in the gravity forms? Do I add a number field and some sort of a count function?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.