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