2012-09-17 63 views
2

我遇到以下情況:自動完成與Yii的其他字段CJuiAutoComplete

表單中包含郵政編碼字段和城市字段。

我想在郵政編碼字段上自動填充,因此當用戶鍵入實例1000時,自動填充值將顯示「1000 - 布魯塞爾」。當選擇此值時,1000將被填入郵政編碼字段中,而布魯塞爾將被填入城市字段中。

郵編,城市和關聯信息會從MySQL數據庫:

我已經自動完成只用postalcodes工作,但對如何實現所描述的效果不知道(=填充第二場)。

當前表單代碼:

<div class="row"> 
     <?php echo $form->labelEx($model,'PostalCode'); ?> 
     <?php //echo $form->textField($model,'PostalCode',array('size'=>10,'maxlength'=>50)); 

       $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
       'name'=>'PostalCode', 
       'value'=>$model->PostalCode, 
      //'source'=>$people, // <- use this for pre-set array of values 
       'source'=>$this->createUrl('BeCity/GetBelgianPostalCodes'),// <- path to controller which returns dynamic data 
       // additional javascript options for the autocomplete plugin 
       'options'=>array(
         'minLength'=>'1', // min chars to start search 
         'showAnim'=>'fold' 
       ), 
       )); 

       ?> 
     <?php echo $form->error($model,'PostalCode'); ?> 
    </div> 

電流控制器動作代碼:

public function actionGetBelgianPostalCodes() 
     {      
      $res =array(); 

      if (isset($_GET['term'])) { 
        // http://www.yiiframework.com/doc/guide/database.dao 
        $qtxt ="SELECT 
          DISTINCT 
          bc.PostalCode as PostalCode, 
          bc.NameNL as CityName, 
          CONCAT(bc.PostalCode, ' - ', bc.NameNL) as FullCityName 
          FROM be_city bc 
          WHERE bc.PostalCode LIKE :qterm 
          ORDER BY bc.PostalCode, bc.NameNL ASC"; 
        $command =Yii::app()->db->createCommand($qtxt); 
        $command->bindValue(":qterm", $_GET['term'].'%', PDO::PARAM_STR); 
        $res =$command->queryColumn(); 
      } 

      echo CJSON::encode($res); 
      Yii::app()->end(); 
     } 

不知道,如果控制器動作是完全正確的,在$命令 - > queryAll()似乎不工作,所以我使用queryColumn()來代替,但它只返回第一列?

任何提示?

另外,還有一個問題,我希望控制器動作的鏈接是動態的。如果在之前的國家/地區下拉選擇比利時,則應該調用「BeCity/GetBelgianPostalCodes」。如果是法國,應該是'FrCity/GetFrenchPostalCodes'。這是可能的,以及如何?

感謝

+0

我們可以看到您的CJuiAutoComplete小部件的代碼嗎? – Stu

+0

添加了附加代碼。對不起,我昨天晚上發佈了原始問題,但我有點匆忙,所以它是「快速和骯髒」:-)希望現在更清楚 – tjeuten

回答

2

設置阿賈克斯選擇選項如下:

$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
    'name'=>'PostalCode', 
    'source'=>$this->createUrl('/site/getpostalcode'), 
    // additional options for the autocomplete plugin 
    'options'=>array(
     'minLength'=>'4', 
     'select'=>"js:function(event, ui) { 
        $('#PostalCode').val(ui.item.postalcode); 
        $('#CityName').val(ui.item.cityname); 
        }", 
    ), 
    'htmlOptions'=>array(
     'style'=>'width: 200px;', 
     'placeholder' => 'Postal Code' 
    ), 
)); 
+0

這使我的'選擇'選項的方式,並最終找到它, 謝謝。有機會回覆我的「附加問題」(請參閱​​更新後的問題)?謝謝 – tjeuten

3

在這裏,我找到了辦法(我調整您的應用程序,所以我希望沒有錯字...)我也改變了名稱小部件被myPostCode最好將可能繼續被Yii給出的默認名稱:

<?php 
     $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
     'name'=>'myPostCode', 
     'value'=>$model->PostalCode, 
     'source'=>$this->createUrl('BeCity/GetBelgianPostalCodes'), 
     'options'=>array(
       'minLength'=>'1', // min chars to start search 
       'showAnim'=>'fold' 
       //focus option will tell what is displayed in field during the selection 
       'focus'=> 'js:function(event, ui) { 
        $("#myPostCode").val(ui.item.postalcode); 
        return false; 
       }', 
       //select function will tell where go each field 
       'select'=>'js:function(event, ui) { 
        $("#myPostCode").val(ui.item.postalcode); 
        $("#CityName").val(ui.item.cityname); 
        return false; 
       }' 
     ), 
     )); 

//Here is the code for the display. 
//This code MUST be AFTER the widget 
//It should be possible to include it in the widget but I do not know how. 
// You may change the line "<a>"+item.postalcode... with what you want to display but must keep the a tag." 

    Yii::app()->clientScript->registerScript('input', ' 
     $("#myPostCode").data("autocomplete")._renderItem = function(ul, item) { 
     return $("<li></li>") 
    .data("item.autocomplete", item) 
    .append("<a>"+item.postalcode + " - " + item.cityname+"</a>") 
    .appendTo(ul); 
    };'); 

?> 

你還需要改變你的查詢返回的所有數據的

$res =$command->queryAll();