0

私は Yii MongoDbSuite を使用しています。MongoDB には表示されない、パスワードの繰り返し検証用のフォーム フィールドを作成する必要があります。私は yii フォームを使用しているため、ビューに追加したいすべてのフィールドは、モデルで public として宣言する必要があります。しかし、私のモデルは MongoDocument を拡張しているため、save() の後に宣言されたパブリック フィールドはすべて MongoDb に表示されます。モデルには表示されますが、Mongo には表示されないフィールドを宣言するにはどうすればよいですか。

4

3 に答える 3

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

もちろん、これは問題に次々と遭遇することなく問題を解決する方法の単なる例です

(ちなみに機能する怠惰な方法は、単に属性を安全でないと宣言することであり、決して保存されることはありません)

于 2014-01-08T11:06:39.243 に答える
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

残念ながら、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 が示すのと同じ方法で、その保護されたプロパティを使用できます。

于 2012-11-27T09:26:21.590 に答える