6

我想在 Yii 中使用重置密码功能。为此,我有 4 个字段,即电子邮件、currentPassword、newPassword、newPasswordRepeat。

我在我的模型中使用了以下规则

array('email, currentPassword, newPassword, newPasswordRepeat', 'required'),
       array('newPasswordRepeat', 'compare', 'compareAttribute'=>'newPassword'),
        array('currentPassword', 'equalPasswords'),

equalPasswords我的用户定义规则在哪里检查密码是否currentPassword与我的原始密码匹配。

public function equalPasswords($currentPassword)
{
    $oDbConnection = Yii::app()->db;
    $oCommand = $oDbConnection->createCommand('SELECT * FROM Superadmin_details where email=:email');
    $oCommand->bindParam(':email', Yii::app()->session['email'],PDO::PARAM_STR);
    $user=$oCDbDataReader = $oCommand->queryRow();

    if ($user['password'] != $currentPassword)

    $this->addError($currentPassword, 'Old password is incorrect.');
}

此规则在服务器端给出错误,即当我单击提交按钮时,页面重新加载,然后显示错误。

我想像其他错误一样在客户端显示错误。

而且我已经在表单中启用了客户端验证。

<?php $form=$this->beginWidget('CActiveForm', array(
      'id'=>'contact-form',
      'enableClientValidation'=>true,

      'clientOptions'=>array(
          'validateOnSubmit'=>true,
      ),
)); ?>
4

2 回答 2

0

尝试改变

$this->addError($currentPassword, 'Old password is incorrect.');

$this->addError('currentPassword', 'Old password is incorrect.');

编辑:

此外,您需要 AJAX 验证:

<?php $form=$this->beginWidget('CActiveForm', array(
      'id'=>'contact-form',
      'enableClientValidation'=>true, 'enableAjaxValidation' => true,
      'clientOptions'=>array(
          'validateOnSubmit'=>true,
      ),
)); ?>

并在您的控制器操作之上:

if (array_key_exists('ajax', $_POST) && $_POST['ajax'] === 'contact-form') {
        echo CActiveForm::validate($model);
        Yii::app()->end();
}
于 2013-09-19T09:35:38.263 回答
0

最好的方法是扩展 CValidator 类。在那里,您可以覆盖两个方法 validateAttribute 和 clientValidateAttribute。你需要的是第二个。客户端验证属性。确保您已启用客户端验证。

'enableClientValidation'=>true,

样本:

class MyValidation extends CValidator
{

protected function validateAttribute($object,$attribute)
{
         //TODO: server side validation
}


public function clientValidateAttribute($object,$attribute)
{
    //TODO: client side javascript
}
}
于 2014-01-14T10:35:31.193 回答