-----
Phần x28. CakePHP2
– findBy(), date(), between
Xem (clip số 30a – chickenrainshop):
- request->data() để lấy giá trị từ form post lên server (5":55)
- Sử dụng findBy(7":28)
- Lấy ngày hiện tại date()(9":43)
- Kiểm tra một ngày có nằm trong “ngày bắt đầu” và “ngày kết
thúc” (9":59)
- Lưu session theo khóa (13":23)
- redirect về trang hiện tại (15":42)
Đoạn mã cho phần nhập mã giảm giá:
[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']); ?>
</div>
</div>
<!-- coupon -->
<div class="panel panel-success col col-lg-4
coupon">
<h4
class="panel-heading"><span class="glyphicon
glyphicon-barcode"></span> Mã giảm giá</h4>
<?php echo
$this->Form->create('Coupon', ['url' => ['action' => 'add']],
['class' => 'form-inline']) ?>
<?php echo $this->Form->input('code',
['class' => 'col-lg-9', 'placeholder' => 'Nhập mã giảm giá (coupon)',
'label' => false, 'div' => false]); ?>
<?php echo
$this->Form->button('Nhập', ['type' => 'submit', 'class' =>
'col-lg-2 btn btn-primary']) ?>
<?php echo $this->Form->end(); ?>
<h4>Ghi chú:</h4>
<ul>
<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>
</div>
<!-- end coupon -->
<?php else: ?>
<div
class="panel">
Giỏ
hàng đang rỗng.
Quay
về <?php echo $this->Html->link('trang chủ', '/'); ?> để thêm quyển
sách vào giỏ hàng.
Thêm mã css vào tập tin chickenrainshop.css:
.coupon {
padding: 0px;
}
.coupon input {
padding-left: 4px;
border-radius: 4px;
margin-left: 1px;
padding-right: 1px;
margin-top: 10px;
margin-bottom: 10px;
}
.coupon button {
width: 50px;
margin-left: 6px;
text-align: center;
padding: 0;
margin-top: 8px;
margin-bottom: 10px;
height: 30px;
}
Viết mã cho action add() trong CouponsController.php:
Để kiểm tra một giá trị có trong cơ sở dữ liệu hay không, sử
dụng hàm findBy().
Đọc thêm về findBy() tại đây: https://book.cakephp.org/2.0/en/models/retrieving-your-data.html#findby
findBy<fieldName>(string $value);
Giá trị trả về của findBy() giống với find(‘first’).
Ví dụ, tìm hàng dữ liệu đầu tiên trong bảng coupons, có giá
trị trường code = $code:
$coupon = $this->Coupon->findByCode($code);
Để lấy ngày hiện tại sử dụng hàm date(), với định dạng thời
gian là: yyyy-mm-dd 00:00:00, ví dụ:
$today = date('Y-m-d H:i:s');
Kết quả sẽ xuất ra là: 2017-06-01 10:14:59
Hàm so sánh một mốc thời gian có nằm trong một khoảng thời
gian cho trước hay không? Viết trong ToolComponent.php.
public function between($date, $start, $end, $timezone =
'Asia/Ho_Chi_Minh') {
//
thiết lập múi giờ cho server
date_default_timezone_set($timezone);
//
chuyển chuỗi thời gian sang dạng Unix timestamp
$date
= strtotime($date);
$start
= strtotime($start);
$end
= strtotime($end);
if
($date >= $start && $date <= $end) {
return
true;
}
else {
return
false;
}
}
Mã cho action add() trong CouponsController.php:
public function add() {
if
($this->request->is('post')) {
$code
= $this->request->data['Coupon']['code'];
$coupon
= $this->Coupon->findByCode($code);
if
(!empty($coupon)) {
$today =
date('Y-m-d H:i:s');
if
($this->Tool->between($today, $coupon['Coupon']['time_start'],
$coupon['Coupon']['time_end'])) {
$this->Session->write('payment.coupon',
$coupon['Coupon']['code']);
$this->Session->write('payment.discount',
$coupon['Coupon']['percent']);
$total
= $this->Session->read('payment.total');
$pay
= $total - $total * $coupon['Coupon']['percent']/100;
$this->Session->write('payment.pay',
$pay);
}
else {
$this->Flash->error('Mã
giảm giá đã hết hạn!', ['key' => 'coupon', 'params' => ['class' =>
'alert alert-danger']]);
}
}
else {
$this->Flash->error('Sai
mã giảm giá!', ['key' => 'coupon', 'params' => ['class' => 'alert
alert-danger']]);
}
$this->redirect($this->referer());
}
}
Đoạn mã cho phần "nhập mã giảm giá", sửa lại như sau:
[View\Books\view_cart.ctp]
<!-- coupon -->
<div
class="panel panel-success col col-lg-4 coupon">
<h4
class="panel-heading"><span class="glyphicon
glyphicon-barcode"></span> Mã giảm giá</h4>
<?php
echo $this->Flash->render('coupon'); ?>
<!--
kiểm tra chỉ cho hiển thị form nhập coupon nến người dùng chưa nhập lần nào
-->
<?php
if ($this->Session->check('payment.coupon')): ?>
Bạn
đã nhập mã giảm giá!
<?php
else: ?>
<?php
echo $this->Form->create('Coupon', ['url' => ['action' => 'add']],
['class' => 'form-inline']) ?>
<?php
echo $this->Form->input('code', ['class' => 'col-lg-9', 'placeholder'
=> 'Nhập mã giảm giá (coupon)', 'label' => false, 'div' => false]);
?>
<?php
echo $this->Form->button('Nhập', ['type' => 'submit', 'class' =>
'col-lg-2 btn btn-primary']) ?>
<?php
echo $this->Form->end(); ?>
<h4>Ghi
chú:</h4>
<ul>
<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 -->
Phần mã về “giá tiền được giảm”, “tổng tiền” trong
view_cart.ctp được sửa lại như sau:
<?php if ($this->Session->check('payment.coupon')):
?>
<td colspan="2"><strong>Đã
giảm <small>(Coupon:
<?php echo $payment['coupon']; ?> - giảm <?php echo
$payment['discount']; ?>%) </small>
</strong></td>
<td
colspan="2"><strong><?php echo
$this->Number->currency($payment['total'] - $payment['pay'],'
VND',['places' => 0,'wholePosition' => 'after']);
?></strong></td>
<?php else: ?>
<td
colspan="2"><strong>Đã giảm </strong></td>
<td
colspan="2"><strong>0 VND</strong></td>
<?php endif ?>
</tr>
<tr class="success">
<td></td>
<?php if ($this->Session->check('payment.coupon')):
?>
<td
colspan="2"><h4><strong>Giá phải
trả</strong></h4></td>
<td
colspan="2"><h4><span class="label
label-danger"><?php echo
$this->Number->currency($payment['pay'],' VND',['places' =>
0,'wholePosition' => 'after']); ?></span></h4></td>
<?php else: ?>
<td
colspan="2"><h4><strong>Giá phải trả</strong></h4></td>
<td
colspan="2"><h4><span class="label
label-danger"><?php echo
$this->Number->currency($payment['total'],' VND',['places' =>
0,'wholePosition' => 'after']); ?></span></h4></td>
<?php endif ?>
</tr>
-----------
Cập nhật 4/6/2017
-----------