Заполнение поля выбора с помощью JQUERY, AJAX и PHP

Я поставил вопрос раньше и не имел большой удачи, я надеюсь очистить содержимое второго раскрывающегося списка и повторно заполнить раскрывающийся список, в зависимости от значения, которое находится в первом выпадающем списке.

У меня есть следующие поля выбора, как показано ниже:

   <select name = "car" id="Cars" onchange="myFunction(this)">
            <option value="0">Toyota</option>
            <option value="1">Audi</option>
            <option value="2">Suzuki</option>
   </select>

Под этим раскрывающимся списком у меня также есть еще один снимок для моделей:

    <select id="emptyDropdown">
            <option value="0">R8</option>
            <option value="1">Quattro</option>
            <option value="2">A6 hatchback</option>
    </select>

onchange Я хочу очистить второй выпадающий список и заполнить его моделями, связанными с маркой автомобиля. НАПРИМЕР.

Audi - A8, A6, A4 etc.
Suzuki - Swift, Panda etc.


<script>
  function myFunction(obj)
  {
    $('#emptyDropdown').empty()
    var dropDown = document.getElementById("carId");
    var carId = dropDown.options[dropDown.selectedIndex].value;
    $.ajax({
            type: "POST",
            url: "/project/main/getcars",
            data: { 'carId': carId  },
            success: function(msg){
                ?????????
            }
        });
  }
</script>

Затем я имею следующую функцию PHP, как показано ниже (я использую codeigniter) - эта функция использует идентификатор автомобиля и возвращает список всех моделей, как показано ниже:

public function getCars(){
        $this->load->model('car_model');

        $this->form_validation->set_rules('carId', 'carId', 'trim|xss_clean');

        if($this->form_validation->run()){
            $carId = $this->input->post('carId');
            $carModels = $this->user_management_model->getCarModels($carId);
        } else {
            echo "error";
        }   
}

Затем я не знаю, как вернуть каждый элемент в массив, созданный на PHP, чтобы заполнить раскрывающийся список с идентификатором = "emptyDropdown". Массив, сгенерированный в PHP, имеет следующую структуру:

Array ( [0] => Array ( [ModelName] => R8 V6 Twin Turbo [ModelID] => 19 ) [1] => Array ( [ModelName] => A6 Hatchback  [ModelID] => 107 ) )

Чтобы прояснить вопрос - как я возьму каждый элемент в массиве и поместил бы это как новый параметр в раскрывающийся список? есть способ вернуть массив в javscript, а затем повторно заселить в методе успеха вызова ajax?

Любая помощь будет высоко оценена, большое спасибо заранее

Ответ 1

Этот ответ содержит необходимые изменения для вашего кода.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Не видя точной установки, имейте в виду, что может быть множество факторов, из-за которых это не работает "как есть" в вашей установке. Я не знаю, как настроены ваши маршруты, или если вы используете Firebug или какую-нибудь другую консоль для просмотра вызовов ajax, но это должно дать вам строительные блоки:

Во-первых, измените ваш php, чтобы вывести массив как строку, кодированную json:

public function getCars(){
        $this->load->model('car_model');

        $this->form_validation->set_rules('carId', 'carId', 'trim|xss_clean');

        if($this->form_validation->run()){
            $carId = $this->input->post('carId');
            $carModels = $this->user_management_model->getCarModels($carId);
            // Add below to output the json for your javascript to pick up.
            echo json_encode($carModels);
            // a die here helps ensure a clean ajax call
            die();
        } else {
            echo "error";
        }   
}

Затем измените свой сценарий ajax-call, чтобы иметь обратный вызов успеха, который получает данные и добавляет его в раскрывающийся список:

function myFunction(obj)
  {
    $('#emptyDropdown').empty()
    var dropDown = document.getElementById("carId");
    var carId = dropDown.options[dropDown.selectedIndex].value;
    $.ajax({
            type: "POST",
            url: "/project/main/getcars",
            data: { 'carId': carId  },
            success: function(data){
                // Parse the returned json data
                var opts = $.parseJSON(data);
                // Use jQuery each to iterate over the opts value
                $.each(opts, function(i, d) {
                    // You will need to alter the below to get the right values from your json object.  Guessing that d.id / d.modelName are columns in your carModels data
                    $('#emptyDropdown').append('<option value="' + d.ModelID + '">' + d.ModelName + '</option>');
                });
            }
        });
  }

Опять же - это строительные блоки. Используйте консоль браузера или инструмент, такой как Firebug, для просмотра запроса AJAX и возвращаемых данных, чтобы вы могли соответствующим образом изменить. Удачи!