使用ajax和PHP过滤下拉菜单

时间:2011-01-20 16:58:43

标签: php ajax codeigniter jquery

我有一个CodeIgniter MVC应用程序。

我有一个名为city的模型,它有一个方法:

<?php
class Cities_model extends Model{    

function Cities_model(){
    parent::Model();
}

function get_cities($id = null){
    $this->db->select('id, city_name');

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

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

    $cities = array();

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

控制器:

function Post(){
    $this->load->helper('form');
    $this->load->model('cities_model');
    $this->load->model('country_model');
    $this->load->model('field_model');

    $data['cities'] = $this->cities_model->get_cities();//optional $id parameter 
    $data['countries'] = $this->country_model->get_countries();

    $data['fields'] = $this->field_model->get_fields(); //subject field

    $this->load->view('post_view',$data);
}

此方法用于填充下拉列表的内容。我有一个类似的国家模型,也有下拉列表。

您可以看到get_cities方法设置为接受country_id。如果选择了国家/地区,则会用于过滤结果。

我的问题是我需要帮助使用Ajax(最好是jQuery)调用此方法。我是ajax的新手,之前从未做过这样的事情。

最值得赞赏的任何帮助!

比利

更新

我添加了jquery库并在我的控制器中创建了方法:

function get_cities($country){
    header('Content-Type: application/x-json; charset=utf-8');
    echo(json_encode(array($this->cities_model->get_cities($country))));
}

这是我的观点中的javascript:

<script type="text/javascript">

  $(document).ready(function(){

  $('#country').change(function(){
    var country_id = $('#country').val();  // here we are taking country id of the selected one.
    $.ajax({
     type: "POST",
     url: "<?php echo base_url(); ?>home/get_cities/"+country_id,
     data: ({country : country_id}),
     success: function(cities){
       $.each(cities,function(i,city)
       {
          var opt = $('<option />');
          opt.val(city.value);
          opt.text(city.text);
          $('#cities').append(opt);
       });
    }

  });

  });
  });

这是json的回复:

[{"2":"Accra"}]

因此它成功地重新获得了正确的数据。唯一的问题是它在下拉列表中添加空白值/文本。每次我更改城市时都会添加数据,所以我想我必须先清除下拉列表?

2 个答案:

答案 0 :(得分:1)

你可以通过jquery -

这样做

假设您将“国家/地区”作为国家/地区选择的ID -

然后在改变国家时,您可以按照以下方式将其带入特定城市 -

$(document).ready(function(){

  $('#country').change(function(){
    var country_id = $('#country').val();  // here we are taking country id of the selected one.
    $.ajax({
     type: "POST",
     url: "the url you want to call",
     data: ({id : country_id}),
     success: function(cities){
     //populate the options of your cities dropdown here.
     }
  });

  });

});

您可以在此处参考详细文档 -

JQuery

Ajax API

Ajax

答案 1 :(得分:1)

扩展Alpesh的回答:

你应该有一个控制器的功能,它返回按国家过滤的城市:

/controller/get_cities/<country>

我假设您的控制器函数将返回一个json对象,您可以通过执行以下操作来获取它:

function get_cities($country)
{
   header('Content-Type: application/x-json; charset=utf-8');
   echo(json_encode(array($this->cities_model->get_cities($country))));
}

然后在视图上你将有2个选择框:

  1. 一个满满的白宫
  2. 一个空的,并通过ajax
  3. 填补城市

    现在,你必须写一些像Alpesh那样的东西,以便重新选择所选国家的城市;网址将是

    url: '/controller/get_cities/'+country_id
    

    虽然成功函数类似于

    success: function(cities)
    {
       $('#cities').empty();
       $.each(cities,function(i,city)
       {
          var opt = $('<option />');
          opt.val(city.value);
          opt.text(city.text);
          $('#cities').append(opt);
       });
    }
    

    <强>更新 在你的ajax成功函数中,你正在处理一个json对象,事实上你正在这样做:

    opt.val(city.value);
    opt.text(city.text);
    

    其中city是json对象,value和text是其属性。

    当你通过php生成json时,你必须尊重你在jquery中使用的内容,所以你的模型应该返回一个这样的数组:

    array
    (
       array("value"=>"2","text"=>"Accra"),
       array("value"=>"3","text"=>"Kumasi"),
       ....
    );
    

    该数组的json_encode应该可以工作。也许你不需要将模型调用包装成一个数组,但我不确定如何返回数组

    echo(json_encode(array($this->cities_model->get_cities($country))));
    

    echo(json_encode($this->cities_model->get_cities($country)));