आप बकवास के साथ अपने मॉडल को दूषित नहीं करना चाहिए।कृपया, इन बुनियादी एमवीसी सिद्धांतों को हमेशा ध्यान में रखें:
- आपके नियंत्रक को आपके मॉडल के कार्यान्वयन से अवगत नहीं होना चाहिए।
- अपने मॉडल के व्यवसाय मॉडल से जुड़े सामानों के साथ अपने मॉडल को प्रदूषित न करें।
हमेशा की तरह, पुन: प्रयोज्य कोड बनाने के अपने कोड "सूखी" (अपने आप को दोहराना नहीं)
वैसे बनाने के लिए, उपयोगकर्ता नाम क्षेत्र के उद्देश्य क्या है? चूंकि फॉर्म केवल लॉग इन उपयोगकर्ता के लिए उपलब्ध होगा, उपयोगकर्ता नाम को पहले ही वाईआई :: ऐप() -> उपयोगकर्ता के साथ एक्सेस किया जा सकता है।
<?php
// models/ChangePasswordForm.php
class ChangePasswordForm extends CFormModel
{
/**
* @var string
*/
public $currentPassword;
/**
* @var string
*/
public $newPassword;
/**
* @var string
*/
public $newPasswordRepeat;
/**
* Validation rules for this form.
*
* @return array
*/
public function rules()
{
return array(
array('currentPassword, newPassword, newPasswordRepeat', 'required'),
array('currentPassword', 'validateCurrentPassword', 'message'=>'This is not your password.'),
array('newPassword', 'compare', 'compareAttribute'=>'validateNewPassword'),
array('newPassword', 'match', 'pattern'=>'/^[a-z0-9_\-]{5,}/i', 'message'=>'Your password does not meet our password complexity policy.'),
);
}
/**
* I don't know your hashing policy, so I assume it's simple MD5 hashing method.
*
* @return string Hashed password
*/
protected function createPasswordHash($password)
{
return md5($password);
}
/**
* I don't know how you access user's password as well.
*
* @return string
*/
protected function getUserPassword()
{
return Yii::app()->user->password;
}
/**
* Saves the new password.
*/
public function saveNewPassword()
{
$user = UserModel::findByPk(Yii::app()->user->username);
$user->password = $this->createPasswordHash($this->newPassword);
$user->update();
}
/**
* Validates current password.
*
* @return bool Is password valid
*/
public function validateCurrentPassword()
{
return $this->createPasswordHash($this->currentPassword) == $this->getUserPassword();
}
}
उदाहरण नियंत्रक कार्रवाई:
public function actionChangePassword()
{
$model=new ChangePasswordForm();
if (isset($_POST['ChangePasswordForm'])) {
$model->setAttributes($_POST['ChangePasswordForm']);
if ($model->validate()) {
$model->save();
// you can redirect here
}
}
$this->render('changePasswordTemplate', array('model'=>$model));
}
उदाहरण टेम्पलेट कोड:
<?php echo CHtml::errorSummary($model); ?>
<div class="row">
<?php echo CHtml::activeLabel($model,'currentPassword'); ?>
<?php echo CHtml::activePasswordField($model,'currentPassword') ?>
</div>
<div class="row">
<?php echo CHtml::activeLabel($model,'newPassword'); ?>
<?php echo CHtml::activePasswordField($model,'newPassword') ?>
</div>
<div class="row">
<?php echo CHtml::activeLabel($model,'newPasswordRepeat'); ?>
<?php echo CHtml::activePasswordField($model,'newPasswordRepeat') ?>
</div>
<div class="row submit">
<?php echo CHtml::submitButton('Change password'); ?>
</div>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->
टेम्पलेट बहुत आसान बनाने के लिए होना चाहिए। कुछ मामूली tweaks के साथ, यह कोड & कॉपी करने के लिए तैयार है एक और Yii परियोजना के लिए चिपकाया।
जब भी संभव हो, आपको मौजूदा प्रमाणीकरण ढांचे का फिर से उपयोग करना चाहिए, क्योंकि, वास्तव में, यह जटिल है। उदाहरण के लिए, https://github.com/delight-im/PHP-Auth पर एक नज़र डालें जो ढांचा-अज्ञेयवादी और डेटाबेस-अज्ञेयवादी दोनों है। – caw