-----
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
-----------