Làm việc với View

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 18 tháng 1, 2025

Trong CakePHP, các tệp trong thư mục /templates chịu trách nhiệm tạo giao diện của ứng dụng. Thư mục này chứa các tệp PHP được sử dụng để hiển thị dữ liệu được gửi từ controller đến người dùng cuối.

1. Cấu trúc thư mục /templates

Thư mục /templates có cấu trúc được tổ chức theo chuẩn để dễ dàng quản lý giao diện:

/templates
|-- /layout          // Chứa các tệp layout (bố cục chính)
|-- /element         // Chứa các thành phần giao diện tái sử dụng
|-- /<Controller>    // Chứa các tệp view tương ứng với từng controller
|-- error.php        // Tệp xử lý lỗi mặc định

2. Tệp Layout

Layout là khung sườn chính của trang web, nơi chứa các phần chung như header, footer, và menu.

Mặc định:

File layout mặc định nằm tại: /templates/layout/default.php.

Ví dụ cấu trúc file default.php:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title><?= $this->fetch('title') ?></title>
    <?= $this->Html->css(['style']) ?>
</head>
<body>
    <header>
        <h1>My CakePHP App</h1>
        <?= $this->element('header') ?>
    </header>

    <main>
        <?= $this->Flash->render() ?>
        <?= $this->fetch('content') ?>
    </main>

    <footer>
        <?= $this->element('footer') ?>
    </footer>
</body>
</html>
Các phần quan trọng trong layout:
  • $this->fetch('title'): Lấy nội dung tiêu đề được đặt trong view.
  • $this->fetch('content'): Chèn nội dung của view tương ứng với controller.
  • $this->element(): Gọi một phần tử tái sử dụng (xem chi tiết ở mục dưới).

3. Tệp View theo Controller

Các tệp view được lưu trong thư mục /templates/<Controller>. Mỗi action trong controller sẽ tương ứng với một tệp PHP.

Ví dụ: Với controller ArticlesController và action index, tệp view tương ứng sẽ là:

/templates/Articles/index.php

Nội dung tệp index.php:

<h2>Danh sách bài viết</h2>
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Tiêu đề</th>
            <th>Ngày tạo</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($articles as $article): ?>
            <tr>
                <td><?= h($article->id) ?></td>
                <td><?= h($article->title) ?></td>
                <td><?= h($article->created) ?></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

4. Tệp Element

Elements là các thành phần giao diện có thể tái sử dụng, ví dụ như menu, header, hoặc footer.

Các tệp element được lưu trong thư mục /templates/element/.

Ví dụ:

File /templates/element/header.php:

<nav>
    <ul>
        <li><a href="/">Trang chủ</a></li>
        <li><a href="/articles">Bài viết</a></li>
        <li><a href="/contact">Liên hệ</a></li>
    </ul>
</nav>

Sử dụng element trong view hoặc layout:

<?= $this->element('header') ?>

5. Tích hợp dữ liệu trong View

CakePHP cung cấp nhiều phương thức để tích hợp dữ liệu vào view:

Phương thức set() trong controller:
public function index()
{
    $articles = $this->Articles->find('all');
    $this->set('articles', $articles);
}
Hiển thị trong view:
<?php foreach ($articles as $article): ?>
    <p><?= h($article->title) ?></p>
<?php endforeach; ?>

6. Flash Messages trong View

Flash messages được sử dụng để hiển thị thông báo tạm thời.

Hiển thị Flash trong layout:
<?= $this->Flash->render() ?>
Thiết lập Flash trong controller:
$this->Flash->success('Dữ liệu đã được lưu thành công.');

7. Tùy chỉnh giao diện lỗi

CakePHP cho phép tùy chỉnh giao diện lỗi bằng cách chỉnh sửa các tệp trong /templates/error/ hoặc sử dụng file error.php.

Ví dụ: Tệp templates/error/error500.php:

<h1>Đã xảy ra lỗi</h1>
<p>Chúng tôi đang cố gắng khắc phục sự cố. Vui lòng quay lại sau.</p>

Kết luận

Thư mục /templates trong CakePHP giúp tổ chức và xây dựng giao diện ứng dụng một cách hiệu quả. Bằng cách hiểu cách sử dụng layout, view, và element, bạn có thể dễ dàng tạo ra giao diện chuyên nghiệp và thân thiện với người dùng.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ