1

ここに画像の説明を入力

列のキー値が 2 つしかないテーブルがあります。ユーザーが 3 組のキーと値の設定を挿入できるフォームを作成したいと考えています。

ビューに 3 つの異なるモデルを渡す必要がありますか? または、これを行う方法はありますか?

4

2 に答える 2

2

私はあなたに頭を上げて、これであなたの人生を非常に複雑にする可能性があることを知らせます.

私は現在、EAVこのキー値に似たパターン化されたテーブルを使用しています。これは、困難または不可能と思われるもののリストです。

  • CDbCriteriasearch() (またはその他) のイベントで「値」の関連要素をフィルタリングするには、mergeWith() を使用します。
  • フィルタリングCGridViewまたはCListView

これが関連するエンティティの側面を持たない非常に単純なキー値である場合 (設定のように見えるため、これはそうであると推測しています)、それを行う 1 つの方法は次のようになります。

  • 設定テーブルの通常の「設定」CActiveRecordを作成します (これを使用して設定テーブルにエントリを保存します)
  • 拡張して Form モデルを作成し、CFormModelこれをフォームの $model として使用します。
  • 「設定」モデルを使用してキーと値のペアを個別に挿入するフォーム モデルに save() メソッドを追加します。できれば、キーと値のペアが Settings->validate() を渡さない場合にトランザクションを使用します (該当する場合)
  • オプションで、フォーム モデルをオーバーライドしてgetAttributes()、ユーザーがエントリを編集したい場合にデータベース データを返すようにすることもできます。

それが十分に明確だったことを願っています。基本的なコードのセットアップをいくつか紹介しましょう。私はこれをテストしていないことに注意してください。ただし、大まかなアイデアが得られるはずです。

設定モデル:

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

設定フォーム モデル:

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の動作拡張を確認するか、 MongoDb(いくつかの拡張機能があります)やHyperDexなどのより適切なDBシステムを選択できます

于 2013-04-16T17:27:24.673 に答える