populated cascading dropdown-lists for Contact Form 7 in wordpress

74 Views Asked by At

hey guys I hope you are doing well. I used to use this code that I copied from a website, and it worked without any problems. but suddenly it won't work anymore. I don't know why, can anyone help? PS: I don't have that much experience in PHP :)

The code has 4 parts:

first: Server-side script (PHP). Add this code to functions.php I added this function at the bottom of my theme’s functions.php file:

<?php
function ajax_cf7_populate_values() {

        // read the CSV file in the $makes_models_years array

    $makes_models_years = array();
    $uploads_folder = wp_upload_dir()['basedir'];
    $file = fopen($uploads_folder.'/make_model_year.csv', 'r');

    $firstline = true;
    while (($line = fgetcsv($file)) !== FALSE) {
        if ($firstline) {
            $firstline = false;
            continue;
        }
        $makes_models_years[$line[0]][$line[1]][] = $line[2];

    }
    fclose($file);

        // setup the initial array that will be returned to the the client side script as a JSON object.

    $return_array = array(
            'makes' => array_keys($makes_models_years),
            'models' => array(),
            'years' => array(),
            'current_make' => false,
            'current_model' => false
        );

        // collect the posted values from the submitted form

    $make = key_exists('make', $_POST) ? $_POST['make'] : false;
    $model = key_exists('model', $_POST) ? $_POST['model'] : false;
    $year = key_exists('year', $_POST) ? $_POST['year'] : false;

        // populate the $return_array with the necessary values

    if ($make) {
        $return_array['current_make'] = $make;
        $return_array['models'] = array_keys($makes_models_years[$make]);
        if ($model) {
        $return_array['current_model'] = $model;
        $return_array['years'] = $makes_models_years[$make][$model];
        if ($year) {
                $return_array['current_year'] = $year;
            }
            }
        }

        // encode the $return_array as a JSON object and echo it
        
        echo json_encode($return_array);
        wp_die();

}

// These action hooks are needed to tell WordPress that the cf7_populate_values() function needs to be called
// if a script is POSTing the action : 'cf7_populate_values'

add_action( 'wp_ajax_cf7_populate_values', 'ajax_cf7_populate_values' );
add_action( 'wp_ajax_nopriv_cf7_populate_values', 'ajax_cf7_populate_values' );

second: Client side script (JavaScript). Add this to footer.php I add this code to footer.php, right before the tag.

<script>
    (function($) {

        // create references to the 3 dropdown fields for later use.

        var $makes_dd = $('[name="makes"]');
        var $models_dd = $('[name="models"]');
        var $years_dd = $('[name="years"]');


        // run the populate_fields function, and additionally run it every time a value changes

        populate_fields();
        $('select').change(function() {
            populate_fields();
        });

        function populate_fields() {

            var data = {

                // action needs to match the action hook part after wp_ajax_nopriv_ and wp_ajax_ in the server side script.

                'action' : 'cf7_populate_values', 

                // pass all the currently selected values to the server side script.

                'make' : $makes_dd.val(),
                'model' : $models_dd.val(),
                'year' : $years_dd.val()
            };

            // call the server side script, and on completion, update all dropdown lists with the received values.

            $.post('/wp-admin/admin-ajax.php', data, function(response) {
                all_values = response;

                $makes_dd.html('').append($('<option>').text(' -- choose make -- '));
                $models_dd.html('').append($('<option>').text(' -- choose model  -- '));
                $years_dd.html('').append($('<option>').text(' -- choose year -- '));

                $.each(all_values.makes, function() {
                    $option = $("<option>").text(this).val(this);
                    if (all_values.current_make == this) {
                        $option.attr('selected','selected');
                    }
                    $makes_dd.append($option);
                });
                $.each(all_values.models, function() {
                    $option = $("<option>").text(this).val(this);
                    if (all_values.current_model == this) {
                        $option.attr('selected','selected');
                    }
                    $models_dd.append($option);
                });
                $.each(all_values.years, function() {
                    $option = $("<option>").text(this).val(this);
                    if (all_values.current_year == this) {
                        $option.attr('selected','selected');
                    }
                    $years_dd.append($option);
                });
            },'json');
        }

    })( jQuery );
</script>

third: I put the csv file in the uploads folder with this path ( public_html/wp-content/uploads) with name (make_model_year.csv) and the file like this image

enter image description here

four: I make the form in the contact 7 plugin. like this

[select makes]
[select models]
[select years]

I tried a lot of things including:

  • changing the name of the CSV file
  • deleting the plugin and installing it again
  • deleting the code and putting it back

but none of this worked.

0

There are 0 best solutions below