联动下拉菜单 [ 新手入门 ]
经常你的表单可能需要两个下拉菜单,一个下拉菜单的内容依赖于另一个下拉菜单的值。使用yii内置的ajax 呢可以实现这样的功能。下面的例子讲解了如何使用 首先是视图的表单,我们将在视图中显示国家,根据国家的值显示城市列表。
echo CHtml::dropDownList('country_id','', array(1=>'USA',2=>'France',3=>'Japan'),
array(
'ajax' => array(
'type'=>'POST', //request type
'url'=>'dynamiccities', //url to call
'update'=>'#city_id', //selector to update
//'data'=>'js:javascript statement'
//leave out the data key to pass all form values through
)));
//empty since it will be filled by the other dropdown
echo CHtml::dropDownList('city_id','', array());
第一个下拉菜单由几个value/name对组成。当值改变的时候会产生一个到当前控制器的dynamiccities动作的请求。请求返回的结果(dynamiccities动作的输出)会更新id为#city_id的第二个下拉菜单,
然后是控制器动作,它输出的html会被填充到第二个下拉菜单,而且它是要根据第一个下拉菜单的值产生。
public function actionDynamiccities()
{
$data=Location::model()->findAll('parent_id=:parent_id',
array(':parent_id'=>(int) $_POST['country_id']));
$data=CHtml::listData($data,'id','name');
foreach($data as $value=>$name)
{
echo CHtml::tag('option',
array('value'=>$value),CHtml::encode($name),true);
}
}
它读取了parent_id等于第一个下拉菜单值的,所有城市列表。然后使用tag进行输出,最终会显示在第二个下拉菜单里面。
或许你很想知道$_POST['country_id']怎么读取的,这很简单,当ajax数组里的data为空( when the 'data' key of the ajax array in the first dropdown is empty),下拉菜单所在表单的所有元素的值会被填充上,然后经由ajax请求传递到控制器. 如果您使用Firebug中你自己可以检查一下。
这个行为可以被改变。因为ajax的配置数组中默认的data的值为 js:jQuery(this).parents("form").serialize(). 前面的'js:'提示Yii后面跟的javascript声明,不必执行。所以,如果你把'data'改为其他的数据。The same applies to the 'success' parameter.(This behaviour can also be changed. By default the value of the 'data' key in the ajax configuration array is js:jQuery(this).parents("form").serialize(). The preceding js: indicates to Yii that a javascript statement will follow and thus should not be escaped. So, if you change the 'data' key to something else preceded by 'js:' you can fill in your own statement. The same applies to the 'success' parameter.)
以上是在论坛上看到的一个贴子,可能有些高手看过,在此仅为那些没看过的朋友转贴!~ 另有附加的实例,可以帮助研究!~
共 35 条回复
-
lz19881123 回复于 2011-07-31 23:13 举报
学习下,回帖,再下载!
-
无限级联动,可以在控制器回调JS,在视图写对应的JS方法。欢迎拍砖。!!
控制器:if(isset($data[0]['id'])) { echo "<script>regionSelected('{$data[0]['id']}')</script>"; }
视图:
function regionSelected(sourceId, url = 'region/region', id = 'region_id') { url = '<?php echo Yii::app()->createUrl(url)?>'; jQuery.ajax({'type':'POST','url':url, 'cache':false,'data':'city_id='+sourceId,'success':function(html){jQuery("#"+region_id).html(html)}}); return false; }
-
278893912qq 回复于 2011-11-10 13:30 举报
又回来了
-
wanyun_liu 回复于 2011-11-19 17:59 举报
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
-
menghuangxiao 回复于 2012-09-05 20:39 举报
怎么例子执行出错
lostAngel 上海
最后登录:2018-12-10
在线时长:0小时47分
- 粉丝4
- 金钱1125
- 威望0
- 积分1125