-3

codeigniter フレームワークで ajax の助けを借りて、国と都市をドロップダウンさせています。

以下にデータベースの構造を示します。

country_id,country_name

country_id,state_id,state_name

country_id,state_id,city_id,city_name

ユーザーコントローラー

function country(){
 $data['header']='Deal Management';
 $data['page'] = 'admin/page/user-view';
 $data['Country'] = $this->deal->getCountry(); 
 $this->load->view($this->_admin_container,$data);  
}

function get_cities($Country){
  $this->load->model('city_model');
  header('Content-Type: application/x-json; charset=utf-8');
  echo(json_encode($this->cities_model->get_cities($dealCountry)));
}

ユーザー ビュー ビュー

<?php $cities['#'] = 'Please Select'; ?>

<label for="country">Country: </label><?php echo form_dropdown('country_id', $Country, '#', 'id="country"'); ?><br />

<label for="city">City: </label><?php echo form_dropdown('city_id', $cities, '#', 'id="cities"'); ?><br />

取引モジュール country_model

 function getCountry(){
    $this->db->select("*");
    $query=$this->db->get("deal_country");
    $countries = array();
    if($query->result()){
          foreach ($query->result() as $country) {
              $countries[$country->country_id] = $country->country_name;
          }
        return $countries;
        }else{
        return FALSE;
        }
    }

city_model モジュール

function get_cities($dealCountry = null){
        echo $dealCountry;die;
      $this->db->select('city_id, city_name');

      if($dealCountry != NULL){
          $this->db->where('country_id', $dealCountry);
      }

      $query = $this->db->get('deal_city');

      $cities = array();

      if($query->result()){
          foreach ($query->result() as $city) {
              $cities[$city->id] = $city->city_name;
          }
      return $cities;
      }else{
          return FALSE;
      }
}

ヘッダー ファイルに ajax スクリプトを含めます。

<script type="text/javascript">// <![CDATA[
    $(document).ready(function(){
        $('#country').change(function(){ //any select change on the dropdown with id country trigger this code
        $("#cities > option").remove(); //first of all clear select items
            var country_id = $('#country').val();  // here we are taking country id of the selected one.
            $.ajax({
                type: "POST",
                url: "home/get_cities/"+country_id, //here we are calling our user controller and get_cities method with the country_id

                success: function(cities) //we're calling the response json array 'cities'
                {
                    $.each(cities,function(city_id,city) //here we're doing a foeach loop round each city with id as the key and city as the value
                    {
                        var opt = $('<option />'); // here we're creating a new select option with for each city
                        opt.val(id);
                        opt.text(city);
                        $('#cities').append(opt); //here we will append these new select options to a dropdown with the id 'cities'
                    });
                }

            });

        });
    });
    // ]]>
</script>

コードを作成した後、機能しません。

どんな助けでも大歓迎です!

ありがとう

4

3 に答える 3

0

JavaScript 変数を作成する

var base_url = "<?=base_url()?>";

あなたのJavaScriptコードでconecat

url: base_url+"home/get_cities/"+country_id, 

firefox と firebug を使用して ajax コードをデバッグする

于 2012-09-01T11:13:33.470 に答える
0

コメントで述べたように、FirebugまたはChrome 開発ツール(ネットワーク タブ) を使用して問題を特定できます。

コントローラ:

<?php
class ctrl extends ci_controller{
    function index(){ //I just used this one to test out if its outputing anything
        $names = ['apple','ball','cat','dog'];
        echo json_encode($names);
    }

    function load_view(){ 
        $this->load->view('ctrl_view');
    }
}
?>

意見:

<script src="/tester/ci/js/jquery172.js"></script>
<input type="text" list="names" id="name" autocomplete="off"/>
<datalist id="names">
</datalist>

<script>
$.post('ctrl/', function(data){ //you can just call out your controller here
    var parsed_data = JSON.parse(data);

    //its a good practice to use a document fragment to append new elements to and not append a    new element on every iteration of the loop in an existing element in the dom
    var fragment = document.createDocumentFragment();

    for(var x in parsed_data){
        var val = parsed_data[x];
        var option = $("<option>").val(val).text(val);
        fragment.appendChild(option[0]); 
    }

    $('#names').append(fragment); //append the whole fragment outside the loop
});
</script>

実際の問題が何であるかはよくわかりませんので、質問を編集して、firebugに表示されるエラーを貼り付けてください。

于 2012-09-01T11:35:49.327 に答える
0
function get_cities($Country){
  $this->load->model('city_model');
  header('Content-Type: application/x-json; charset=utf-8');
  echo(json_encode($this->cities_model->get_cities($dealCountry)));
}

この関数では、間違った変数名$dealCountryを入れています。

于 2013-08-28T22:00:18.960 に答える