- 
      
 - 
        
Save spivurno/7029518 to your computer and use it in GitHub Desktop.  
| <?php | |
| /** | |
| * Gravity Wiz // Gravity Forms // Map Submitted Field Values to Another Field | |
| * | |
| * Usage | |
| * | |
| * 1 - Enable "Allow field to be populated dynamically" option on field which should be populated. | |
| * 2 - In the "Parameter Name" input, enter the merge tag (or merge tags) of the field whose value whould be populated into this field. | |
| * | |
| * Basic Fields | |
| * | |
| * To map a single input field (and most other non-multi-choice fields) enter: {Field Label:1}. It is useful to note that | |
| * you do not actually need the field label portion of any merge tag. {:1} would work as well. Change the "1" to the ID of your field. | |
| * | |
| * Multi-input Fields (i.e. Name, Address, etc) | |
| * | |
| * To map the first and last name of a Name field to a single field, follow the steps above and enter {First Name:1.3} {Last Name:1.6}. | |
| * In this example it is assumed that the name field ID is "1". The input IDs for the first and last name of this field will always be "3" and "6". | |
| * | |
| * # Uses | |
| * | |
| * - use merge tags as post tags | |
| * - aggregate list of checked checkboxes | |
| * - map multiple conditional fields to a single field so you can refer to the single field for the selected value | |
| * | |
| * @version 1.1 | |
| * @author David Smith <[email protected]> | |
| * @license GPL-2.0+ | |
| * @link http://gravitywiz.com/... | |
| * @copyright 2014 Gravity Wiz | |
| */ | |
| class GWMapFieldToField { | |
| public $lead = null; | |
| function __construct( ) { | |
| add_filter( 'gform_pre_validation', array( $this, 'map_field_to_field' ), 11 ); | |
| } | |
| function map_field_to_field( $form ) { | |
| foreach( $form['fields'] as $field ) { | |
| if( is_array( $field['inputs'] ) ) { | |
| $inputs = $field['inputs']; | |
| } else { | |
| $inputs = array( | |
| array( | |
| 'id' => $field['id'], | |
| 'name' => $field['inputName'] | |
| ) | |
| ); | |
| } | |
| foreach( $inputs as $input ) { | |
| $value = rgar( $input, 'name' ); | |
| if( ! $value ) | |
| continue; | |
| $post_key = 'input_' . str_replace( '.', '_', $input['id'] ); | |
| $current_value = rgpost( $post_key ); | |
| preg_match_all( '/{[^{]*?:(\d+(\.\d+)?)(:(.*?))?}/mi', $input['name'], $matches, PREG_SET_ORDER ); | |
| // if there is no merge tag in inputName - OR - if there is already a value populated for this field, don't overwrite | |
| if( empty( $matches ) ) | |
| continue; | |
| $entry = $this->get_lead( $form ); | |
| foreach( $matches as $match ) { | |
| list( $tag, $field_id, $input_id, $filters, $filter ) = array_pad( $match, 5, 0 ); | |
| $force = $filter === 'force'; | |
| $tag_field = RGFormsModel::get_field( $form, $field_id ); | |
| // only process replacement if there is no value OR if force filter is provided | |
| $process_replacement = ! $current_value || $force; | |
| if( $process_replacement && ! RGFormsModel::is_field_hidden( $form, $tag_field, array() ) ) { | |
| $field_value = GFCommon::replace_variables( $tag, $form, $entry ); | |
| if( is_array( $field_value ) ) { | |
| $field_value = implode( ',', array_filter( $field_value ) ); | |
| } | |
| } else { | |
| $field_value = ''; | |
| } | |
| $value = trim( str_replace( $match[0], $field_value, $value ) ); | |
| } | |
| if( $value ) { | |
| $_POST[$post_key] = $value; | |
| } | |
| } | |
| } | |
| return $form; | |
| } | |
| function get_lead( $form ) { | |
| if( ! $this->lead ) | |
| $this->lead = GFFormsModel::create_lead( $form ); | |
| return $this->lead; | |
| } | |
| } | |
| new GWMapFieldToField(); | 
@spivurno I cannot get this to work. I've copied your code to the end of my functions.php file and placed {:7.1} into the field 96.1 parameter name (allowed to be populated dynamically) which I want to populate with the content entered into field 7.1. When testing the form and I enter content into field 7.1, nothing appears after tabbing into field 96.1. Am I overlooking something? This is a simple text (address) field. When I look in the developers console (Firefox), I can see an event triggering with both a change and keyup function, each showing: function(e) {
gf_raw_input_change(e, this)
}
@madriverweb The value will only be populated on submission. If you need the value to be populated live, on change/keyup, check out Gravity Forms Copy Cat.
I am looking to add some fixed prefix and followed by a substring of another field.
Is this possible?
If Yes, how?
Thanks in advance
Hi, if I update the source field on Admin side the target field is not updated accordingly. How can I maintain the values in sync when I update from Admin area? Many thanks