Description
The gform_pre_render filter is executed before the form is displayed and can be used to manipulate the Form Object prior to rendering the form.
This filter should be used in conjunction with the gform_pre_validation, gform_pre_submission_filter, and gform_admin_pre_render filters to update the Form Object to be able to use those values elsewhere (merge tags in the confirmation and notification, for example).
IMPORTANT: The Dynamic Population feature uses PHP to get the value(s) and populate the form field(s). Therefore, it can’t be used in cached pages. This is not a Gravity Forms limitation but a consequence of using caching, which prevents PHP code from running.
Usage
The following would apply to all forms.
add_filter( 'gform_pre_render', 'your_function_name' );
To limit the scope of your function to a specific form, append the form id to the end of the hook name. (format: gform_pre_render_FORMID)
add_filter( 'gform_pre_render_6', 'your_function_name' );
Parameters
- $form array|bool
The form object of the form to be displayed orfalse
to display the form not found message. - $ajax bool
Is AJAX enabled. - $field_values array
An array of dynamic population parameter keys with their corresponding values to be populated.
Examples
1. Populate Choices
This example dynamically populates a drop down, radio button or multi-select field with posts that are in the Business category. Note that for choice-based fields, a choice’s isSelected
property is only used on initial form display. After that, the plugin uses the contents of the $_POST
to determine which choices are selected when the field is redisplayed.
add_filter( 'gform_pre_render', 'populate_choices' );
//Note: when changing choice values, we also need to use the gform_pre_validation so that the new values are available when validating the field.
add_filter( 'gform_pre_validation', 'populate_choices' );
//Note: when changing choice values, we also need to use the gform_admin_pre_render so that the right values are displayed when editing the entry.
add_filter( 'gform_admin_pre_render', 'populate_choices' );
//Note: this will allow for the labels to be used during the submission process in case values are enabled
add_filter( 'gform_pre_submission_filter', 'populate_choices' );
function populate_choices( $form ) {
//only populating drop down for form id 5
if ( rgar( $form, 'id' ) != 5 ) {
return $form;
}
//Reading posts for "Business" category;
$posts = get_posts( 'category=' . get_cat_ID( 'Business' ) );
//Creating item array.
$items = array();
//Add a placeholder to field id 8, is not used with multi-select or radio, will overwrite placeholder set in form editor.
//Replace 8 with your actual field id.
$fields = $form['fields'];
foreach( $form['fields'] as &$field ) {
if ( $field->id == 8 ) {
$field->placeholder = 'This is my placeholder';
}
}
//Adding post titles to the items array
foreach ( $posts as $post ) {
$items[] = array( 'value' => $post->post_title, 'text' => $post->post_title );
}
//Adding items to field id 8. Replace 8 with your actual field id. You can get the field id by looking at the input name in the markup.
foreach ( $form['fields'] as &$field ) {
if ( $field->id == 8 ) {
$field->choices = $items;
}
}
return $form;
}
2. Populate Choices – Checkboxes
The following example dynamically populates a checkbox field with a list of published posts
// NOTE: update the '221' to the ID of your form
add_filter( 'gform_pre_render_221', 'populate_checkbox' );
add_filter( 'gform_pre_validation_221', 'populate_checkbox' );
add_filter( 'gform_pre_submission_filter_221', 'populate_checkbox' );
add_filter( 'gform_admin_pre_render_221', 'populate_checkbox' );
function populate_checkbox( $form ) {
if ( empty( $form['id'] ) ) {
return $form;
}
foreach( $form['fields'] as &$field ) {
//NOTE: replace 3 with your checkbox field id
$field_id = 3;
if ( $field->id != $field_id ) {
continue;
}
// you can add additional parameters here to alter the posts that are retreieved
// more info: http://codex.wordpress.org/Template_Tags/get_posts
$posts = get_posts( 'numberposts=-1&post_status=publish' );
$input_id = 1;
foreach( $posts as $post ) {
//skipping index that are multiples of 10 (multiples of 10 create problems as the input IDs)
if ( $input_id % 10 == 0 ) {
$input_id++;
}
$choices[] = array( 'text' => $post->post_title, 'value' => $post->post_title );
$inputs[] = array( 'label' => $post->post_title, 'id' => "{$field_id}.{$input_id}" );
$input_id++;
}
$field->choices = $choices;
$field->inputs = $inputs;
}
return $form;
}
3. Populate Field With Values From Earlier Page
This example is for a two-page form. The data submitted from the first page is displayed on the second page as a preview. The second page has only one field, an html field that will be populated with the data from the first page.
add_filter( 'gform_pre_render_81', 'populate_html' );
function populate_html( $form ) {
if ( empty( $form['id'] ) ) {
return $form;
}
//this is a 2-page form with the data from page one being displayed in an html field on page 2
$current_page = GFFormDisplay::get_current_page( $form['id'] );
$html_content = "The information you have submitted is as follows:<br/><ul>";
if ( $current_page == 2 ) {
foreach ( $form['fields'] as &$field ) {
//gather form data to save into html field (id 6 on my form), exclude page break
if ( $field->id != 6 && $field->type != 'page' ) {
//see if this is a complex field (will have inputs)
if ( is_array( $field->inputs ) ) {
//this is a complex fieldset (name, adress, etc.) - get individual field info
//get field's label and put individual input information in a comma-delimited list
$html_content .= '<li>' .$field->label . ' - ';
$num_in_array = count( $field->inputs );
$counter = 0;
foreach ( $field->inputs as $input ) {
$counter++;
//get name of individual field, replace period with underscore when pulling from post
$input_name = 'input_' . str_replace( '.', '_', $input['id'] );
$value = rgpost( $input_name );
$html_content .= $input['label'] . ': ' . $value;
if ( $counter < $num_in_array ) {
$html_content .= ', ';
}
}
$html_content .= "</li>";
} else {
//this can be changed to be a switch statement if you need to handle each field type differently
//get the filename of file uploaded or post image uploaded
if ( $field->type == 'fileupload' || $field->type == 'post_image' ) {
$input_name = 'input_' . $field->id;
//before final submission, the image is stored in a temporary directory
//if displaying image in the html, point the img tag to the temporary location
$temp_filename = RGFormsModel::get_temp_filename( $form['id'], $input_name );
$uploaded_name = $temp_filename['uploaded_filename'];
$temp_location = RGFormsModel::get_upload_url( $form['id'] ) . '/tmp/' . $temp_filename['temp_filename'];
if ( !empty( $uploaded_name ) ) {
$html_content .= '<li>' . $field->label . ': ' . $uploaded_name . "<img src='" . $temp_location . "' height='200' width='200'></img></li>";
}
} else {
//get the label and then get the posted data for the field (this works for simple fields only - not the field groups like name and address)
$field_data = rgpost('input_' . $field->id );
if ( is_array( $field_data ) ){
//if data is an array, get individual input info
$html_content .= '<li>' . $field->label . ': ';
$num_in_array = count( $field_data );
$counter = 0;
foreach ( $field_data as $data ) {
$counter++;
$html_content .= print_r( $data, true );
if ( $counter < $num_in_array ) {
$html_content .= ', ';
}
}
$html_content .= '</li>';
}
else {
$html_content .= '<li>' . $field->label . ': ' . $field_data . '</li>';
}
}
}
}
}
$html_content .= '</ul>';
//loop back through form fields to get html field (id 6 on my form) that we are populating with the data gathered above
foreach( $form['fields'] as &$field ) {
//get html field
if ( $field->id == 6 ) {
//set the field content to the html
$field->content = $html_content;
}
}
}
//return altered form so changes are displayed
return $form;
}
4. Configure Conditional Logic
This example dynamically adds conditional logic to a form field (field 2). The conditional logic will display field 2 only if the selection from field id 1 is First Choice. Supported conditional logic operators are:
is
isnot
<
>
contains
starts_with
ends_with
See conditional logic object for additional information.
add_filter( 'gform_pre_render', 'set_conditional_logic' );
add_filter( 'gform_pre_process', 'set_conditional_logic' );
function set_conditional_logic( $form ) {
//Set conditional logic only for form 14
if ( rgar( $form, 'id' ) !== 14 ) {
return $form;
}
foreach ( $form['fields'] as &$field ) {
if ( $field->id == 2 ) {
$field->conditionalLogic =
array(
'actionType' => 'show',
'logicType' => 'all',
'rules' =>
array( array( 'fieldId' => 1, 'operator' => 'is', 'value' => 'First Choice' ) )
);
}
}
return $form;
}
5. Populate coupon field
The following example shows how the coupon field can be pre-populated with one or more coupon codes.
add_filter( 'gform_pre_render_160', function ( $form ) {
if ( empty( $form['id'] ) ) {
return $form;
}
$form_id = $form['id'];
if ( empty( $_POST[ 'is_submit_' . $form_id ] ) && function_exists( 'gf_coupons' ) ) {
// Define a comma separated string of coupon codes to apply.
$coupon_codes = '25OFF';
// Get the specified coupons.
$coupons = gf_coupons()->get_coupons_by_codes( $coupon_codes, $form );
// Initialize the $coupon_details array.
$coupon_details = array();
// Add the coupons to the $coupon_details array.
foreach ( $coupons as $coupon ) {
$coupon_details[ $coupon['code'] ] = $coupon;
}
// Add the coupon codes to the hidden coupon codes input for field 3.
$_POST['input_3'] = $coupon_codes;
// Add the coupon details to the hidden coupon details input for the form.
$_POST[ 'gf_coupons_' . $form_id ] = json_encode( $coupon_details );
}
return $form;
} );
Placement
This code should be placed in the functions.php file of your active theme.
Source Code
This filter is located in GFFormDisplay::get_form() in form_display.php