-
-
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(); |
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
@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
@bkellaway (or others who have the same question)
Answer lies in the docs for merge tags here. Just use the following syntax:
{Field Name:Field ID:value}
For example:
{Choice:7:value}