2

私は Yii の初心者です。そのため、何が問題なのかわかりません。ログイン、登録、および編集プロファイルに同じモデル (ユーザー) を使用しています。

ユーザーモデル:

class Users extends \yii\db\ActiveRecord {
    public $password_repeat; //have no this value in DB, that's why write it as property directly. Need only for profile editing

    public function rules() {
        return [
            [['username', 'password', 'authKey', 'accessToken'], 'safe'],
            [['username', 'password'], 'required'],
            [['username', 'password', 'authKey', 'accessToken'], 'string', 'max' => 255],
            [['is_admin'], 'boolean'],

//don't use scenarios() here. Use 'on' instead 
            ['password_repeat', 'required', 'on' => 'update'],
            ['password_repeat', 'compare', 'compareAttribute'=>'password', 'message'=>"Passwords don't match", 'on' => 'update' ],        
        ];
    }
}

スニペットを表示:

<?php $form = ActiveForm::begin([
    'id' => 'data-form',
    'options' => ['class' => 'form-horizontal', 'enctype' => 'multipart/form-data'],
    'fieldConfig' => [
        'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-6\">{error}</div>",
        'labelOptions' => ['class' => 'col-lg-1 control-label'],
    ],
]); ?>

<?= $form->field($user_data, 'username') ?>

<?= $form->field($logo_data, 'imageFile')->fileInput() ?>

 <?= $form->field($user_data, 'password')->passwordInput(['value'=>''])?>
 <?= $form->field($user_data, 'password_repeat')->passwordInput(['value'=>''])?>

 <?= Html::submitButton('Zapisz', ['class' => 'btn btn-primary btn-block', 'name' => 'data-button']) ?>

<?php ActiveForm::end(); ?>

サイト コントローラのアクション:

public function actionProfile(){
    //3 model instances to retrieve data from users && company_profiles and logo
    $user_data = Users::find()->where(['id'=>Yii::$app->user->id])->one();
    $company_profile_data = CompanyProfiles::find()->where(['user_id'=>Yii::$app->user->id])->one();
    $logo_data = new UploadLogo();

    //here I upload file through $logo_data

    if (isset($_POST['Users'])){
        $user_data->username = $_POST['Users']['username'];
        $company_profile_data->firm_data = $_POST['CompanyProfiles']['firm_data'];
        //other assignments

        $user_data->scenario = 'update'; //specially for 'profile' page           

        if (($_POST[Users][password] !== '') && ($_POST[Users][password_repeat]) !== '' && ($_POST[Users][password] == $_POST[Users][password_repeat]))
           $user_data->password_repeat = $user_data->password = md5($_POST[Users][password]); //MAYBE, problem is here?

        $user_data->update();
        $company_profile_data->update();
    }

    return $this->render('profile', ['user_data' => $user_data, 'company_profile_data' => $company_profile_data, 'logo_data' => $logo_data]);
}

プロファイル編集ページの更新シナリオを使用します。このシナリオでは password_repeat が必要で、パスワードと同じである必要があります。しかし、期待どおりには機能しません。 A:パスワードを入力せずにフォームを送信して再送信しようとすると、パスワードのみ「空白にすることはできません」というメッセージが表示されます。次に、パス入力のみに値を入力し、ページをリロードします (DB テーブルは変更されません)。リロード後、今回は repass フィールドに「空白にすることはできません」というメッセージが表示されます! しかし、最も奇妙なのは、次のページをリロードする前に、すべてが正常に機能することです。リロード後、A に移動します。:) シナリオを削除すると、検証ですべて問題ありません。でも消せない、

では、(シナリオ「更新」を使用して)正常に機能させるために、パス/リパス機能を使用して何をする必要がありますか? どこが間違い?

4

1 に答える 1