레이아웃 보기

CodeIgniter는 애플리케이션 전체에서 하나 이상의 기본 페이지 레이아웃을 간단하게 사용할 수 있게 해주는 간단하면서도 매우 유연한 레이아웃 시스템을 지원합니다. 레이아웃은 렌더링되는 모든 보기에서 삽입할 수 있는 콘텐츠 섹션을 지원합니다. 1열, 2열, 블로그 아카이브 페이지 등을 지원하기 위해 다양한 레이아웃을 만들 수 있습니다. 레이아웃은 직접 렌더링되지 않습니다. 대신 확장하려는 레이아웃을 지정하는 뷰를 렌더링합니다.

레이아웃 만들기

레이아웃은 다른 것과 같은 뷰입니다. 유일한 차이점은 의도된 용도입니다. 레이아웃은 renderSection() 메서드를 사용하는 유일한 보기 파일입니다. 이 메서드는 콘텐츠의 자리 표시자 역할을 합니다.

예: 앱/보기/default.php:

<!doctype html>
<html>
<head>
    <title>My Layout</title>
</head>
<body>
    <?= $this->renderSection('content') ?>
</body>
</html>

renderSection() 메서드에는 $sectionName$saveData의 두 가지 인수가 있습니다. $sectionName은 하위 뷰에서 콘텐츠 섹션의 이름을 지정하는 데 사용되는 섹션의 이름입니다. 부울 인수 $saveData이 true로 설정된 경우 메소드는 후속 호출을 위해 데이터를 저장합니다. 그렇지 않은 경우 메서드는 내용을 표시한 후 데이터를 정리합니다.

예: 앱/보기/welcome_message.php:

<!doctype html>
<html>
<head>
    <title><?= $this->renderSection('page_title', true) ?></title>
</head>
<body>
    <h1><?= $this->renderSection('page_title') ?><h1>
    <p><?= $this->renderSection('content') ?></p>
</body>
</html>

참고

$saveData은 v4.4.0부터 사용할 수 있습니다.

보기에서 레이아웃 사용

뷰를 레이아웃에 삽입하려고 할 때마다 file:: 상단에 있는 extend() 메서드를 사용해야 합니다.

<?= $this->extend('default') ?>

extend() 메소드는 사용하려는 뷰 파일의 이름을 사용합니다. 표준 뷰이므로 뷰와 동일하게 위치하게 됩니다. 기본적으로 애플리케이션의 View 디렉터리를 검색하지만 다른 PSR-4 정의 네임스페이스도 검색합니다. 특정 네임스페이스 View directory::에서 뷰를 찾기 위해 네임스페이스를 포함할 수 있습니다.

<?= $this->extend('Blog\default') ?>

레이아웃을 확장하는 뷰 내의 모든 콘텐츠는 section($name)endSection() 메서드 호출 내에 포함되어야 합니다. 이러한 호출 사이의 모든 콘텐츠는 섹션 이름과 일치하는 renderSection($name) 호출이 존재하는 레이아웃에 삽입됩니다.

예: 앱/보기/some_view.php:

<?= $this->extend('default') ?>

<?= $this->section('content') ?>
    <h1>Hello World!</h1>
<?= $this->endSection() ?>

endSection()에는 섹션 이름이 필요하지 않습니다. 어느 쪽을 닫아야 할지 자동으로 알 수 있습니다.

섹션에는 중첩된 sections::이 포함될 수 있습니다.

<?= $this->extend('default') ?>

<?= $this->section('content') ?>
    <h1>Hello World!</h1>
    <?= $this->section('javascript') ?>
       let a = 'a';
    <?= $this->endSection() ?>
<?= $this->endSection() ?>

뷰 렌더링

뷰 렌더링과 레이아웃은 컨트롤러 내에 표시되는 다른 뷰와 동일하게 수행됩니다.

<?php

namespace App\Controllers;

class MyController extends BaseController
{
    public function index()
    {
        return view('some_view');
    }
}

View app/Views/some_view.php를 렌더링하고 default을 확장하는 경우 레이아웃 app/Views/default.php도 자동으로 사용됩니다. 렌더러는 뷰가 자체적으로 렌더링되어야 하는지 아니면 레이아웃이 필요한지를 감지할 만큼 똑똑합니다.

부분 보기 포함

부분 보기는 레이아웃을 확장하지 않는 보기 파일입니다. 일반적으로 여러 보기에서 재사용할 수 있는 콘텐츠가 포함됩니다. 뷰 레이아웃을 사용할 때 뷰 부분을 포함하려면 $this->include()을 사용해야 합니다.

<?= $this->extend('default') ?>

<?= $this->section('content') ?>
    <h1>Hello World!</h1>

    <?= $this->include('sidebar') ?>
<?= $this->endSection() ?>

include() 메소드를 호출할 때 캐시 지시어 등을 포함하여 일반 뷰를 렌더링할 때와 동일한 옵션을 모두 전달할 수 있습니다.

레이어에 데이터 할당

view()과 마찬가지로 추가 변수를 템플릿에 전달할 수 있습니다. 템플릿 어디에서나 saveData = false 플래그를 사용하지 않으면 데이터가 각 블록에 상속됩니다.

참고

루프를 사용하는 경우 새 변수를 전달해야 합니다.

<?= $this->setVar('title', 'Homepage')->extend('default') ?>

<?= $this->setVar('hideNavbar', true)->section('content') ?>
    <h1>Items List</h1>
    <?php foreach ($items as $item): ?>
    <?= $this->setData(['item' => $item])->include('item_card') ?>
    <?php endforeach ?>
<?= $this->endSection() ?>