formas de gravedad: usar la opción desplegable anterior como variable en gform_pre_render? [cerrado]

4

Tengo una pregunta relacionada con gform_pre_render ?

Tengo el formulario de distribuidor. Que básicamente elige su condado, y luego su distribuidor.

Menú desplegable A = País del distribuidor
Dropdown B = Nombre del distribuidor

Tengo alrededor de 15 países, y estoy usando get_terms en la función gform_pre_render para enumerar todos mis países que he asignado a una publicación de distribuidor ...

// 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, así que la función anterior funciona perfectamente en Dropdown A.

Ahora lo que estoy tratando de hacer en Dropdown B es mostrar todos los nombres de mis distribuidores.

He nombrado a cada distribuidor un título de post-tipo personalizado con el nombre del distribuidor, y esto es lo que estoy completando antes de mi menú desplegable secundario con ...

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

... y como puede ver en la línea 11, tengo una variable en mi matriz get_posts "dealer-country" = > $ dealerCounty

Mi pregunta, ¿es posible obtener la opción que se hace en Dropdown A en mi variable $ dealerCounty en mi función Dropdown B ?

Cualquier sugerencia o ayuda sería muy apreciada ya que mi Dropdown B es actualmente muy larga, y necesito filtrarla por país.


Si alguien sabe un método que sería genial. Gracias de antemano.

    
pregunta Joshc 28.01.2013 - 20:54

2 respuestas

6

Finalmente, la solución que utilicé fue esta. Tras el cambio del menú desplegable A, tengo una función ajax que vuelve a completar el downdown B con las opciones filtradas basadas en la selección en el menú desplegable A.

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

        }

    });

}

Que disparé usando ...

$(document).ready(function () { 

    countryFilter();

});

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

    if(form_id == 3) {

        countryFilter();

    }

});

Luego recorté mis funciones originales para ...

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

Luego, el toque final es la función que también se encuentra en functions.php; esto se llama a través de la solicitud 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');
    
respondido por el Joshc 01.02.2013 - 01:26
1

La forma fácil, y una que debería ser con o sin AJAX o JavaScript, es tener el condado desplegado en una página y los distribuidores en la página siguiente. Luego puedes poner esto en tu función:

foreach ($form['fields'] as $field) {
    if ($field['id'] == 6) {
        // found dealer county, get value and exit loop
        $dealerCounty = rgpost('input_' . $field['id']);
        break;
    }
}
    
respondido por el webaware 29.01.2013 - 03:07

Lea otras preguntas en las etiquetas