как получить код подтверждения для регистрации пользователей? - PullRequest
0 голосов
/ 27 ноября 2011

Я применяю этот учебник: Активация учетной записи пользователя по электронной почте

Когда я отправляю сообщение, оно отправляется так:

Привет, Ахмед, мы поможем вам в кратчайшие сроки, но сначала нам нужно, чтобы вы подтвердили свою учетную запись, нажав на ссылку ниже:

http://localhost/cakenews/users/activate/24/8877ae4a

Проблема в том, что я хочу создать файл users / active.ctp для получения кода активации, когда пользователь нажимает на ссылку. Но я не знаю, что написать на этот файл активному пользователю

<?php
# /controllers/users_controller.php
# please note that not all code is shown...
uses('sanitize');
class UsersController extends AppController {
    var $name = 'Users';
    // Include the Email Component so we can send some out :)
    var $components = array('Email', 'Auth');

    // Allow users to access the following action when not logged in
    function beforeFilter() {
        $this->Auth->allow('register', 'confirm', 'logout');
        $this->Auth->autoRedirect = false;
    }

    // Allows a user to sign up for a new account
    function register() {
        if (!empty($this->data)) {
            // See my previous post if this is forgien to you
 $this->data['User']['password'] = $this->Auth->password($this->data['User']['passwrd']);
            $this->User->data = Sanitize::clean($this->data);
            // Successfully created account - send activation email
            if ($this->User->save()) {
                $this->__sendActivationEmail($this->User->getLastInsertID());

                // this view is not show / listed - use your imagination and inform
                // users that an activation email has been sent out to them.
                $this->redirect('/users/register');
            }
            // Failed, clear password field
            else {
                $this->data['User']['passwrd'] = null;
            }
        }
    }

    /**
     * Send out an activation email to the user.id specified by $user_id
     *  @param Int $user_id User to send activation email to
     *  @return Boolean indicates success
    */
    function __sendActivationEmail($user_id) {
        $user = $this->User->find(array('User.id' => $user_id), array('User.id','User.email', 'User.username'), null, false);
        if ($user === false) {
            debug(__METHOD__." failed to retrieve User data for user.id: {$user_id}");
            return false;
        }

        // Set data for the "view" of the Email

        $this->set('activate_url', 'http://' . env('SERVER_NAME') . '/cakenews/users/activate/' . $user['User']['id'] . '/' . $this->User->getActivationHash());
  $this->set('username', $this->data['User']['username']);

        $this->Email->to = $user['User']['email'];
        $this->Email->subject = env('SERVER_NAME') . ' - Please confirm your email address';
        $this->Email->from = 'email@gmail.com';
        $this->Email->template = 'user_confirm';
         $this->Email->delivery = 'smtp';
       $this->Email->smtpOptions = array(
           'port'=>'465',
          'timeout'=>'30',
             'host' => 'ssl://smtp.gmail.com',
          'username'=>'email@gmail.com',
             'password'=>'password',
               );
        $this->Email->sendAs = 'text';   // you probably want to use both :)
        return $this->Email->send();
    }
}


/**
 * Activates a user account from an incoming link
 *
 *  @param Int $user_id User.id to activate
 *  @param String $in_hash Incoming Activation Hash from the email
*/
function activate($user_id = null, $in_hash = null) {
    $this->User->id = $user_id;
    if ($this->User->exists() && ($in_hash == $this->User->getActivationHash()))
    {
        // Update the active flag in the database
        $this->User->saveField('active', 1);

        // Let the user know they can now log in!
        $this->Session->setFlash('Your account has been activated, please log in below');
        $this->redirect('login');
    }

    // Activation failed, render '/views/user/activate.ctp' which should tell the user.
}

?>

и модель

    /**
     * Creates an activation hash for the current user.
     *
     *  @param Void
     *  @return String activation hash.
    */
   function getActivationHash()
    {
        if (!isset($this->id)) {
            return false;
        }
        return substr(Security::hash(Configure::read('Security.salt') . $this->field('created') . date('Ymd')), 0, 8);
    }
}
?>

Представления: cakenews \ app \ views \ users \ register.ctp

    <fieldset>
        <legend>Add a article</legend>
<?php
echo $form->create('User');
echo $form->input('username');
echo $form->input('password');
echo $form->input('email');
?>
    </fieldset>
   <?php echo $form->end('Post project');   ?>

1 Ответ

3 голосов
/ 27 ноября 2011

В вашем контроллере действие activate обрабатывает активацию пользователя.Если пользователь подтвержден, он перенаправляет на действие входа в систему, в противном случае он попытается отобразить файл activate.ctp.Таким образом, в этом случае вы можете просто показать пользователю сообщение о том, что ваша регистрация не может быть завершена.пожалуйста, попробуйте снова.Чтобы установить некоторые данные для представления (activ.ctp), вы можете использовать метод set контроллера.

Если вы вообще не хотите отображать файл activ.ctp, перенаправьте пользователя в другое место, сообщив, что регистрация не может быть завершена.

...