-----
Phần x29. CakePHP2
– saveAll(), array->JSON
Xem (clip số 30b – chickenrainshop):
Đoạn mã tính lại giá trị của mục “Đã giảm” và “Tổng tiền
phải trả” khi người dùng nhập mã giảm giá rồi nhưng lại nhập thêm sách:
[action addToCart(), BooksController.php]
$this->Session->write('payment.total', $total);
// kiểm tra xem có mã giảm giá hay không
if
($this->Session->check('payment.coupon')) {
$pay = $total -
$total*$this->Session->read('payment.discount')/100;
$this->Session->write('payment.pay',
$pay);
}
$this->Flash->success('Đã thêm quyển sách vào trong giỏ
hàng!', [
Đoạn mã tính lại giá trị của mục “Đã giảm” và “Tổng tiền
phải trả” khi người dùng nhập mã giảm giá rồi nhưng lại cập nhật số lượng sách:
[action quantityUpdate(), BooksController.php]
$this->Session->write('payment.total', $total);
// kiểm tra xem có mã giảm
giá hay không
if ($this->Session->check('payment.coupon')) {
$pay = $total -
$total*$this->Session->read('payment.discount')/100;
$this->Session->write('payment.pay',
$pay);
}
Đoạn mã tính lại giá trị của mục “Đã giảm” và “Tổng tiền
phải trả” khi người dùng nhập mã giảm giá rồi nhưng lại xóa quyển sách khỏi giỏ
hàng:
[action remove(), BooksController.php]
$total =
$this->Tool->arraySum($cart, 'quantity', 'sale_price');
$this->Session->write('payment.total',
$total);
// kiểm tra xem có mã giảm giá hay không
if ($this->Session->check('payment.coupon')) {
$pay = $total -
$total*$this->Session->read('payment.discount')/100;
$this->Session->write('payment.pay', $pay);
}
}
$this->redirect($this->referer());
Xem (clip số 31 – chickenrainshop):
- Label của
helper (3":05)
- Sử dụng inputDefaults để bỏ
label mặc định cho các input trong form (6":37)
- Tạo một
button (7":02)
- Lưu dữ liệu vào database
dùng saveAll (15":08)
- Chuyển chuỗi thành đối
tượng JSON (18":20)
Đoạn mã cho mục “Thanh toán đơn hàng”:
[View\Books\view_cart.ctp]
<li>Mỗi mã giảm giá có mức giảm giá khác nhau và chỉ dùng
trong khoảng thời gian quy định.</li>
<li>Chỉ
dùng một mã giảm giá khi thanh toán đơn hàng.</li>
<li>Số
tiền giảm giá được tính dựa trên <strong>số phần trăm giảm giá * tổng giá
trị</strong> của đơn hàng</li>
</ul>
<?php
endif ?>
</div>
<!-- end
coupon -->
<!-- customer info -->
<div class="panel panel-info col col-lg-7
col-lg-offset-1">
<h4
class="panel-heading"><span class="glyphicon
glyphicon-user"></span>Thanh toán đơn hàng</h4>
<?php if (true): ?>
<?php echo
$this->Form->create('Order', ['url' => ['action' => 'checkout'],
'class' => 'form-horizontal', 'inputDefaults' => ['label' => false]]);
?>
<div class="row">
<?php echo
$this->Form->label('name', 'Tên', ['class' => 'col col-lg-3
control-label']); ?>
<div
class="col col-lg-9">
<?php
echo $this->Form->input('name', ['placeholder' => 'Nhập tên', 'value'
=>'Lê Văn Tèo']); ?>
</div>
</div>
<div class="row">
<?php echo
$this->Form->label('email', 'Email', ['class' => 'col col-lg-3
control-label']); ?>
<div
class="col col-lg-9">
<?php
echo $this->Form->input('email', ['placeholder' => 'Nhập email',
'value' => 'levanteo@gmail.com']); ?>
</div>
</div>
<div class="row">
<?php echo
$this->Form->label('address', 'Địa chỉ', ['class' => 'col col-lg-3
control-label']); ?>
<div
class="col col-lg-9">
<?php
echo $this->Form->input('address', ['placeholder' => 'Nhập địa chỉ',
'value' => '123 đường abc, thành phố xyz']); ?>
</div>
</div>
<div class="row">
<?php echo
$this->Form->label('phone', 'Điện thoại', ['class' => 'col col-lg-3
control-label']); ?>
<div
class="col col-lg-9">
<?php
echo $this->Form->input('phone', ['placeholder' => 'Nhập số điện
thoại', 'value' => '123456789']); ?>
</div>
</div>
<div class="row">
<div
class="col col-lg-10 col-offset-2">
<?php
echo $this->Form->button('Thực hiện thanh toán', ['type' => 'submit',
'class' => 'btn btn-primary pull-right']) ?>
</div>
</div>
<?php echo $this->Form->end(); ?>
<?php else: ?>
Bạn phải đăng nhập trước khi
thanh toán.
<?php endif ?>
</div>
<!-- end customer info -->
Để chuyển dữ liệu từ dạng mảng sang dạng đối tượng JSON
(dạng text), sử dụng hàm json_encode, ví dụ:
$data = [
'user_id'
=> 1,
'orders_info'
=> json_encode($this->Session->read('cart')),
'customer_info'
=> json_encode($this->request->data['Order']),
'payment_info'
=> json_encode($this->Session->read('payment')),
'status'
=> 0
];
[action checkout() trong OrdersController.php]
/**
* thanh toán đơn hàng và
lưu thông tin mua hàng
*
*/
public function
checkout() {
if
($this->request->is('post')) {
$data
= [
'user_id'
=> 1,
'order_info'
=> json_encode($this->Session->read('cart')),
'customer_info'
=> json_encode($this->request->data['Order']),
'payment_info'
=> json_encode($this->Session->read('payment')),
'status'
=> 0
];
if
($this->Order->saveAll($data)) {
$this->Session->delete('cart');
$this->Session->delete('payment');
}
else {
$this->Flash->error('Thanh
toán không thực hiện được!', ['key' => 'order', 'params' => ['class'
=> 'alert alert-danger']]);
}
$this->redirect($this->referer());
}
}
-----------
Cập nhật 19/6/2017
-----------