Ngu ngơ học làm web (x5) - CakePHP2 - Tạo home page

Tiếp theo của: Ngu ngơ học làm web (x4) - CakePHP2 – Quan hệ bảng Containable
------

Phần x5. CakePHP2 – Tạo home page


Xem (clip số 10 – chickenrainshop):

Cấu hình Routes (phút 1:00).

Routing là ánh xạ các URL sang các controller và action tương ứng, nhằm làm cho URL trên thanh địa chỉ đẹp hơn, dễ sử dụng và linh hoạt hơn.  


Tập tin routes.php nằm trong thư mục chickenrainshop\Config.

Cú pháp,

Router::connect('/', ['controller' => 'books', 'action' => 'index']);

Nghĩa là: nếu người dùng chỉ nhập tên website vào đường dẫn (/), ví dụ http://local.chickenrainshop. thì sẽ chuyển hướng tới trang index của controller Books.

Ví dụ, thực hiện hiển thị 10 quyển sách mới nhất lên trang chủ.

[BooksController, index( )]

$books = $this->Book->find('all', [
                                    'fields' => ['title', 'image', 'sale_price', 'slug'],
                                    'order' => ['created' => 'desc'],
                                    'limit' => 10,
                                    'contain' => ['Writer' => ['fields' => 'name']]
                                    ]);

Gửi dữ liệu từ controller lên view, sử dụng hàm set(), (phút 5:08).

$this->set('books', $books);

Trong đó, ‘books’ là tên biến ở bên view, $books là giá trị sẽ được gán vào ‘books’.

Bên view index, dùng hàm pr($books) để kiểm tra xem dữ liệu đã được gửi từ controller lên view chưa, đồng thời xem cách tổ chức dữ liệu để truy xuất và hiển thị cho hợp lý. (phút 7:30).

Học thêm cách viết vòng lặp foreach, rất gọn và tiện.

<?php foreach($books as $book): ?>
//mã xử lý trong vòng lặp
<?php endforeach; ?>

[view Books\index]

<div class="books index">
            <h2><?php echo __('Books'); ?></h2>
            <?php foreach($books as $book): ?>
                        <?php echo $book['Book']['title']; ?> <br>
                        <?php echo $book['Book']['image']; ?> <br>
                        Giá bán:<?php echo $book['Book']['sale_price']; ?> <br>
                        <?php foreach($book['Writer'] as $writer): ?>
                                    <?php echo $writer['name'].' '; ?>
                        <?php endforeach; ?>
                        <br>
                        <hr>
            <?php endforeach; ?>
</div>

Ở trên thấy có dòng mã sau:

<h2><?php echo __('Books'); ?></h2>

Vậy __( ) là gì?

Đọc thêm tại đây:

__() là một hàm toàn cục (global function) của CakePHP, nó cho phép chèn thêm tham số vào một chuỗi khi xuất. Giống với hàm sprintf() của PHP.

Ví dụ,

<?php $string = 'Nguyễn Văn Tèo'; ?>
<h2><?php echo __('anh %s', $string); ?></h2>

Kết quả xuất ra là:

anh Nguyễn Văn Tèo.

Xem (clip số 11 – chickenrainshop):

Viết hàm truy vấn dữ liệu trong model, rồi trong controller sẽ gọi hàm truy vấn này. Việc này giúp tối ưu khi viết mã, không phải viết lại câu truy vấn nhiều lần (phút 1:40).

Trong model Book định nghĩa hàm latest().

[model Book]

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

Trong controller Books sẽ gọi hàm latest() để lấy 10 cuốn sách.

[controller Books]

public function index() {
                        $books = $this->Book->latest();
                        $this->set('books', $books);
            }

Hiển thị hình ảnh bằng html helper (phút 4:25).

<?php echo $this->Html->image($book['Book']['image']); ?>

Trong đó,

$book['Book']['image'] sẽ chứa đường dẫn của tập tin hình ảnh, ví dụ: /webroot/files/ki-nang-song/ba-diem-tinh-yeu-tren-duong-tu-tap.jpg

Chỉnh kích thước của hình ảnh bằng html helper:

<?php echo $this->Html->image($book['Book']['image'], ['width' => '60px', 'height' => '80px']); ?>

Định dạng xuất tiền bằng html helper:

Giá bán:<?php echo $this->Number->currency($book['Book']['sale_price'],' VND',['places' => 0,'wholePosition' => 'after']); ?>

Kết quả là: Giá bán:46,000 VND


Đọc thêm về định dạng xuất số tại đây: https://book.cakephp.org/2.0/en/core-libraries/helpers/number.html