-----
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
-----------