Прочтите CSV в WordPress и передайте значения в [выбрать] - PullRequest
0 голосов
/ 10 июля 2020

Источник: https://bdwm.be/how-to-create-dynamically-populated-cascading-dropdown-lists-for-contact-form-7/

Один крутой парень поделился своим фрагментом, который позволяет мне создавать динамически заполняемые каскадные выпадающие списки на основе данных из файла .csv. Он отлично работает, но проблема в том, что он читает только первые 3 столбца (A, B, C) ... Я понятия не имею, как добавить еще один раскрывающийся список после "лет", который будет читать значения из 4-го столбца (D). Я предполагаю, что ключом к решению этого решения является строка ниже:

$makes_models_years[$line[0]][$line[1]][] = $line[2];

В основном исходный код делается только для чтения трех столбцов из файла CSV. Я хочу расширить его до 4 или даже 5 столбцов. Пример здесь: bdwm.be/wp-content/uploads/2017/12/make-model-year.png

контактная форма 7 полей

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

нижний колонтитул. php

<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>

функций. php

  <?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' );
?>
...