01/10/2018, 08:55

Hỏi về vấn đề view trong mvc php

Giò mình đang tập làm một trang bán hàng bằng php theo mô hình mvc,có cái phần mà mình nghĩ mãi chưa ra. Cả trang sẽ có phần footer header cố định, riêng phần content sẽ thay đổi tùy vào controller mình gọi, nhưng làm sao để cố định phần đó trong khi mỗi lần gọi controller lại gọi 1 view khác nhau? chẳng nhẽ trong view nào cũng phải code lại phần header với footer ? Mình biết trong Codeinterger có phần master layout nhưng mà cô giáo không cho làm framework, mà mình cũng không rõ mô hình mvc hay các framework khác có dùng master layout để làm như vậy không.

Mai Anh Dũng viết 10:58 ngày 01/10/2018

chẳng nhẽ trong view nào cũng phải code lại phần header với footer ?

Cách đơn giản nhất có thể là Copy paste

Đùa thôi, PHP có hỗ trợ include html

Xem hướng dẫn ở đây

stackoverflow.com
rjwctm21

Creating a PHP header/footer

php, header, footer
asked by rjwctm21 on 05:31PM - 08 Nov 11

Trong mỗi view thêm include header/footer vào

<?php

$PageTitle="New Page Title";

function customPageHeader(){?>
  <!--Arbitrary HTML Tags-->
<?php }

include_once('header.php');

//body contents go here

include_once('footer.php');
?>

Sau đó tạo cái file header.php

<!doctype html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title><?= isset($PageTitle) ? $PageTitle : "Default Title"?></title>
    <!-- Additional tags here -->
    <?php if (function_exists('customPageHeader')){
      customPageHeader();
    }?>
  </head>
  <body>
</html>

Trong file header mình có thể thêm điều kiện, gọi hàm, etc … để có thể thay đổi tùy theo view nếu thích, còn không thì thôi

Hùng Bùi viết 11:12 ngày 01/10/2018

Vậy lúc làm một website chuyên nghiệp thì họ cũng include như vậy hả anh, em nghĩ phải có cách nào mà đỡ phải lần nào cũng include chứ

viết 11:11 ngày 01/10/2018

Website chuyên nghiệp người ta dùng Router :3
Bạn hoàn toàn có thể tự code 1 cái router đơn giản. Xem thêm chi tiết ở đây

Laracasts

The PHP Practitioner

We all start somewhere. When it comes to web development with PHP, well, your first stop is this series. Designed specifically and exclusively for beginners, here, you'll learn the fundamentals of PHP - all the way down to defining variables and...

Hùng Bùi viết 11:00 ngày 01/10/2018

Thank bạn, nhưng mà cái router này mình nghĩ chỉ là làm cho url thân thiện hơn thôi, chứ trong bài hướng dẫn view nào cũng phải include header với footer mà , thôi chắc đành dùng tạm cách này vậy

Ice Tea viết 11:11 ngày 01/10/2018

Website chuyên nghiệp họ dùng framework, view template, master layout bạn ạ.
MVC đơn giản bạn có thể xem project này https://github.com/panique/mini3
Bạn có thể thấy trong controller họ thường viết như thế này

public function exampleOne()
{
    // load views
    require APP . 'view/_templates/header.php';
    require APP . 'view/home/example_one.php';
    require APP . 'view/_templates/footer.php';
}

Tuy nhiên bạn có thể viết 1 hàm chung chẳng hạn:

BaseController.php

<?php
class BaseController
{
    protected function loadView($viewFile, $viewData = [], $headerFile = null, $footerFile = null) 
    {
        $headerFile = $headerFile ?: APP . 'view/_templates/header.php';
        $footerFile = $footerFile ?: APP . 'view/_templates/footer.php';
        
        if ($viewData) {
            extract($viewData);
        }

        require $headerFile;
        require $viewFile;
        require $footerFile;
    }
}

HomeController.php

<?php
class HomeController extends BaseController
{
    public function exampleOne()
    {
        $varPassToView = 'Var from exampleOne';
        $this->loadView(APP . 'view/home/example_one.php', [
            'varFromCtrl' => $varPassToView,
        ]);
    }
}

example_one.php

<?php
echo 'Var from controller: ' . $varFromCtrl . PHP_EOL;
// Var from controller: Var from exampleOne
Reoteu Ray viết 11:06 ngày 01/10/2018

với mấy cái dự án lớn có nhiều người tham gia code nó có framework riêng để handle view hết bên java mình dùng apache tile3 , còn viết mấy trang nhỏ 1,2 người viết thì dùng include vẫn được nhưng debug khổ lắm phải chạy qua chạy lại xem…@@

Bài liên quan
0