gravity forms : use previous dropdown choice as variable in gform_pre_render?

I have a question regarding gform_pre_render?

I have dealer form. Which basically you choose your county, and then your dealer.

Dropdown A = Dealer Country
Dropdown B = Dealer Name

I have about 15 countries, and I am using get_terms in the gform_pre_render function to list all my countries that I have assigned to a dealer post…

// Dropdown A - Dealer Country
add_filter("gform_pre_render", "dropdown_dealer_country");
add_filter("gform_admin_pre_render", "dropdown_dealer_country");
function dropdown_dealer_country($form){

    if($form["id"] != 3)
       return $form;

    $terms = get_terms("dealer-country");

    $items = array();
    $items[] = array( "text" => __('Select country...','mission-theme'), "value" => 0 );

    foreach($terms as $term)
        $items[] = array( "text" => $term->name, "value" => $term->slug );

    foreach($form["fields"] as &$field)
        if($field["id"] == 6){
            $field["choices"] = $items;
        }

    return $form;
}

OK so the above function works perfectly in Dropdown A.

Now what I am trying to do in Dropdown B is display all my dealer names.

I have named each dealer custom post-type title with the name of the dealer, and this is what I am pre populating my secondary drop down with…

// Dropdown B - Dealer Name
add_filter("gform_pre_render", "dropdown_dealer_name");
add_filter("gform_admin_pre_render", "dropdown_dealer_name");
function dropdown_dealer_name($form){

    if($form["id"] != 3)
       return $form;

    $dealers = get_posts(array(
        "post_type" => "dealer",
        "dealer-country" => $dealerCounty,
        "post_status" => "publish",
        "orderby" => "title",
        "order" => "ASC",
        "posts_per_page"  => -1
    ));

    $items = array();
    $items[] = array( "text" => __('Select dealer...','mission-theme'), "value" => 0 );

    foreach($dealers as $dealer)
        $items[] = array( "text" => $dealer->post_title, "value" => $dealer->post_name );

    foreach($form["fields"] as &$field)
        if($field["id"] == 7){
            $field["choices"] = $items;
        }

    return $form;
}

…and as you can see in line 11, I have a variable in my get_posts array “dealer-country” => $dealerCounty

My question, is it some how posible to get the choice that is made in Dropdown A into my $dealerCounty variable in my Dropdown B function?

Any tips or help would be much appreciated as my Dropdown B is currently very long, and I need to filter it down by country.

If any one knows a method that would be great. Thanks in advance.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Eventually the solution I used was this. Upon change of Dropdown A I have an ajax function request tha re-populated Downdown B with the filtered options based on the selection in Dropdown A.

See the ajax jquery script…

countryFilter = function () {

    var countryClass = '.dealer-country select',
        dealerClass  = '.dealer-name select';

    $(countryClass).change(function(){

        var countrySelect = $(this),
            country = countrySelect.val(),
            dealerSelect = countrySelect.parents('form').find(dealerClass);

        if(country != "default") {

            $.ajax({
                type: 'POST',
                url: '<?php echo admin_url('admin-ajax.php'); ?>',
                data: { dealerCountry : country, action: 'get_dealer_name' },
                success: function(data){
                    dealerSelect.empty();
                    var options = $.parseJSON(data);
                    for(i=0;i<options.length;i++){
                        dealerSelect.append('<option value="'+options[i].value+'">'+options[i].text+'</option>');
                    }
                    dealerSelect.removeAttr('disabled');
                }
            });

        }

    });

}

Which I fired using…

$(document).ready(function () { 

    countryFilter();

});

$(document).bind('gform_post_render', function(event, form_id){

    if(form_id == 3) {

        countryFilter();

    }

});

I then trimed my original functions to…

    // Dropdown A - Dealer Country
add_filter("gform_pre_render", "dropdown_dealer_country");
add_filter("gform_admin_pre_render", "dropdown_dealer_country");
function dropdown_dealer_country($form){
        if($form["id"] != 3)
           return $form;
        $terms = get_terms("dealer-country");
        $items = array();
        $items[] = array( "text" => __('Select country...','theme'), "value" => 'default' );
        foreach($terms as $term)
            $items[] = array( "text" => $term->name, "value" => $term->slug );
        foreach($form["fields"] as &$field){
            if($field["id"] == 6 ){
                $field["cssClass"] = 'dealer-country';
                $field["choices"] = $items;
            }  
        }
        return $form;  
    }

    // Dropdown B - Dealer Name
add_filter("gform_pre_render", "dropdown_dealer_name");
add_filter("gform_admin_pre_render", "dropdown_dealer_name");
function dropdown_dealer_name($form){
        if($form["id"] != 3)
           return $form;
        $items = array();
        $items[] = array( "text" => __('Select dealer...','theme'), "value" => 'default' );
        foreach($form["fields"] as &$field){
            if($field["id"] == 7){
                $field["cssClass"] = 'dealer-name';
                $field["choices"] = $items;
            }
        }
        return $form; 
    }

Then the finishing touch is the function which also goes in the functions.php – this is called by the ajax request…

function get_dealer_name_fn(){
    $dealerCountry = $_POST['dealerCountry'];
    $dealers = get_posts(array(
        "post_type" => "dealer",
        "dealer-country" => $dealerCountry,
        "post_status" => "publish",
        "orderby" => "title",
        "order" => "ASC",
        "posts_per_page"  => -1
    ));
    $items = array();
    $items[] = array( "text" => __('Select dealer...','theme'), "value" => 'default' );
    foreach($dealers as $dealer){
        $items[] = array( "text" => $dealer->post_title, "value" => $dealer->post_title );
    }
    echo json_encode($items);
    die;
}
add_action('wp_ajax_get_dealer_name', 'get_dealer_name_fn');
add_action('wp_ajax_nopriv_get_dealer_name', 'get_dealer_name_fn');

Method 2

The easy way, and one that should with or without AJAX or JavaScript, is to have the dealer county drop-down on one page and the dealers on the next page. Then you can put this into your function:

foreach ($form['fields'] as $field) {
    if ($field['id'] == 6) {
        // found dealer county, get value and exit loop
        $dealerCounty = rgpost('input_' . $field['id']);
        break;
    }
}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x