Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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.

share|improve this question
add comment

2 Answers

up vote 2 down vote accepted

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');
share|improve this answer
add comment

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;
    }
}
share|improve this answer
    
Thank you for you paged form answer, this did work however in the end I went for the non paged form solution which I added as an answer. Many thanks –  Joshc Feb 1 '13 at 0:28
add comment

protected by Community Mar 3 at 15:36

Thank you for your interest in this question. Because it has attracted low-quality answers, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.