Ngu ngơ học làm web (x39) - CakePHP2 - Sách bán chạy

Tiếp theo của: Ngu ngơ học làm web (x38) - CakePHP2 – routes có tham số, lịch sử mua hàng
-----

Phần x39. CakePHP2 – Sách bán chạy


Xem (clip số 40bt – chickenrainshop):

Hiển thị ‘sách bán chạy’.

Thêm trường ‘hot’ cho bảng books, với Type (tinyint), NULL, default = 0. Cuốn sách nào có trường ‘hot’ bằng 1 là sách bán chạy.

Vào routes.php kiểm tra thấy: Router::connect('/', ['controller' => 'books', 'action' => 'index']);, nghĩa là nội dung của trang chủ sẽ là nội dung của view Books\index.ctp.

Vào view Books\index.ctp thêm vào đoạn mã sau vào cuối tập tin:

[index.ctp]

<div class="panel">
            <h4 class="panel-heading">
                        <span class="glyphicon glyphicon-bookmark">
                                    Sách bán chạy
                                    <?php echo $this->Html->link('(xem tất cả »)', '/sach-ban-chay', [
                                                'class' => 'more'
                                    ]); ?>
                        </span>
            </h4>
            <?php //echo $this->element('book', ['books' => $books]); ?>
</div>

Vào Model\Book.php viết hàm trả về ngẫu nhiên 4 cuốn sách bán chạy.

[Model\Book.php]

public function hot() {
                        return $this->find('all', [
                                    'fields' => ['id', 'title', 'image', 'sale_price', 'slug'],
                                    'conditions' => ['published' => 1, 'hot' => 1],
                                    'order' => 'rand()',
                                    'limit' => 4,
                                    'contain' => ['Writer' => ['fields' => ['name', 'slug']]]
                                    ]);
            }

Vào Controller\BooksController.php sửa lại mã của hàm index():

[Controller\BooksController.php]

public function index() {
                        $books = $this->Book->latest();
                        $hotBooks = $this->Book->hot();
                        $this->set(compact('books','hotBooks'));
                        $this->set('title_for_layout', 'Trang chủ - chickenrainshop');
            }

Vào lại view Books\index.ctp sửa lại mã như sau:

</span>
            </h4>
            <?php echo $this->element('book', ['books' => $hotBooks]); ?>
</div>

Đã xong phần giao diện của trang chủ, giờ sẽ viết cho chức năng: khi người dùng bấm vào ‘Sách bán chạy (xem tất cả)’ hoặc mục ‘Sách bán chạy’ ở menu phía đầu trang, thì sẽ hiển thị ngẫu nhiên 20 cuốn sách bán chạy và không phân trang.

Viết link để tới trang ‘sách bán chạy’:

[Layouts\default.ctp]

<li class="active"><?php echo $this->Html->link('Sách mới', '/sach-moi') ?></li>
<li><?php echo $this->Html->link('Sách bán chạy', '/sach-ban-chay'); ?></li>
<li><a href="#lien-he">Liên hệ</a></li>

Viết route cho link ‘/sach-ban-chay’:

[routes.php]

Router::connect('/sach-moi', ['controller' => 'books', 'action' => 'latest_books']);
Router::connect('/sach-ban-chay', ['controller' => 'books', 'action' => 'bestSelling']);
Router::connect('/login', ['controller' => 'users', 'action' => 'login']);

Viết action bestSelling:

[BooksController.php]

/**
* hiển thị 20 cuốn sách bán chạy
*/
            public function bestSelling() {
                        $hotBooks = $this->Book->hot(20);
                        $this->set('hotBooks', $hotBooks);
                        $this->set('title_for_layout', 'Sách bán chạy');
            }

Sửa lại một chút hàm hot() trong model Book:

[Model\Book.php]

public function hot($limit = null) {
                        return $this->find('all', [
                                    'fields' => ['id', 'title', 'image', 'sale_price', 'slug'],
                                    'conditions' => ['published' => 1, 'hot' => 1],
                                    'order' => 'rand()',
                                    'limit' => $limit,
                                    'contain' => ['Writer' => ['fields' => ['name', 'slug']]]
                                    ]);
            }

Viết view best_selling:

[View\Books\best_selling.ctp]

<div class="panel">
            <h4 class="panel-heading">
                        <span class="glyphicon glyphicon-bookmark"> Sách bán chạy</span>
            </h4>
            <?php echo $this->element('book', ['books' => $hotBooks]); ?>
</div>

Chỉnh lại một chút hàm  beforeFilter() để website không bắt đăng nhập mới vào được trang ‘sách bán chạy’:

[BooksController.php]

public function beforeFilter() {
                        parent::beforeFilter();
                        $this->Auth->allow('view', 'bestSelling');

            }
-----------
Cập nhật 20/7/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web