Ngu ngơ học làm web (x27) - CakePHP2 - Cập nhật giỏ hàng (tt)

Tiếp theo của: Ngu ngơ học làm web (x26) - CakePHP2 – Xem, cập nhật giỏ hàng
-----

Phần x27. CakePHP2 – Cập nhật giỏ hàng (tt)


Xem (clip số 28 – chickenrainshop):
- escapse => false: để hiển thị nội dung html(7":07)

Viết đoạn mã cho nút “Làm rỗng giỏ hàng”, sử dụng một postLink ,
trong [View\Books\view_cart.ctp]:

<?php echo $this->Form->postLink('Làm rỗng giỏ hàng', '/books/emptyCart', ['class' => 'col-lg-3 btn btn-default empty']); ?>

Viết action emptyCart trong BooksController.php

public function emptyCart() {
                        if ($this->request->is('post')) {
                                    $this->Session->delete('cart');
                                    $this->Session->delete('payment');
                                    $this->redirect($this->referer());
                        }
            }

Viết chức năng xóa từng quyển sách.

Viết đoạn mã cho nút X, sử dụng một postLink,
trong [View\Books\view_cart.ctp]:

<?php echo $this->Form->postLink('<span class="glyphicon glyphicon-remove"></span>', '/books/remove/'.$book['id'], ['escape' => false]); ?>

Viết action remove trong BooksController.php

            public function remove($id = null) {
                        if ($this->request->is('post')) {
                                    $this->Session->delete('cart.'.$id);
                                    $cart = $this->Session->read('cart');
                                    if (empty($cart)) {
                                                $this->emptyCart();
                                    } else {
                                                $total = $this->Tool->arraySum($cart, 'quantity', 'sale_price');
                                                $this->Session->write('payment.total', $total);
                                    }
                                    $this->redirect($this->referer());
                        }
            }

Xem (clip số 29bt – chickenrainshop):

Viết chức năng cập nhật số lượng sách.

Nội dung của form cập nhật số lượng, trong [View\Books\view_cart.ctp]:

<?php echo $this->Form->create('Book', ['url' => ['action' => 'quantityUpdate']], ['class' => 'form-inline']) ?>
            <?php echo $this->Form->input('bookId', ['type' => 'hidden', 'value' => $book['id']]); ?>
            <?php echo $this->Form->input('quantity', ['value' => $book['quantity'], 'class' => 'col col-lg-2', 'label' => false, 'div' => false]); ?>
            <?php echo $this->Form->button('Cập nhật', ['class' => 'btn btn-link', 'type' => 'submit']); ?>
            <?php echo $this->Form->end(); ?>

Viết action quantityUpdate() trong controller BooksController.php:

Ý tưởng là:

- Khi gửi form lên thì gửi thêm trường bookId để biết được người dùng đã tăng số lượng của cuốn 
sách nào

- Dựa vào bookId, đọc cuốn sách tương ứng trong Session

- So sánh trường quantity do người dùng gửi lên ($newQuantity) và trường quantity đọc từ Session ($oldQuantity)

- Nếu giá trị người dùng gửi lên lớn hơn 0 và khác giá trị trước đó thì cập nhật lại trường quantity vào Session, đồng thời tính lại giá trị của trường Tổng tiền

- Tải lại trang hiện tại để cập nhật các giá trị mới

public function quantityUpdate() {
                        if ($this->request->is('post')) {
                                    $id = $this->request->data['Book']['bookId'];
                                    $book = $this->Session->read('cart.'.$id);
                                    $oldQuantity = $book['quantity'];
                                    $newQuantity = $this->request->data['Book']['quantity'];
                                    if ($newQuantity > 0 && $newQuantity != $oldQuantity) {
                                                $book['quantity'] = $newQuantity;
                                                $this->Session->write('cart.'.$id, $book);
                                                $cart = $this->Session->read('cart');
                                                $total = $this->Tool->arraySum($cart, 'quantity', 'sale_price');
                                                $this->Session->write('payment.total', $total);
                                    }
                        }
                        $this->redirect($this->referer());

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