【转】Yii在表单中建立关联下拉列表dropdown
生活随笔
收集整理的這篇文章主要介紹了
【转】Yii在表单中建立关联下拉列表dropdown
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)自:
??? 應用中經(jīng)常遇到需要在表單form中使用兩個關聯(lián)的下拉列表dropdown。其中一個下拉列表中的數(shù)據(jù)依賴于另一個下拉列表的當前值。例如填寫地 址,當 我們修改’國家’下拉列表的值,’城市’列表中的項目就會全部更新為該國的城市。通過Yii內(nèi)建的AJAX功能可以比較容易的實現(xiàn)關聯(lián)下拉列表的功能。下 面簡要介紹實現(xiàn)過程。
首先,在表單的view文件中,我們需要在表單中顯示國家和依賴于國家的城市兩個下拉列表。 echo CHtml::dropDownList('country_id','', array(1=>'USA',2=>'France',3=>'Japan'),array('ajax' => array('type'=>'POST', //url請求類型'url'=>CController::createUrl('currentController/dynamiccities'), //要調(diào)用的url.//Style: CController::createUrl('currentController/methodToCall')'update'=>'#city_id', //ajax請求要更新的目的元素,這里是城市下拉列表//'data'=>'js:javascript statement'//這里不設置data,默認將傳遞當前表單form中的所有元素數(shù)據(jù))));//此處數(shù)據(jù)為空,因需要根據(jù)其他下拉列表的值來更新 echo CHtml::dropDownList('city_id','', array());??? 簡單起見,在這里第一個’國家’的下拉列表由一系列 鍵值/文本 數(shù)組構(gòu)成,當然我們也可以簡單修改,使其從數(shù)據(jù)庫中讀取,并使用CHtml::listData處理成這種key/value數(shù)組。
在上面的表單中,一旦它的值發(fā)生變化,都會觸發(fā)一個ajax請求,發(fā)送給當前控制器controller的 ‘dynamiccities’動作。請求的結(jié)果( ‘dynamiccities’動作的輸出)將被更新到第二個下拉列表的值(id是city_id)。 接下來,要修改控制器controller代碼,添加’dynamiccities’的動作響應,輸出將用來填充‘城市’下拉列表的html。在這里,他需要根據(jù)請求的國家代碼country_id輸出相應的城市列表: 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);} } 這里Location是用來儲存城市信 息的AR模型,關聯(lián)的國家代碼字段為parent_id。CHtml::listData將搜索到的數(shù)據(jù)對象(object)轉(zhuǎn)換為 [key]:value形式的數(shù)組,key為屬性id的值,value為屬性name的值。然后,以tag的形式逐一輸出,供第二個下拉列表(城市 dropdown)更新數(shù)據(jù)。 你可能會奇怪_POST['country_id']參數(shù)是哪里來的?其實,當ajax參數(shù)數(shù)組中‘data’內(nèi)容為空時(請查看第一個國家列表的ajax設置),ajax會將下拉列表所在表單的所有元素值都通過ajax請求傳遞給控制器。 想修改也可以。默認情況下,ajax參數(shù)數(shù)組中的’data’設置為 js:jQuery(this).parents(“form”).serialize() 。前綴js告訴Yii:接下來將是一個javascript語句。所以,如果你想要改變’data’參數(shù)的值,你可以加入自己的javascript語 句,并使用js:開頭。上述方法對于’success’參數(shù)也適用。 還需要修改控制器的規(guī)則,給新添加的動作分配適當?shù)臋嘞?。例如我們可以? array('allow', // allow authenticated user to perform 'create' and 'update' actions'actions'=>array('create','update'),'users'=>array('@'),),修改為
array('allow', // allow authenticated user to perform 'create' and 'update' actions'actions'=>array('create','update','dynamiccities'),'users'=>array('@'),), 小貼士:出于測試目的我們還可以在filters方法中注釋掉下面這句: 'accessControl', // perform access control for CRUD operations 這將禁用所有的訪問權限控制。測試完成后,別忘了啟用它。?
轉(zhuǎn)載于:https://www.cnblogs.com/fzzl/archive/2012/12/26/2834665.html
總結(jié)
以上是生活随笔為你收集整理的【转】Yii在表单中建立关联下拉列表dropdown的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不弹出范围超界提示
- 下一篇: 房子想找装修公司装修,南宁有哪家比较好的