我有一个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"}]
因此它成功地重新获得了正确的数据。唯一的问题是它在下拉列表中添加空白值/文本。每次我更改城市时都会添加数据,所以我想我必须先清除下拉列表?
答案 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.
}
});
});
});
您可以在此处参考详细文档 -
答案 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个选择框:
现在,你必须写一些像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)));