Ngu ngơ học làm web (x25) - CakePHP2 - Tính tiền giỏ hàng, component

Tiếp theo của: Ngu ngơ học làm web (x24) - CakePHP2 – Session, postLink, giỏ hàng
-----

Phần x25. CakePHP2 – Tính tiền giỏ hàng, component


Xem (clip số 27a – chickenrainshop):

- Number->currency() định dạng xuất tiền (4":49)

- Tính tổng tiền của giỏ hàng bằng biến session (10":52)

- Khai báo hàm trong AppController để có thể gọi trong mọi controller(13":04)

- Khai báo hàm trong component để có thể gọi trong mọi project (14":00)

- set->(compact()) - gửi nhiều biến lên view (2":56)

Để tính tiền trong giỏ hàng:

- Đọc giỏ hàng từ Session

- Duyệt từng cuốn sách trong giỏ hàng, cộng tiền của từng cuốn

- Lưu lại tổng tiền vào Session

- Bên view, đọc Session và hiển thị lên view

Đoạn mã ví dụ:

[trong controller]

$cart = $this->Session->read('cart');
            $total = $this->sum($cart);
            $this->Session->write('payment.total', $total);

public function sum($cart) {
                        $total = 0;
                                    foreach ($cart as $book) {
                                                $total += $book['sale_price'] * $book['quantity'];
                                    }
                        return $total;
            }

[trong view]

<?php $total = $this->Session->read('payment.total'); ?>
<p class="pricetotal"><span class="label">Tổng: <?php echo $this->Number->currency($total,
                                                ' VND', ['places' => 0, 'wholePosition' => 'after']); ?></span></p>

Một số tùy chọn về phạm vi của một hàm trong controller:

- Hàm kiểu private, đặt trong một controller: phạm vi sử dụng trong chính controller

- Hàm kiểu public, đặt trong AppController: phạm vi sử dụng trong mọi controller của một project

- Đặt hàm trong một component: phạm vi sử dụng trong nhiều project

Ví dụ, sử dụng component:

- Tạo một component trong thư mục Controller\Component, ví dụ, component có tên là Tool thì tên của tập tin (theo quy ước) sẽ là ToolComponent.php

- Trong ToolComponent, định nghĩa các hàm, ví dụ:

<?php
            class ToolComponent extends Component {
                        public function sum($cart) {
                                    $total = 0;
                                                foreach ($cart as $book) {
                                                            $total += $book['sale_price'] * $book['quantity'];
                                                }
                                    return $total;
                        }
            }
?>

- Muốn sử dụng component, cần khai báo trong controller, ví dụ:

class AppController extends Controller {
            public $components = ['Tool'];
}

- Cú pháp gọi một hàm trong component, ví dụ:

$total = $this->Tool->sum($cart);

Có thể viết lại hàm sum cho tối ưu hơn:

<?php
            class ToolComponent extends Component {
                        public function arraySum($cart, $quantity_col = 'quantity', $price_col = 'price') {
                                    $total = 0;
                                                foreach ($cart as $item) {
                                                            $total += $item[$price_col] * $item[$quantity_col];
                                                }
                                    return $total;
                        }
            }
?>

Khi gọi ra sử dụng sẽ là, ví dụ:

$total = $this->Tool->arraySum($cart, 'quantity', 'sale_price');

[Element cart.ctp để hiển thị thông tin giỏ hàng]

<?php echo $this->Flash->render('cart'); ?>
<?php if($this->Session->check('cart')): ?>
<?php $cart = $this->Session->read('cart'); ?>
            <ul>
            <?php foreach ($cart as $book): ?>
                        <li>
                                    <?php echo $this->Html->link($book['title'], '/'.$book['slug']); ?>
                                    (<?php echo $this->Number->currency($book['sale_price'],
                                                ' VND', ['places' => 0, 'wholePosition' => 'after']); ?>)
                        </li>
            <?php endforeach ?>
            </ul>
            <?php $total = $this->Session->read('payment.total'); ?>
            <p class="pricetotal"><span class="label">Tổng: <?php echo $this->Number->currency($total,
                                                ' VND', ['places' => 0, 'wholePosition' => 'after']); ?></span></p>
            <button type="button" class="btn btn-primary btn-block">Xem/Cập nhật giỏ hàng</button>
<?php else: ?>
            Giỏ hàng đang rỗng!

<?php endif ?>
-----------
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