CakePHP proved to be a nice flexible and lightweight framework. When I try to bend it a little to perform something unusual it almost always turns out ok. Below an example of a custom login action that will allow users to login with their username OR e-mail (CakePHP 1.3). The action goes into the Users controller.
/** * Log in with username OR e-mail * * @param void */ function login() { // login with username or e-mail if (!empty($this->Auth->data)) { // save username entered in the login form $username = $this->Auth->data['User']['username']; // find a user by e-mail $this->User->contain(); $find_by_email = $this->User->find('first', array( 'conditions' => array('email' => $this->Auth->data['User']['username']), 'fields' => 'username' ) ); // found if (!empty($find_by_email)) { // retry login with e-mail instead of username $this->Auth->data['User']['username'] = $find_by_email['User']['username']; if (!$this->Auth->login($this->Auth->data['User'])) { // login failed // bring back the username entered in the login form $this->Auth->data['User']['username'] = $username; } else { // login successful // clear flash message $this->Session->delete('Message.auth'); // redirect if ($this->Auth->autoRedirect) { $this->redirect($this->Auth->redirect(), null, true); } } } } } |
The view:
<?php echo $form->create('User', array('action' => 'login')); ?> <fieldset> <legend>Login</legend> <?php echo $form->input('username', array('label' => 'Username or e-mail:')); ?> <?php echo $form->input('password', array('label' => 'Password:')); ?> </fieldset> <?php echo $form->end('Login'); ?> |