Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save scyt/e35da99bd8ac530025301f065ed8352a to your computer and use it in GitHub Desktop.
Save scyt/e35da99bd8ac530025301f065ed8352a to your computer and use it in GitHub Desktop.
Gravity Wiz // Gravity Forms // Product Count
<?php
/**
* Gravity Wiz // Gravity Forms // Product Count
*
* Get the total number of products selected. Particularly useful in combination with the GP Conditional Pricing
* perk to create pricing rules based on product count.
*
* @version 1.0
* @author David Smith <david@gravitywiz.com>
* @license GPL-2.0+
* @link http://gravitywiz.com/...
* @copyright 2014 Gravity Wiz
*/
class GW_Product_Count {
private static $script_output;
function __construct( $args ) {
$this->_args = wp_parse_args( $args, array(
'form_id' => false,
'count_field_id' => false,
'products' => false
) );
// support providing 'products' as single integer or array of integers
if( $this->_args['products'] && ! is_array( $this->_args['products'] ) )
$this->_args['products'] = array( $this->_args['products'] );
add_filter( 'gform_pre_render', array( $this, 'maybe_output_script' ) );
add_action( 'gform_register_init_scripts', array( $this, 'add_init_script' ) );
add_action( 'gform_pre_validation', array( $this, 'override_submitted_value') );
}
function maybe_output_script( $form ) {
if( $this->is_applicable_form( $form['id'] ) && ! self::$script_output )
$this->output_script();
return $form;
}
function output_script() {
?>
<script type="text/javascript">
( function( $ ) {
window.GWProductCount = 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() {
console.log( 'init' );
gform.addFilter( 'gform_product_total', function( price, formId ) {
self.updateProductCount( formId, self.products, self.countFieldId );
return price;
} )
}
self.updateProductCount = function( formId, productIds, countFieldId ) {
var countField = $( '#input_' + formId + '_' + countFieldId ),
count = 0,
quantity = 0;
for( var i = 0; i < productIds.length; i++ ) {
var qty = gformGetProductQuantity( formId, productIds[i] ),
price = gformCalculateProductPrice( formId, productIds[i] );
// temp hack: if no price, assume no product is selected, otherwise a quantity of "1" will be returned for radio button products
// even though no product is selected
if( ! price )
continue;
quantity += qty;
if( qty > 0 )
count += 1;
}
if( parseInt( countField.val() ) != parseInt ( count ) ) {
countField.val( count ).change();
}
}
self.init();
}
} )( jQuery );
</script>
<?php
self::$script_output = true;
}
function add_init_script( $form ) {
if( ! $this->is_applicable_form( $form['id'] ) )
return;
$products = $this->_args['products'];
if( ! $products ) {
$product_fields = GFCommon::get_product_fields_by_type( $form, array( 'product' ), false );
$products = wp_list_pluck( $product_fields, 'id' );
}
$args = array(
'formId' => $this->_args['form_id'],
'countFieldId' => $this->_args['count_field_id'],
'products' => $products
);
$script = 'new GWProductCount( ' . json_encode( $args ) . ' );';
$slug = implode( '_', array( 'gw_product_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;
}
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;
}
}
new GW_Product_Count( array(
'form_id' => 503,
'count_field_id' => 198,
'products' => array( 162, 163 )
) );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment