编辑表单中的CakePHP密码验证

时间:2011-06-09 15:18:41

标签: cakephp

我正在使用CakePHP的简单注册表。

这是我的编辑视图:

<h2>Add User</h2>
<?php echo $form->create('User');
echo $form->input('first_name');
echo $form->input('last_name');
echo $form->input('email');
echo $form->input('address');
echo $form->input('phone');
echo $form->end('Edit');?>

这些是我在User.php中的验证规则

class User extends AppModel {

    var $name = 'User';
    var $validate = array(

         (... more rules here ...)

        'password' => array('rule' => array('confirmPassword', 'password'),
                            'message' => 'Passwords do not match'),
        'password_confirm' => array('rule' => 'alphanumeric',
                                    'required' => true)
    );

这是一个愚蠢的问题,但是当我使用编辑表单时,数据保存失败,因为我需要在最后一条规则中输入密码。当然,该规则是为注册页面添加的。

我找到了数十亿种绕过这个问题的方法(禁用保存验证,选择要保存的字段,......),但我想知道“正确”的CakePHP做法是什么?看起来像这样一个简单的问题,但我找不到任何关于如何以干净的方式完成的文档。

让我的问题更加明确:我不想要一个可以更改密码的编辑用户页面。

3 个答案:

答案 0 :(得分:3)

Cake方式是简单地将验证规则设置为仅应用于create,允许您自由编辑数据,而无需再次验证字段。

var $validate = array(
  'fieldName' => array(
    'rule' => 'ruleName'
    'required' => true,
    'allowEmpty' => false,
    'on' => 'create', // or update   <-- here
    'message' => 'Your Error Message'
    )
  );

当然,如果您不想在此处编辑密码字段,只需删除相应的input

答案 1 :(得分:3)

我使用多个验证集:

在您的模型或app_model中,使用以下方法覆盖validates函数:

function validates($options = array()) {
// copy the data over from a custom var, otherwise
$actionSet = 'validate' . Inflector::camelize(Router::getParam('action'));
if (isset($this->validationSet)) {
    $temp = $this->validate;
    $param = 'validate' . $this->validationSet;
    $this->validate = $this->{$param};
} elseif (isset($this->{$actionSet})) {
    $temp = $this->validate;
    $param = $actionSet;
    $this->validate = $this->{$param};
} 

$errors = $this->invalidFields($options);

// copy it back
if (isset($temp)) {
    $this->validate = $temp;
    unset($this->validationSet);
}

if (is_array($errors)) {
    return count($errors) === 0;
}
return $errors;

}

在您的控制器中:

class UsersController extends AppController {
   function forgot() {
      $this->User->set($this->data);
      $this->User->validationSet = 'forgotpassword';
      if ($this->User->validates()) {
         // send email to reset password and show success message
      }
   }
}

最后回到你的模型中,构建一个验证数组,你可以拥有你的默认验证数组,然后添加一个补充数组,如

class User extends AppModel {
   var $validate = array( ... );
   var $validateForgotpassword = array( ... );
}

此处有更多详情:

http://snook.ca/archives/cakephp/multiple_validation_sets_cakephp

(请注意文章中的代码示例中有一个错误,因此请务必更改$ param ='validate'。$ validationSet; to $ param ='validate'。$ this-&gt; validationSet;)

答案 2 :(得分:1)

删除您的'required'=&gt;是的,它没有按照你的想法去做。

'required'=&gt; true表示该字段应存在于任何已保存的数据中。你没有通过它。