列のキー値が 2 つしかないテーブルがあります。ユーザーが 3 組のキーと値の設定を挿入できるフォームを作成したいと考えています。
ビューに 3 つの異なるモデルを渡す必要がありますか? または、これを行う方法はありますか?
列のキー値が 2 つしかないテーブルがあります。ユーザーが 3 組のキーと値の設定を挿入できるフォームを作成したいと考えています。
ビューに 3 つの異なるモデルを渡す必要がありますか? または、これを行う方法はありますか?
私はあなたに頭を上げて、これであなたの人生を非常に複雑にする可能性があることを知らせます.
私は現在、EAV
このキー値に似たパターン化されたテーブルを使用しています。これは、困難または不可能と思われるもののリストです。
CDbCriteria
search() (またはその他) のイベントで「値」の関連要素をフィルタリングするには、mergeWith() を使用します。CGridView
またはCListView
これが関連するエンティティの側面を持たない非常に単純なキー値である場合 (設定のように見えるため、これはそうであると推測しています)、それを行う 1 つの方法は次のようになります。
CActiveRecord
を作成します (これを使用して設定テーブルにエントリを保存します)CFormModel
これをフォームの $model として使用します。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システムを選択できます