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.

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

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

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


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

2 Likes

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ứ :joy:

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

2 Likes

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à :joy:, thôi chắc đành dùng tạm cách này vậy :joy:

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

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

2 Likes

A post was split to a new topic: Nên gộp cả trang admin và phần người dùng chung 1 MVC hay tách làm 2 MVC?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?