-2

我可以这样做以在表格中搜索电子邮件。

// controller method
public function forgot_password() {
    if ($this->Session->read('Auth.User')) {
        $this->redirect(array('action' => 'add'));
    } else {
        if ($this->request->is('post') || $this->request->is('put')) {
            $user = $this->User->findByEmail($this->request->data('User.email'));
            if ($user) {
                    $this->request->data['User']['id'] = $user['User']['id'];
                    $this->request->data['User']['random_string'] = $this->String->random();
                    unset($this->request->data['User']['email']);
                    $this->User->save($this->request->data);
                    // $this->_sendEmail($user);
                    $this->Session->setFlash(__('Instructions has been sent to your email'), 'flash');
                    $this->redirect(array('action' => 'forgot_password'));

            } else {
                // passed! do stuff
            }
        }
    }
}


// validate in the model
public $validate = array(
    'email' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'An Email is required'
        ),
        'email' => array(
            'rule' => array('email'),
            'message' => 'Email is invalid'
        ),
        'isUnique' => array(
            'rule' => array('isUnique'),
            'message' => 'Email is already in use'
        )
    ),
    'password' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'A password is required'
        )
    ),
    'role' => array(
        'valid' => array(
            'rule' => array('inList', array('admin', 'author')),
            'message' => 'Please enter a valid role',
            'allowEmpty' => false
        )
    )
);

上面的代码工作正常。

我只是想在查询数据库之前验证电子邮件是有效电子邮件还是空电子邮件。我想出了下面的那个。我遇到的问题是将用户设置为$this->request->data. 每当我验证时,它都会通过 isUnique 规则运行并失败。

public function forgot_password() {
    if ($this->Session->read('Auth.User')) {
        $this->redirect(array('action' => 'add'));
    } else {
        if ($this->request->is('post') || $this->request->is('put')) {
            $this->User->set($this->request->data);
            if ($this->User->validates()) {
                $user = $this->User->findByEmail($this->request->data('User.email'));
                if ($user) {
                    $this->request->data['User']['id'] = $user['User']['id'];
                    $this->request->data['User']['random_string'] = $this->String->random();
                    unset($this->request->data['User']['email']);
                    $this->User->save($this->request->data);
                    // $this->_sendEmail($user);
                    $this->Session->setFlash(__('Instructions has been sent to your email'), 'flash');
                    $this->redirect(array('action' => 'forgot_password'));
                }
            }
        }
    }
}

有人做过类似于我想要的解决方案吗?

4

2 回答 2

1

您可以从控制器执行此操作。

App::uses('Validation', 'Utility');
if (Validation::email($this->request->data('User.email'))) {
  ...
}
于 2012-11-01T01:50:58.587 回答
0

我同意@Dave 的观点,您不太清楚自己要做什么。

首先,您对请求数据的访问可能应该是 $this->request->data['User']['email']; 如果您以标准表单助手格式发布数据。

如果值为空或电子邮件规则失败,我很确定在保存调用中查询数据库之前模型验证会失败。由于 notEmpty 是第一条规则,因此验证实用程序会在查询数据库之前对其进行检查。如果失败,则将跳过该字段并且不进行数据库调用(只要“last”不等于 false。同样适用于电子邮件规则,因为 cake 对该规则使用正则表达式模式。您可以遵循事件链通过查看 Model.php 中的保存功能。

如果不为空并且电子邮件规则通过,最终您将不得不查询数据库以查找地址是否已存在。

于 2012-11-01T02:13:41.623 回答