0

我正在使用 Yii MongoDbSuite。我需要为密码重复验证创建表单字段,它不应该出现在 MongoDB 中。因为我使用的是 yii 表单,所以我想在视图中添加的所有字段都应该在我的模型中声明为 public。但是我的模型扩展了 MongoDocument,所以 save() 之后所有清除的公共字段都出现在 MongoDb 中。我如何声明字段,它会出现在模型中,但不会出现在 Mongo 中。

4

3 回答 3

0

不幸的是,由于 YiiMongoDBSuite 的工作方式,Nikos 的回答不会完全奏效。

YiiMongoDBSuite 通过将所有公共属性反映到数据库属性中,以一种奇怪的方式保存以适应 MongoDB 的无模式设计。

它开始(在update函数中)调用toArrayhttps ://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 所展示的那样使用该受保护的财产。

于 2012-11-27T09:26:21.590 回答
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 模型是没有数据库支持属性的模型。

于 2012-11-27T09:01:36.667 回答
0

为了改进@Sammaye 的答案,它是正确的,YMDS 确实从类变量中分配属性。

虽然这不是这里的问题。imo这里的问题是惰性编码。

我将如何解决问题的示例

用户模型(基于西装的例子)

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'),
)); 

当然,这只是一个示例,说明如何解决您的问题而不会遇到一个又一个问题

(顺便说一句,一种可以工作的懒惰方式,就是简单地声明一个属性不安全并且永远不会被保存)

于 2014-01-08T11:06:39.243 回答