--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Hiển thị các bài đăng có nhãn date(). Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn date(). Hiển thị tất cả bài đăng

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