Ngu ngơ học làm web (x41) - CakePHP2 - updateAll, CakeEmail, config smtp

Tiếp theo của: Ngu ngơ học làm web (x40) - CakePHP2 – forgot password, generate code
-----

Phần x41. CakePHP2 – updateAll, CakeEmail, config smtp


Xem (clip số 41c– chickenrainshop):

- Hàm updateAll

Viết tiếp xử lý cho hàm confirm():

[Controller\UsersController.php action confirm()]

public function confirm($code = null) {
                        $confirm = false;
                        if (!empty($code)) {
                                    $user = $this->User->findByCode($code);
                                    if (!empty($user)) {
                                                $confirm = true;
                                                if ($this->request->is('post')) {
                                                            $this->User->set($this->request->data);
                                                            if ($this->User->validates()) {
                                                                        if ($this->updatePassword($user['User']['id'])) {
                                                                                    // xóa mã xác nhận trong cơ sở dữ liệu
                                                                                    $this->User->updateAll(['User.code' => null], ['User.id' == $user['User']['id']]);
                                                                                    $this->Flash->success('Đăng nhập với mật khẩu mới!', ['key' => 'auth', 'params' => ['class' => 'alert alert-success']]);
                                                                                    $this->redirect('/login');
                                                                        }
                                                            } else {
                                                                        $this->Flash->error($this->User->validationErrors, ['params' => ['class' => 'alert alert-error']]);
                                                            }
                                                }
                                    }
                        }
                        $this->set('confirm', $confirm);
                        $this->set('title_for_layout', 'Yêu cầu đổi mật khẩu mới');
            }

[Controller\UsersController.php hàm updatePassword()]

private function updatePassword($id) {
            $this->User->id = $id;
            if ($this->User->saveField('password', $this->request->data['User']['password'])) {
                        return true;
            } else {
                        return false;
            }
}

Xem (clip số 41d– chickenrainshop):

- Gửi link confirm về email người dùng (41d)

- Sử dụng CakeEmail (1":00)

- Cấu hình smtp (6":44)

Khai báo sử dụng CakeEmail:

[Controller\UsersController.php]

<?php
App::uses('AppController', 'Controller');
App::uses('CakeEmail', 'Network/Email');


Cấu hình smtp để gửi email trên máy cục bộ:

[Config\email.php]

public $smtp = array(
                        'transport' => 'Smtp',
                        'from' => array('email1@gmail.com' => 'Email1'),
                        'to' => 'email2@gmail.com',
                        'host' => 'ssl://smtp.gmail.com',
                        'port' => 465,
                        'timeout' => 30,
                        'username' => 'email1',
                        'password' => 'matkhau_email1',
                        'client' => null,
                        'log' => false,
                        //'charset' => 'utf-8',
                        //'headerCharset' => 'utf-8',
            );

Thêm mã cho action forgotPassword()

[Controller\UsersController.php]

public function forgotPassword() {
                        $this->set('title_for_layout', 'Quên mật khẩu');
                        if ($this->request->is('post')) {
                                    $user = $this->User->findByEmail($this->request->data['User']['email']);
                                    if (!empty($user)) {
                                                // tạo mã xác thực
                                                $code = $this->Tool->generateCode();
                                                // tạo link để người dùng bấm vào
                                                $linkConfirm = 'http://local.chickenrainshop/xac-nhan/'.$code;
                                                // lưu code vào cơ sở dữ liệu
                                                $this->User->id = $user['User']['id'];
                                                $this->User->saveField('code', $code);
                                                // gửi email link xác nhận
                                                $email = new CakeEmail();
                                                // $email->from(['chickenrain@gmail.com' => 'Admin']);
                                                // $email->to([$user['User']['email'] => $user['User']['name']]);
                                                // $email->subject('Xác nhận thay đổi mật khẩu');
                                                // $email->send('Bạn vừa yêu cầu thay đổi mật khẩu, vui lòng nhấn vào link để xác nhận: '.$linkConfirm);
                                                $email->config('smtp')
                                                            //->from(['chickenrain@gmail.com' => 'Admin']);
                                                            //->to([$user['User']['email'] => $user['User']['name']]);
                                                            ->subject('Xác nhận thay đổi mật khẩu')
                                                            ->send('Bạn vừa yêu cầu thay đổi mật khẩu, vui lòng nhấn vào link để xác nhận: '.$linkConfirm);
                                                $this->Flash->success('Vui lòng kiểm tra hộp thư để xác nhận yêu cầu!', ['params' => ['class' => 'alert alert-success'], 'key' => 'forgot']);
                                    } else {
                                                $this->Flash->error('Email này chưa được đăng kí trên hệ thống', ['params' => ['class' => 'alert alert-error'], 'key' => 'forgot']);
                                    }
                        }
            }

Do email của gmail được bảo mật, nên không cho ứng dụng được phép truy cập vào để gửi email, kết quả là ứng dụng web sẽ bị lỗi. Nghĩa là ‘Allow less secure apps’ đang ở chế độ OFF, cần chuyển sang chế độ ON để chạy được đoạn mã và kiểm tra. Sau đó nhớ chuyển email về lại chế độ OFF để đảm bảo an toàn cho hộp thư.


-----------
Cập nhật 22/7/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web