Ngu ngơ học làm web (x29) - CakePHP2 - saveAll(), array->JSON

Tiếp theo của: Ngu ngơ học làm web (x28) - CakePHP2 – findBy(), date(), between
-----

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