我正在使用Yii MongoDbSuite。 我需要为密码重复验证创建表单字段,该字段不应出现在MongoDB中。 由于我使用的是yii表单,我想在视图中添加的所有字段都应该在我的模型中声明为public。但我的模型扩展了MongoDocument,因此save()之后所有被删除的公共字段都出现在MongoDb中。我如何声明字段,它将出现在模型中,但不会出现在Mongo中。
答案 0 :(得分:0)
在CActiveRecord模型中,您可以添加不是数据库列的属性。它将被视为与其他数据库支持的属性几乎相同。
public $new_password;
public $new_password_confirm;
...
return array(
array('E_NAME, E_EMAIL, new_password, new_password_confirm', 'required'),
array('new_password', 'compare', 'compareAttribute'=>'new_password_confirm'),
...
<div class="row">
<?php echo $form->labelEx($model, 'new_password'); ?>
<?php echo $form->passwordField($model, 'new_password'); ?>
<?php echo $form->error($model,'new_password'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model, 'new_password_confirm'); ?>
<?php echo $form->passwordField($model, 'new_password_confirm'); ?>
<?php echo $form->error($model,'new_password_confirm'); ?>
</div>
CFormModel模型也是一个没有数据库支持属性的模型。
答案 1 :(得分:0)
不幸的是,由于YiiMongoDBSuite的工作方式,Nikos的回答不会完全奏效。
YiiMongoDBSuite通过将所有公共属性反映到数据库属性中,以一种奇怪的方式保存以适应MongoDB的无模式设计。
启动(在update
函数中)调用toArray
:https://github.com/canni/YiiMongoDbSuite/blob/master/EMongoDocument.php#L593,然后在_toArrray
中完成并将所有公共属性设置为数据库属性:https://github.com/canni/YiiMongoDbSuite/blob/master/EMongoEmbeddedDocument.php#L304
您可以做的是在模型中设置一些受保护的属性。这应该使他们不去数据库并保存,即
class MyAwesomeModel{
public $somedbvar;
protected $somenotdbvar;
}
然后,您可以像Nikos所示的那样使用该受保护的属性。
答案 2 :(得分:0)
为了改进@Sammaye的答案,它是正确的,YMDS确实从类变量中分配属性。
虽然这不是问题所在。这里的问题是懒惰的编码。
关于如何解决问题的示例
用户模型(基于诉讼的例子)
class User extends EMongoDocument
{
public $username;
public $email;
public $password;
public function getCollectionName()
{
return 'users';
}
public function rules() {
return array(
array('username, email, password', 'required'),
);
}
public function attributeLabels()
{
return array(
'username' => 'UserName',
'email' => 'Email',
'password' => 'Password',
);
}
public static function model($className = __CLASS__)
{
return parent::model($className);
}
public function getForm()
{
$form = new UserForm();
$form->userid = $this->primaryKey();
return $form;
}
}
表单模型:
<?php
class UserForm extends CFormModel
{
public $userid; //something to refer back to your User model on save, you might need this as a hidden field
public $username;
public $email;
public $password;
public $password_again;
public function rules()
{
return array(
array('username, email, password, password_again', 'required'),
array('password', 'compare', 'compareAttribute'=>'password_again', 'strict'=>true),
);
}
public function attributeLabels()
{
return array(
'password_again'=>'Re-type Password',
);
}
public function save()
{
if($this->validate())
{
$user = User::findByPk($this->userid);
$user->username = $this->username;
$user->email = $this->email;
$user->password = hash('sha512',$this->password);
if($user->save())
{
//do stuff
}
}
}
}
在视图中:
<?php
$model = $model->form;
$form = $this->beginWidget('CActiveForm', array(
'id'=>'user-form',
'enableAjaxValidation'=>true,
'enableClientValidation'=>true,
'focus'=>array($model,'firstName'),
));
当然,这只是一个如何解决问题而不会在问题
之后遇到问题的示例(一种懒惰的方式,可以工作顺便说一下,只是声明一个属性不安全,永远不会永远不会保存)