-
-
Save spivurno/32e914d67723f89717be2904ce6234c4 to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* Gravity Wiz // Gravity Forms // Populate Form with Entry (Optionally Update Entry on Submission) | |
* | |
* Pass an entry ID and populate the form automatically. No form configuration required. Optionally update the entry on | |
* submission. | |
* | |
* @version 1.5 | |
* @author David Smith <david@gravitywiz.com> | |
* @license GPL-2.0+ | |
* @link http://gravitywiz.com/ | |
* @see https://www.screencast.com/t/SdNyfbNyC5C | |
* | |
* Plugin Name: Gravity Forms - Populate Form w/ Entry | |
* Plugin URI: http://gravitywiz.com/ | |
* Description: Pass an entry ID and populate the form automatically. No form configuration required. Optionally update the entry on submission. | |
* Author: Gravity Wiz | |
* Version: 1.4 | |
* Author URI: http://gravitywiz.com | |
*/ | |
class GW_Populate_Form { | |
public function __construct( $args = array() ) { | |
$this->_args = wp_parse_args( $args, array( | |
'form_id' => false, | |
'query_arg' => 'eid', | |
'update' => false, | |
) ); | |
add_action( 'init', array( $this, 'init' ) ); | |
} | |
public function init() { | |
if( ! property_exists( 'GFCommon', 'version' ) || ! version_compare( GFCommon::$version, '1.8', '>=' ) ) { | |
return; | |
} | |
add_filter( 'gform_form_args', array( $this, 'prepare_field_values_for_population' ) ); | |
add_filter( 'gform_entry_id_pre_save_lead', array( $this, 'set_submission_entry_id' ), 10, 2 ); | |
} | |
public function prepare_field_values_for_population( $args ) { | |
if( ! $this->is_applicable_form( $args['form_id'] ) || ! $this->get_entry_id() ) { | |
return $args; | |
} | |
$entry = GFAPI::get_entry( $this->get_entry_id() ); | |
if( is_wp_error( $entry ) ) { | |
return $args; | |
} | |
$args['field_values'] = $this->prepare_entry_for_population( $entry ); | |
add_filter( sprintf( 'gform_pre_render_%d', $args['form_id'] ), array( $this, 'prepare_form_for_population' ) ); | |
return $args; | |
} | |
public function prepare_form_for_population( $form ) { | |
foreach( $form['fields'] as &$field ) { | |
$field['allowsPrepopulate'] = true; | |
if( is_array( $field['inputs'] ) ) { | |
$inputs = $field['inputs']; | |
foreach( $inputs as &$input ) { | |
$input['name'] = (string) $input['id']; | |
} | |
$field['inputs'] = $inputs; | |
} | |
$field['inputName'] = $field['id']; | |
} | |
return $form; | |
} | |
public function prepare_entry_for_population( $entry ) { | |
$form = GFFormsModel::get_form_meta( $entry['form_id'] ); | |
foreach( $form['fields'] as $field ) { | |
if( $field->type == 'post_category' ) { | |
$value = explode( ':', $entry[ $field->id ] ); | |
$entry[ $field->id ] = $value[1]; | |
} | |
switch( GFFormsModel::get_input_type( $field ) ) { | |
case 'checkbox': | |
$values = $this->get_field_values_from_entry( $field, $entry ); | |
if( is_array( $values ) ) { | |
$value = implode( ',', array_filter( $values ) ); | |
} else { | |
$value = $values; | |
} | |
$entry[$field['id']] = $value; | |
break; | |
case 'list': | |
$value = maybe_unserialize( rgar( $entry, $field->id ) ); | |
$list_values = array(); | |
if( is_array( $value ) ) { | |
foreach( $value as $vals ) { | |
if( is_array( $vals ) ) { | |
$vals = implode( '|', array_map( function( $value ) { | |
$value = str_replace( ',', ',', $value ); | |
return $value; | |
}, $vals ) ); | |
} | |
array_push( $list_values, $vals ); | |
} | |
$entry[ $field->id ] = implode( ',', $list_values ); | |
} | |
break; | |
} | |
} | |
return $entry; | |
} | |
public function get_field_values_from_entry( $field, $entry ) { | |
$values = array(); | |
foreach( $entry as $input_id => $value ) { | |
$fid = intval( $input_id ); | |
if( $fid == $field['id'] ) | |
$values[] = $value; | |
} | |
return count( $values ) <= 1 ? $values[0] : $values; | |
} | |
public function set_submission_entry_id( $entry_id, $form ) { | |
if( ! $this->_args['update'] || ! $this->is_applicable_form( $form['id'] ) || ! $this->get_entry_id() ) { | |
return $entry_id; | |
} | |
add_filter( 'gform_use_post_value_for_conditional_logic_save_entry', '__return_true' ); | |
return $this->get_entry_id(); | |
} | |
public function get_entry_id() { | |
return rgget( $this->_args['query_arg'] ); | |
} | |
public function is_applicable_form( $form ) { | |
$form_id = isset( $form['id'] ) ? $form['id'] : $form; | |
return ! $this->_args['form_id'] || $form_id == $this->_args['form_id']; | |
} | |
} | |
# Configuration | |
new GW_Populate_Form( array( | |
'update' => true | |
) ); |
works fine for me, but I don´t manage to get it to work together with the plugin gravity wiz gp limit submissions. Only counts one.
I noticed that this doesn't seem to work with file upload fields...
Could this be modified to automatically update an existing entry, by putting the entry ID into a hidden field?
Your code works perfect but it does not show file uploads when editing gravity form. Can you help? Let me know.
Thanks for this wonderfull script. I only have one question. It loads the data up really nice but it doesnt reload the checkbox answers. Is this something I can fix myself?
@ginodp Possibly something AI could fix for you! This is pretty old code though. If you wanted a supported solution, Easy Passthrough is the ticket.
https://gravitywiz.com/documentation/gravity-forms-easy-passthrough/
I tried this script, but it doesn't seem to save changes I make to radio buttons. I wonder if it's a problem because of the version of Gravity Forms I'm using which is 2.3.1.
UPDATE 6/1/2018:
Thank you to David Smith for version 1.3. It fixed the problem I was having with the radio buttons not updating.