web-dev-qa-db-fra.com

formes de gravité: utiliser le choix de menu déroulant précédent comme variable dans gform_pre_render?

J'ai une question concernant gform_pre_render ?

J'ai un formulaire de revendeur. En gros, vous choisissez votre comté, puis votre revendeur.

Dropdown A = Pays du concessionnaire
Liste déroulante B = Nom du concessionnaire

J'ai environ 15 pays et j'utilise get_terms dans la fonction gform_pre_render pour répertorier tous les pays que j'ai affectés à un poste de revendeur ...

// 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, donc la fonction ci-dessus fonctionne parfaitement dans Dropdown A.

Maintenant, ce que j'essaie de faire dans Dropdown B, c'est d'afficher tous les noms de mes revendeurs.

J'ai nommé chaque titre personnalisé d'après le type du revendeur avec le nom du revendeur, et c'est ce que je pré-remplis avec mon menu déroulant secondaire avec ...

// 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;
}

... et comme vous pouvez le voir à la ligne 11, j'ai une variable dans mon tableau get_posts "dealer-country" => $ dealerCounty

Ma question est la suivante: est-il possible d’obtenir le choix effectué dans Dropdown A dans ma variable $ dealerCounty dans ma Dropdown B function?

Toute astuce ou aide serait très appréciée car mon Dropdown B est actuellement très long et je dois faire une recherche par pays.


Si quelqu'un connaît une méthode, ce serait génial. Merci d'avance.

4
Joshc

Finalement, la solution que j'ai utilisée était la suivante. Lors du changement de la liste déroulante A, je reçois une demande de fonction ajax qui remplit de nouveau Downdown B avec les options filtrées basées sur la sélection dans la liste déroulante A.

Voir le script ajax jquery ...

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');
                }
            });

        }

    });

}

Ce que j'ai tiré en utilisant ...

$(document).ready(function () { 

    countryFilter();

});

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

    if(form_id == 3) {

        countryFilter();

    }

});

J'ai ensuite coupé mes fonctions d'origine pour ...

    // 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; 
    }

Ensuite, la touche finale est la fonction qui va également dans le fichier functions.php - elle est appelée par la requête ajax ...

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');
6
Joshc

Le moyen le plus simple, et avec ou sans AJAX ou JavaScript, est d’avoir la liste déroulante du comté du revendeur sur une page et celle des concessionnaires à la page suivante. Ensuite, vous pouvez mettre ceci dans votre fonction:

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