Last active
July 27, 2020 20:07
-
-
Save spivurno/3708793 to your computer and use it in GitHub Desktop.
Gravity Wiz // Set Number of List Field Rows by Field Value
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 | |
/** | |
* Gravity Wiz // Gravity Forms // Set Number of List Field Rows by Field Value | |
* | |
* Add/remove list field rows automatically based on the value entered in the specified field. Removes the add/remove | |
* that normally buttons next to List field rows. | |
* | |
* @version 1.3 | |
* @author David Smith <[email protected]> | |
* @license GPL-2.0+ | |
* @link http://gravitywiz.com/2012/06/03/set-number-of-list-field-rows-by-field-value/ | |
*/ | |
class GWAutoListFieldRows { | |
private static $_is_script_output; | |
public function __construct( $args = array() ) { | |
// set our default arguments, parse against the provided arguments, and store for use throughout the class | |
$this->_args = wp_parse_args( $args, array( | |
'form_id' => false, | |
'input_html_id' => false, | |
'list_field_id' => false | |
) ); | |
// do version check in the init to make sure if GF is going to be loaded, it is already loaded | |
add_action( 'init', array( $this, 'init' ) ); | |
} | |
public function init() { | |
// make sure we're running the required minimum version of Gravity Forms | |
if( ! property_exists( 'GFCommon', 'version' ) || ! version_compare( GFCommon::$version, '1.8', '>=' ) ) { | |
return; | |
} | |
// time for hooks | |
add_filter( 'gform_pre_render', array( $this, 'load_form_script' ), 10, 2 ); | |
add_filter( 'gform_register_init_scripts', array( $this, 'add_init_script' ), 10, 2 ); | |
} | |
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; | |
} | |
public function output_script() { | |
?> | |
<script type="text/javascript"> | |
window.gwalfr; | |
(function($){ | |
gwalfr = function( args ) { | |
this.formId = args.formId, | |
this.listFieldId = args.listFieldId, | |
this.inputHtmlId = args.inputHtmlId; | |
this.init = function() { | |
var gwalfr = this, | |
triggerInput = $( this.inputHtmlId ); | |
// update rows on page load | |
this.updateListItems( triggerInput, this.listFieldId, this.formId ); | |
// update rows when field value changes | |
triggerInput.change(function(){ | |
gwalfr.updateListItems( $(this), gwalfr.listFieldId, gwalfr.formId ); | |
}); | |
} | |
this.updateListItems = function( elem, listFieldId, formId ) { | |
var listField = $( '#field_' + formId + '_' + listFieldId ), | |
count = parseInt( elem.val() ); | |
rowCount = listField.find( 'table.gfield_list tbody tr' ).length, | |
diff = count - rowCount; | |
if( diff > 0 ) { | |
for( var i = 0; i < diff; i++ ) { | |
listField.find( '.add_list_item:last' ).click(); | |
} | |
} else { | |
// make sure we never delete all rows | |
if( rowCount + diff == 0 ) | |
diff++; | |
for( var i = diff; i < 0; i++ ) { | |
listField.find( '.delete_list_item:last' ).click(); | |
} | |
} | |
} | |
this.init(); | |
} | |
})(jQuery); | |
</script> | |
<?php | |
} | |
public function add_init_script( $form ) { | |
if( ! $this->is_applicable_form( $form ) ) { | |
return; | |
} | |
$args = array( | |
'formId' => $this->_args['form_id'], | |
'listFieldId' => $this->_args['list_field_id'], | |
'inputHtmlId' => $this->_args['input_html_id'] | |
); | |
$script = "new gwalfr(" . json_encode( $args ) . ");"; | |
$key = implode( '_', $args ); | |
GFFormDisplay::add_init_script( $form['id'], 'gwalfr_' . $key , GFFormDisplay::ON_PAGE_RENDER, $script ); | |
} | |
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']; | |
} | |
} | |
// EXAMPLE #1: Number field for the "input_html_id" | |
new GWAutoListFieldRows( array( | |
'form_id' => 240, | |
'list_field_id' => 3, | |
'input_html_id' => '#input_240_4' | |
) ); | |
// EXAMPLE #2: Single Product Field's Quantity input as the "input_html_id" | |
new GWAutoListFieldRows( array( | |
'form_id' => 240, | |
'list_field_id' => 6, | |
'input_html_id' => '#ginput_quantity_240_5' | |
) ); |
Updated to use a class format for easier instantiation and also as part of adding support for configuring for multiple forms and multiple fields on the same form more easily.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Made the jQuery selector which selects the list field rows more specific to the list field table. Was causing issues when users included a table in their field description.