Ngu ngơ học làm web (x19) - CakePHP2 - requestAction, layout

Tiếp theo của: Ngu ngơ học làm web (x18) - CakePHP2 – Gọi và gửi biến giữa các action
-----

Phần x19. CakePHP2 – requestAction, layout


Xem (clip số 23 – chickenrainshop):

- Hiển thị dữ liệu từ controller này lên một view khác

- Sử dụng requestAction

- Hiển thị dữ liệu trong mọi view, đặt trong layouts\default (9":19)


requestAction là chức năng được sử dụng để gọi một action từ view.

- Trong controller định nghĩa một action bất kì, action này sẽ return một biến.  Ví dụ trong CategoriesController.php, định nghĩa action menu()

            public function menu() {
                        if ($this->request->is('requested')) {
                                    $categories = $this->Category->find('all', [
                                                'recursive' => -1,
                                                'order' => ['name' => 'asc']
                                    ]);
                                    return $categories;
                        }
            }

Để ý hàm kiểm tra một request gửi từ view tới là requested thì mới xử lý: ($this->request->is('requested')). Trước đến giờ mới chỉ kiểm tra một request là post hoặc get.

- Tại view bất kì, nếu muốn lấy dữ liệu do action trả về thì sử dụng lệnh requestAction. Ví dụ trong element menu_categories.ctp sẽ lấy dữ liệu do action menu() trả về:

<?php $categories = $this->requestAction('/categories/menu'); ?>
<?php if (!empty($categories)): ?>
            <?php foreach ($categories as $category): ?>
            <?php echo $this->Html->link($category['Category']['name'], '/danh-muc/'.$category['Category']['slug']); ?> <br>
            <?php endforeach ?>
<?php endif ?>

Để hiển thị menu trong mọi trang của front-end, gọi element menu_categories.ctp trong layout default.ctp.
<div id="content">

                                    <?php echo $this->Session->flash(); ?>

                                    <?php echo $this->fetch('content'); ?>
                                    <?php echo $this->element('menu_categories'); ?>
                        </div>
                        <div id="footer">

Xem (clip số 24a – chickenrainshop):

- Áp dụng giao diện mới cho một website

- Bố cục (layout) của một trang web (4":40)

- Tùy biến layouts\default (5":30)

- Tham chiếu đến file CSS bằng helper (8":30)

- Đặt class cho một form bằng helper (11":29)

- This->fetch('content')(16":11)

Sửa lại giao diện cho các trang Home, Category\view, writer, search, Book\view.

Các trang trên có chung layout, dạng như sau:

Head (chứa các thông tin của thẻ <head>)
Header: chứa menu chung cho các trang


Body\content: chứa nội dung riêng cho mỗi trang


Body\sidebar: chung cho các trang
Footer

Giao diện mới có sử dụng Bootstrap, nên sẽ lên mạng để tải Bootstrap về.

Dùng phiên bản hiện tại là 3.3.7.

Tải Bootstrap về máy, giải nén, sẽ thấy ba thư mục: fonts, css, js.

Chép nguyên thư mục fonts bỏ vào thư mục webroot của chickenrainshop.

Chép các tập tin (bootstrap.min.css, bootstrap.min.css.map, bootstrap-theme.min.css, bootstrap-theme.min.css.map) trong css bỏ vào thư mục webroot\css của chickenrainshop.

Chép tập tin bootstrap.min.js trong js bỏ vào thư mục webroot\js của chickenrainshop.

Vì Bootstrap có sử dụng thư viện jQuery, nên phải tải thư viện jQuery từ trên mạng về (tập tin jquery.min.js): https://jquery.com/ , rồi chép vào thư mục webroot\js của chickenrainshop. Lưu ý: khi sử dụng, thư viện jQuery phải được gọi trước thư viện Bootstrap. Ví dụ,

<script src="js/jquery.min.js"></script>
            <script src="js/bootstrap.min.js"></script>

Trong thư mục webroot\css, tạo thêm tập tin chickenrainshop.css, sau này sẽ làm css cho giao diện sau, tạm thời chỉ cần thế này thôi cũng được.

[chickenrainshop.css]

#header {
            margin-top: 10px;
}

.pricetotal {
            background: #C0C0C0;
}

Trong clip hướng dẫn làm trên Bootstrap hơi cũ, dưới đây là tập tin default.ctp với Bootstrap phiên bản 3.3.7.

[default.ctp]

<!DOCTYPE html>
<html>
<head>
            <?php echo $this->Html->charset(); ?>
            <title>
                        <?php echo $title_for_layout; ?>
            </title>
            <?php
                        echo $this->Html->meta('icon');
                        echo $this->Html->css('bootstrap.min');
                        echo $this->Html->css('chickenrainshop');
                        echo $this->fetch('meta');
                        echo $this->fetch('css');
                        echo $this->fetch('script');
            ?>
</head>
<body>
            <div id="container" class="container">
                        <div id="header">
                                    <nav class="navbar navbar-default">
                                                <div class="navbar-header">
                                                            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#mainmenu">
                                                <span class="sr-only">Toggle navigation</span>
                                                <span class="icon-bar"></span>
                                                <span class="icon-bar"></span>
                                                <span class="icon-bar"></span>
                                    </button>
                                    <a href="#" class="navbar-brand">Chickenrainshop</a>
                        </div>
                        <div class="navbar-collapse collapse" id="mainmenu">
                                    <ul class="nav navbar-nav">
                                    <li class="active"><?php echo $this->Html->link('Sách mới', '/sach-moi') ?></li>
                                    <li><a href="#ban-chay">Sách bán chạy</a></li>
                                    <li><a href="#lien-he">Liên hệ</a></li>
                                    </ul>
                                    <ul class="nav navbar-nav pull-right">
                                                <?php
                                                            echo $this->Form->create('Book', [
                                                                        'url' => ['action' => 'get_keyword'],
                                                                        'class' => 'navbar-form search'
                                                                        ]);
                                                            echo $this->Form->input('keyword',[
                                                                        'label' => '',
                                                                        'style' => 'width: 200px',
                                                                        'placeholder' => 'Tìm kiếm...'
                                                                        ]);
                                                            echo $this->Form->end();
                                                ?>

                                    </ul>
                        </div>
                                    </nav>
                        </div><!-- #header -->
                        <div id="content">
                                    <div class="row">
                                                <div class="content col col-lg-9">
                                                            <?php echo $this->Session->flash(); ?>
                                                            <?php echo $this->fetch('content'); ?>
                                                </div><!-- content -->
                                                <div class="sidebar col col-lg-3">
                                                            <div class="panel panel-info">
                                                                        <h4 class="panel-heading"><i class="glyphicon glyphicon-shopping-cart"></i>Giỏ hàng</h4>
                                                                                    <ul>
                                                                                                <li><a href="">Hoa vàng trên cỏ xanh</a>(60.000đ)</li>
                                                                                                <li><a href="">Tuổi thơ dữ dội</a>(50.000đ)</li>
                                                                                    </ul>
                                                                                    <p class="pricetotal"><span class="label">Tổng: 110.000đ</span></p>
                                                                        <button type="button" class="btn btn-primary btn-block">Xem/Cập nhật giỏ hàng</button>
                                                            </div>
                                                            <div class="panel">
                                                                        <h4 class="panel-heading"><i class="glyphicon glyphicon-th-list"></i>Danh mục sách</h4>
                                                                        <?php echo $this->element('menu_categories'); ?>
                                                            </div>
                                                </div><!-- sidebar -->
                                    </div>
                        </div><!-- #content -->
                        <div id="footer">
                                    <div class="container">
                                                <p class="text-muted pull-right">Học CakePHP2</p>
                                    </div>
                        </div>
            </div>
            <script src="js/jquery.min.js"></script>
            <script src="js/bootstrap.min.js"></script>
</body>
</html>

[menu_categories.ctp]

<?php $categories = $this->requestAction('/categories/menu'); ?>

<?php if (!empty($categories)): ?>
            <ul>
                        <?php foreach ($categories as $category): ?>
                        <li><?php echo $this->Html->link($category['Category']['name'], '/danh-muc/'.$category['Category']['slug']); ?></li>
                        <?php endforeach ?>
            </ul>

<?php endif ?>
-----------
Cập nhật 22/5/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web