spivurno
5/15/2014 - 3:10 AM

Gravity Wiz // Gravity Forms // Checkbox Count

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
) );