【问题标题】:Validation not working when updating fields with saveField使用 saveField 更新字段时验证不起作用
【发布时间】:2014-02-20 19:50:02
【问题描述】:

深入用户模型

App::uses('SimplePasswordHasher','Controller/Component/Auth');

class User extends AppModel {
public $useTable = 'users';

public $hasMany = array(
    'Reminder' => array(
        'className' => 'Reminder'
        )
    );

public $validate = array(
        'username' => array(
            'alphaNumeric' => array(
                'rule' => 'alphaNumeric',
                'required' => true,
                'message' => 'Alphabets and numbers only'
                ),
            'between' => array(
                'rule' => array('between',5,15),
                'message' => 'Between 5 to 15 characters'
                ),
            'unique' => array(
                'rule' => 'isUnique',
                'message' => 'Username is already taken'
                )
            ),
        'password' => array(
            'between' => array(
                'rule' => array('between',5,10),
                'message' => 'Between 5 to 10',
                ),
            'compareFields' => array(
                'rule' => array('compareFields','confirm_password'),
                'message' => 'Passwords do not match',
                'required' => 'update'
                )
            ),  
        'email' => array(
            'email' => array(
                'rule' => 'email',
                'message' => 'Please enter valid email address'
                ),
            'unique' => array(
                'rule' => 'isUnique',
                'message' => 'Email is already in use'
                ),
            'compareFields' => array(
                'rule' => array('compareFields','confirm_email'),
                'message' => 'Emails do not match',
                'required' => 'update'
                )
            ),
        'timezone' => array(
            'isValid' => array(
                'rule' => 'isValid',
                'message' => 'Please select a timezone'
                )
            )
        );

在用户控制器内部。

        // Changed existing emails
        if(!empty($this->request->data['User']['email'])) {

            echo "Email is set <br/>";

            $this->User->set($this->request->data['User']['email']);

            if($this->User->validates(array('fieldList' => array('email')))) {

                echo "Email is valid <br/>";

                $this->User->id = $this->Session->read('Auth.User.id');
                $this->User->saveField('email',$this->request->data['User']['email'],true);
                $this->Session->setFlash("Settings updated");                   
            }
        }

        // Change existing password
        if(!empty($this->request->data['User']['password'])) {

            echo "Password is set <br/>";

            $this->User->set($this->request->data['User']['password']);

            if($this->User->validates(array('fieldList' => array('password')))) {

                echo "Password is valid <br/>";

                $this->User->id = $this->Session->read('Auth.User.id');
                $this->User->saveField('password', $this->request->data['User']['password'],true);
                $this->Session->setFlash("Password changed");                   
            } 

        }

我知道 'saveField()' 不会自动进行验证,所以我将验证参数设置为 true,但无济于事。

我已经包含了包含验证的模型。

任何帮助将不胜感激。

【问题讨论】:

  • 您的验证是什么样的?它在其他情况下是否有效?
  • 是的,我有一个注册页面,验证工作正常,但是设置页面会更新模型中现有的字段值。
  • 你试过设置$this->User->set($this->request->data);而不是 $this->request->data['User']['password']; ?

标签: php cakephp cakephp-2.4


【解决方案1】:

已编辑

我实际上提到你必须像这样进行验证:

$this->User->id = $this->Session->read('Auth.User.id');
if(!$this->User->saveField('password', 'asdf', true)) {
    echo "Invalid.";
    pr($this->User->invalidFields());
} else {
    echo "Saved!";
}

或可选地,这样做:

只需read() 数据,覆盖该数组中的新密码,然后$this-&gt;User-&gt;set() 并像您一样使用$this-&gt;User-&gt;validates()

here

【讨论】:

  • $this->User->saveField('password', $this->request->data['User']['password'], true);是他/她正在使用的代码。
  • 修复了评论。但是,是的,我的意思是这样使用验证。不是保存本身。如果他想要像他一样的验证,他需要选择第二个选项。
  • 我打算用你编辑的答案来回复,但你打败了我。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多