2013-04-15 30 views
1

enter image description hereYii鍵值表

我有一個只有兩列鍵值的表。我想創建一個允許用戶插入3對鍵值設置的表單。

我需要將3種不同的模型傳遞給視圖嗎?或者有什麼可能的方式來做到這一點?

回答

3

退房此鏈接: http://www.yiiframework.com/doc/guide/1.1/en/form.table

這被認爲是最好的形式Yii中更新創建多個模型。

實質上,爲了創建,您可以創建一個for循環,生成您希望可見的許多輸入,並在您的控制器中循環輸入以創建新模型。

查看文件:

for ($settings as $i=>$setting) //Settings would be an array of Models (new or otherwise) 
{ 
    echo CHtml::activeLabelEx($setting, "[$i]key"); 
    echo CHtml::activeLabelEx($setting, "[$i]key"); 
    echo CHtml::error($setting, "[$i]key"); 

    echo CHtml::activeTextField($setting, "[$i]value"); 
    echo CHtml::activeTextField($setting, "[$i]value"); 
    echo CHtml::error($setting, "[$i]value"); 
} 

控制器actionCreate:

$settings = array(new Setting, new Setting, new Setting); 
if (isset($_POST['Settings'])) 
    foreach ($settings as $i=>$setting) 
     if (isset($_POST['Setttings'][$i])) 
     { 
      $setting->attributes = $_POST['Settings'][$i]; 
      $setting->save(); 
     } 
//Render View 

要更新現有的模型,你可以用同樣的方法,但不是創造新的模型,你可以加載基於模型$ _POST ['Settings']數組中的鍵。

要回答關於將3個模型傳遞給視圖的問題,可以在不傳遞它們的情況下完成,但要驗證數據並將正確的錯誤消息發送到視圖,您應該將放入數組的三個模型傳遞給在數組中查看。

注:上面的示例應該工作原樣,但不提供任何驗證,該模型是有效的,或者他們正確保存

2

我要給你擡起頭,讓你知道這可能會讓你的生活變得非常複雜。我目前使用類似這樣的鍵值,並在這裏的EAV圖案表

對事物的名單,你會發現很難或不可能:

  • 使用CDbCriteria mergeWith()過濾的「價值相關的元素「S在搜索的情況下,()(或其它)
  • 過濾CGridViewCListView

如果這只是很簡單的鍵值沒有相關實體ASPEC T(我猜這是因爲它看起來像設置),然後做這將是一個辦法:

  • 創建一個普通的「設置」 CActiveRecord爲您設置表(你會使用這個條目保存到您的設置表)
  • 通過擴展CFormModel來創建表單模型,並將其用作表單中的$模型。
  • 將Save()方法添加到Form模型中,該模型將使用「設置」模型單獨插入鍵值對。優選地,使用鍵值對中的事務不會傳遞設置 - >驗證()(如果適用)
  • (可選地,如果用戶想要編輯,您可能希望覆蓋表單模型的getAttributes()以返回db數據一個條目。

我希望這已經夠清楚了。 讓我給你一些基本的代碼設置。請注意,我還沒有測試過這個。它應該給你一個粗略的想法:雖然

設置型號:

class Setting extends CActiveRecord 
{ 
    public function tableName() 
    { 
     return 'settings'; 
    } 
} 

SettingsForm型號:

class SettingsForm extends CFormModel 
{ 
    /** 
    * Load attributes from DB 
    */ 
    public function loadAttributes() 
    { 
     $settings = Setting::model()->findAll(); 
     $this->setAttributes(CHtml::listData($settings,'key','value')); 
    } 

    /* 
    * Save to database 
    */ 
    public function save() 
    { 
     foreach($this->attributes as $key => $value) 
     { 
     $setting = Setting::model()->find(array('condition'=>'key = :key', 
               'params'=>array(':key'=>$key))); 
     if($setting==null) 
     { 
      $setting = new Setting; 
      $setting->key = $key; 
     } 
     $setting->value = $value; 
     if(!$setting->save(false)) 
      return false; 
     } 
     return true; 
    } 
} 

控制器:

public function actionSettingsForm() 
{ 
    $model = new Setting; 
    $model->loadAttributes(); 

    if(isset($_POST['SettingsForm'])) 
    { 
     $model->attributes = $_POST['SettingsForm']; 
     if($model->validate() && $model->save()) 
     { 
     //success code here, with redirect etc.. 
     } 
    } 
    $this->render('form',array('model'=>$model)); 
} 

表單視圖:

$form=$this->beginWidget('CActiveForm', array(
     'id'=>'SettingsForm')); 

//all your form element here + submit 
//(you could loop on model attributes but lets set it up static for now) 
//ex: 
echo $form->textField($model,'fieldName'); //fieldName = db key 

$this->endWidget($form); 

如果你想在一個點(代碼等)進一步澄清讓我知道。

PS:爲子孫後代,如果其他人想知道這件事,他們EAV可以檢查EAV behavior extention或選擇更合適的DB系統,如MongoDb(也有少數的一些推廣在那裏)或HyperDex