2012-11-15 50 views
1

我的項目前任並沒有在表格中保存下拉列表值;他們在html文件中...這個人也沒有使用$form->dropdownList()來創建選擇...yii dropdownList顯示相同的值?

當然,我現在有很大的問題,在編輯時預選值;因此我將所有<select>更改爲$form->dropdownList()

但現在我有一個不同的問題,如

echo $form->dropdownList($model,'location', 
     array("Art","Gallery","Bar","Club")); 

現可生產整數值爲DB ...

我知道我可以設置顯示值,像這樣: 陣列(「藝術「=>」藝術「).... 但我寧願避免 - 有一堆視圖顯示值直接... :(

有沒有辦法告訴yii,數據庫值應與顯示值相同?

回答

0

您可以覆蓋方法CActiveForm部件的dropDownList如下:

<?php 
class ActiveForm extends CActiveForm 
{ 
    public $valuesAsKeys = false; 

    public function dropDownList($model,$attribute,$data,$htmlOptions=array()) 
    { 
     if (!$this->valuesAsKeys) 
      return parent::dropDownList($model, $attribute, $data, $htmlOptions); 

     $newData = array(); 
     foreach ($data as $value) 
      $newData[$value] = $value; 
     return parent::dropDownList($model, $attribute, $newData, $htmlOptions); 
    } 
} 

,然後用它是這樣的:

<?php 
$form = $this->beginWidget("application.components.ActiveForm", array(
    'valuesAsKeys' => true, 
    // other parameters here 
)); 

// Rendering form's elements here 
$this->endWidget(); 
+1

@Harry B的回答更合適。 – Gihan

+0

你是對的! – Ezze

4

如果數組的值是唯一的(Yii的需要獨特的鍵),你可以使用...

$data = array("Art","Gallery","Bar","Club"); 
echo $form->dropdownList($model,'location', array_combine($data, $data)); 

array_combine將使用列表數據的鍵和值都是相同的數據。

0

Harry B的答案很好,謝謝!在我的情況下,我想使用自定義選項值,並且還包含一個提示,因此爲了擴展他的示例,我創建了一個返回一組鍵和值的方法。 keys數組以'prompt'開始,'values'數組以'(select)'開頭,然後我遍歷數據源並將每個鍵添加到keys數組,並將每個值添加到values數組。我的代碼有點複雜,涉及正則表達式,但這裏的基本要點:

 
// Controller method popupRowListValues($source) 
$displayKeys = array('prompt'); 
$displayValues = array('select'); 

foreach ($source as $key=>$value) { 
    $displayKeys[] = $key; 
    $displayValues = $value; 
} 

// View 
$displayList = $this->popupRowListValues($source); 

echo $form->dropDownListRow($model, $column_name, array_combine(
    $displayList['displayKeys'], $displayList['displayValues'] 
));