gform_pre_render

gform_pre_render

DescriptionUsageParametersExamples1. Populate Choices2. Populate Choices – Checkboxes3. Populate Field With Values From Earlier Page4. Configure Conditional Logic5. Populate coupon fieldPlacementSource Code

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: For obvious reasons, this filter can』t run when the page where your form is embedded is cached. This is not a Gravity Forms limitation but a consequence of using caching.

Usage
The following would apply to all forms.
1add_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)
1add_filter( 'gform_pre_render_6', 'your_function_name' );

Parameters

$form Form Object
The current form to be filtered.

$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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546add_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 enabledadd_filter( 'gform_pre_submission_filter', 'populate_choices' );function populate_choices( $form ) {     //only populating drop down for form id 5    if ( $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
12345678910111213141516171819202122232425262728293031323334353637383940//NOTE: update the '221' to the ID of your formadd_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 ) {     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.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677add_filter( 'gform_pre_render_81', 'populate_html' );function populate_html( $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:

    ";    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 .= '

  • ' .$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 .= "
  • ";                } 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 .= '

  • ' . $field->label . ': ' . $uploaded_name . "
  • ";                        }                    } 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 .= '

  • ' . $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 .= '
  • ';                        }                        else {                            $html_content .= '

  • ' . $field->label . ': ' . $field_data . '
  • ';                        }                    }                }            }        }        $html_content .= '

';        //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.
12345678910111213141516171819202122add_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 ( $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.
1234567891011121314151617181920212223242526add_filter( 'gform_pre_render_160', function ( $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

發表回覆

您的郵箱地址不會被公開。 必填項已用 * 標註