--------------- <> -----------------
--- 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 sách bán chạy. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn sách bán chạy. Hiển thị tất cả bài đăng

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