ビューレイアウト

CodeIgniter は、シンプルながらも非常に柔軟なレイアウトシステムをサポートしており、アプリケーション全体で 1 つ以上の基本ページレイアウトを簡単に使用できます。レイアウトは、レンダリングされている任意のビューから挿入できるコンテンツのセクションをサポートします。1 列、2 列、ブログアーカイブページなどをサポートする異なるレイアウトを作成できます。レイアウトは直接レンダリングされることはありません。代わりに、ビューをレンダリングし、拡張するレイアウトを指定します。

レイアウトの作成

レイアウトは他のビューと同様にビューです。唯一の違いは、それらの意図された使用方法です。レイアウトは、`renderSection()` メソッドを使用する唯一のビューファイルです。このメソッドは、コンテンツのプレースホルダーとして機能します。

例: **app/Views/default.php**

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

`renderSection()` メソッドには、`$sectionName` と `$saveData` の 2 つの引数があります。 `$sectionName` は、子ビューがコンテンツセクションに名前を付けるために使用するセクションの名前です。ブール値の引数 `$saveData` が true に設定されている場合、メソッドは後続の呼び出しのためにデータを保存します。そうでない場合、メソッドはコンテンツを表示した後にデータをクリーンアップします。

例: **app/Views/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 以降で使用できます。

ビューでのレイアウトの使用

ビューをレイアウトに挿入する場合、ファイルの先頭で `extend()` メソッドを使用する必要があります

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

`extend()` メソッドは、使用したいビューファイルの名前を受け取ります。それらは標準のビューであるため、ビューと同様に配置されます。デフォルトでは、アプリケーションの View ディレクトリを検索しますが、他の PSR-4 で定義された名前空間もスキャンします。名前空間を含めて、特定の名前空間 View ディレクトリ内のビューを見つけることができます

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

レイアウトを拡張するビュー内のすべてのコンテンツは、`section($name)` と `endSection()` メソッド呼び出しの間に含める必要があります。 これらの呼び出しの間にあるすべてのコンテンツは、セクション名と一致する `renderSection($name)` 呼び出しが存在するレイアウトに挿入されます。

例: **app/Views/some_view.php**

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

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

`endSection()` にはセクション名は必要ありません。 どのセクションを閉じるかを自動的に認識します。

セクションにはネストされたセクションを含めることができます

<?= $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');
    }
}

ビュー **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()` メソッドを呼び出すときは、キャッシュディレクティブなどを含む、通常のビューをレンダリングするときと同じオプションをすべて渡すことができます。