2011-05-13 55 views
0

我已经在CakePHP书籍/ API和StackOverflow上搜索了网络,但似乎无法找到答案。我遇到的问题是用户为我正在构建的应用创建。我在我的控制器中添加了一些操作的密码验证规则,这些规则工作得很好 - 没有任何问题,甚至Auth组件也很开心。我创建了一个与我的数据模型完美配合的change_password动作(就像in - changes实际发生的那样),但是没有验证应用于它,即使我将表单字段命名为与add动作完全相同。许多操作的CakePHP验证规则

多个操作可以不共享相同的验证吗?我是否需要在change_password动作中稍微重命名我的表单ID,然后创建新的验证变量以匹配这些变量?这对我来说似乎效率很低,但如果我必须走下这条路,我会的。

非常感谢! John

编辑,现在添加代码片段,因为它看起来合适。

首先行动:

function change_password($id = null) { 
    if (!empty($this->data)) { 
     if (!empty($this->data['User']['passwd'])) { 
      $this->data['User']['password'] = $this->Auth->password($this->data['User']['passwd']); 
     } 
     if ($this->User->save($this->data)) { 
      $this->Session->setFlash('Password has been changed'); 
      $this->redirect(array('controller' => 'bookings', 'action' => 'index')); 
     } else { 
      $this->Session->setFlash('Password could not be changed'); 
     } 
    } 

现在,验证规则(再次指出的是,这些工作完全为我添加动作,他们只是无法在change_password):

var $validate = array(
    'first_name' => array(
     'notempty' => array('rule' => array('notempty')), 
    ), 
    'last_name' => array(
     'notempty' => array('rule' => array('notempty')), 
    ), 
    'email' => array(
     'email' => array('rule' => array('email')), 
    ), 
    'group_id' => array(
     'numeric' => array('rule' => array('numeric')), 
    ), 
    'active_user' => array(
     'boolean' => array('rule' => array('boolean')), 
    ), 
    'passwd' => array(
     'rule' => array('minLength', '6'), 
     'message' => 'Password should be at least 6 characters long', 
     'required' => true, 
     'allowEmpty' => false, 
     'on' => 'create' 
    ), 
    'passwd_confirm' => array(
     'rule' => 'matchpwd', 
     'message' => 'Confirm password doesnt match' 
    ), 
); 

    function matchpwd($data){ 
    if ($this->data['User']['passwd'] != $data['passwd_confirm']) { 
     return false; 
    } 
    return true; 
} 

最后,视图(虽然我不认为增加这个会有帮助,但我仍然会将它包括在内):

<div class="users form"> 
    <?php echo $form->create('User', array('action'=>'change_password'));?> 
<fieldset> 
    <legend><?php __('Change Password for "'.$User_to_change.'"');?></legend> 
<?php 
    echo $form->input('id'); 
    echo $form->input('passwd', array(
      'type' => 'password') 
     ); 
    echo $form->input('passwd_confirm', array(
      'type' => 'password') 
     ); 
?> 
</fieldset> 
    <?php echo $form->end('Submit');?> 
    </div> 

我在下面的答案中引用了验证,似乎是“半路工作”。当我尝试在“passwd”表单域中输入密码但将“passwd_confirm”留空时,控制器的保存操作失败,并看到“密码无法更改”的闪存信息。所以显然它在我的验证规则中运行matchpwd函数。但是,为这两个框输入空白值会成功,因此就好像它失败了其他验证规则。

(请原谅我,如果代码缩进没有出现正常。正如你所看到的,我有点StackOverflow上的n00b的)

+0

糟糕!忘记说明我正在使用cakePHP版本1.3。如果它有帮助,我会提供代码片段,但在这一点上,这更多的是一个理论问题:可以将验证规则应用于多个操作? – SnoConeGod 2011-05-13 16:01:20

回答

0

蛋糕的验证系统的一个很大的好处是,你只需要写规则一次。在您的控制器正在加载模型定义时,默认情况下,规则将通过任何使用该模型的操作来应用。

我认为最有可能发生的是你有required参数设置为true。如果该字段为空,则会导致验证失败。

+0

这不一定是发生了什么事情。经过进一步的反思,似乎验证在change_password的中途工作。它绝对要求我匹配密码表单域,但它会允许空白(这与我的验证规则相反)。看到我上面编辑的帖子...也许是时候写一些代码片段了。 – SnoConeGod 2011-05-13 17:15:58

+0

当你说它允许空白时,你的意思是索引不存在于你传递的数据中,或者索引存在,但是该值设置为空/空字符串? – Tyler 2011-05-13 17:25:17

+0

查看我上面的编辑。希望这会让我们更多地了解这一点。我已经包含了动作片段,验证和视图。我从“添加”操作中盗取代码以创建“change_password”。非常感谢你花时间陪伴! – SnoConeGod 2011-05-13 17:27:32

0

密码会自动散列,因此您需要散列其他密码字段以进行比较。我通常做一个beforeSave函数模型:

function beforeSave() { 
    if(!empty($this->data['User']['password2'])) { 
     $this->data['User']['password']=Security::hash($this->data['User']['password2'], null, true); 
    } 
    return true; 
} 

我使用这些验证规则为我的PW领域:

'password' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 
    'password2' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 
    'passwordn' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 
    'current_password' => array(
     'notempty' => array(
      'rule' => array('notempty'), 
      'message' => 'Give a password.', 
     ), 
    ), 

密码和密码2注册,passwordn密码2和current_password都在PW改变形式。