Ngu ngơ học làm web (x28) - CakePHP2 - findBy(), date(), between

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

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().


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
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web