Ngu ngơ học làm web (x24) - CakePHP2 - Session, postLink, giỏ hàng

Tiếp theo của: Ngu ngơ học làm web (x23) - CakePHP2 – Link hình ảnh, Flash, Load theo vị trí
-----

Phần x24. CakePHP2 – Session, postLink, giỏ hàng


Xem (clip số 25 – chickenrainshop):

Trong CakePHP, có thể thao tác với session ở controller và view.

Controlller
View
Session component
Session helper
- check(): kiểm tra sự tồn tại của một session
- read(): đọc nội dung của một session
- write(): tạo mới hoặc chỉnh sửa nội dung của một session
- setFlash(), hoặc Flash->set(): gửi thông báo lên view
- delete(): xóa một session cụ thể
- destroy(): xóa tất cả các session đã tạo ra
Kiểm tra và hiển thị dữ liệu session đã được xử lý ở controller.
- check(): kiểm tra sự tồn tại của một session
- read(): đọc nội dung của một session
- flash() hoặc Flash->render(): hiển thị thông tin session đã được thiết lập trong hàm setFlash(), hoặc Flash->set()


Có hai loại session:

- Session thông thường: được lưu dưới dạng một cái tên, ví dụ A, có thể lưu vào A dữ liệu có kiểu bất kì như: kiểu số, chuỗi hoặc mảng.

- Session dạng mảng: một session sẽ có cấu trúc là một mảng, ví dụ B, để lấy giá trị: sử dụng B.key-1, B.key-2,…

Xem (clip số 26 – chickenrainshop):

- postLink - tạo một link giống một button (2":09)

- session->setFlash() - lưu thông báo xuống session(12":30)

postLink để tạo một link, khi người dùng bấm vào link, trình duyệt sẽ gửi một request dạng post về server. Ví dụ,

<?php echo $this->Form->postLink(
// nội dung hiển thị
            '<span class="glyphicon glyphicon-shopping-cart"></span> Thêm vào giỏ hàng',
            // URL và các tham số
            ['action' => 'addToCart', $book['Book']['id']],
            // thông tin tùy chọn
            ['class' => 'btn btn-primary', 'escape' => false]);
?>

Mục đích của tham số escape=>false là để trình duyệt xuất nội dung của phần '<span class="glyphicon glyphicon-shopping-cart"></span> Thêm vào giỏ hàng', ra màn hình chứ không xuất nguyên mã HTML.

Tạo giỏ hàng là tạo một mảng để lưu các sản phẩm, ví dụ:

- Tạo một sản phẩm với các thông tin đi kèm:

$item = [
                                                'id' => $book['Book']['id'],
                                                'title' => $book['Book']['title'],
                                                'slug' => $book['Book']['slug'],
                                                'sale_price' => $book['Book']['sale_price'],
                                                'quantity' => 1
                                    ];

- Lưu sản phẩm vào session kiểu mảng có tên là cart, tại vị trí cart.id:

$this->Session->write('cart.'.$id, $item);

- Thiết lập nội dung thông báo để hiển thị lên view:

$this->Flash->success('Đã thêm quyển sách vào trong giỏ hàng!', [
                                                'params' => [
                                                            'class' => 'alert alert-info'
                                                ]]);

- Lưu ý là sau khi CakePHP thực hiện xong action, nó luôn gửi kết quả tới view tương ứng, vì vậy nếu không có view, nó sẽ báo lỗi. Ở đây không tạo view addToCart, nên sẽ gửi kết quả lên view view.ctp.

$this->redirect($this->referer()); // chuyển hướng về chính cái trang đã gọi action

Khi thiết lập nội dung thông báo để hiển thị lên view, nên đặt tên cho mỗi thông báo để hiển thị chính xác thông báo đó, ví dụ:

[trong controller]

$this->Flash->success('Đã thêm quyển sách vào trong giỏ hàng!', [
                                                'key' => 'cart',
                                                'params' => [
                                                            'class' => 'alert alert-info'
                                                ]]);

[trong view]

<?php echo $this->Flash->render('cart'); ?>

[Controller\BooksController.php action addToCart()]

public function addToCart($id = null) {
                        if ($this->request->is('post')) {
                                    // tìm thông tin về sản phẩm
                                    $book = $this->Book->find('first', [
                                                'recursive' => -1,
                                                'conditions' => ['Book.id' => $id]
                                                ]);
                                    if ($this->Session->check('cart.'.$id)) {
                                                $item = $this->Session->read('cart.'.$id);
                                                $item['quantity'] += 1;
                                    } else {
                                                $item = [
                                                'id' => $book['Book']['id'],
                                                'title' => $book['Book']['title'],
                                                'slug' => $book['Book']['slug'],
                                                'sale_price' => $book['Book']['sale_price'],
                                                'quantity' => 1
                                                ];
                                    }
                                    // tạo giỏ hàng và thêm sản phẩm vào giỏ hàng
                                    $this->Session->write('cart.'.$id, $item);
                                    $this->Flash->success('Đã thêm quyển sách vào trong giỏ hàng!', [
                                                'key' => 'cart',
                                                'params' => [
                                                            'class' => 'alert alert-info'
                                                ]]);
                                    $this->redirect($this->referer());
                        }

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