ビュー

ビューは、単なる Web ページ、またはヘッダー、フッター、サイドバーなどのページの断片です。実際、ビューは、このタイプの階層が必要な場合、他のビュー(他のビュー内など)に柔軟に埋め込むことができます。

ビューは直接呼び出されることはなく、コントローラーまたは ビュールート によってロードされる必要があります。

MVC フレームワークでは、コントローラーが交通整理の役割を果たすため、特定のビューを取得する役割を担っていることに注意してください。コントローラー のページを読んでいない場合は、先に進む前に読んでください。

コントローラーのページで作成したコントローラーの例を使用して、ビューを追加してみましょう。

ビューの作成

テキストエディターを使用して、**blog_view.php** という名前のファイルを作成し、次の内容を記述します。

<html>
    <head>
        <title>My Blog</title>
    </head>
    <body>
        <h1>Welcome to my Blog!</h1>
    </body>
</html>

次に、ファイルを **app/Views** ディレクトリに保存します。

ビューの表示

特定のビューファイルを読み込んで表示するには、コントローラーで次のコードを使用します。

return view('name');

ここで、*name* はビューファイルの名前です。

重要

ファイル拡張子が省略されている場合、ビューは **.php** 拡張子で終わることが想定されます。

次に、**app/Controllers** ディレクトリに **Blog.php** という名前のファイルを作成し、次の内容を記述します。

<?php

namespace App\Controllers;

class Blog extends BaseController
{
    public function index()
    {
        return view('blog_view');
    }
}

**app/Config/Routes.php** にあるルーティングファイルを開き、「ルート定義」を探します。次のコードを追加します。

use App\Controllers\Blog;

$routes->get('blog', [Blog::class, 'index']);

サイトにアクセスすると、新しいビューが表示されます。URL は次のようになります。

example.com/index.php/blog/

複数のビューの読み込み

CodeIgniter は、コントローラー内からの複数の view() 呼び出しをインテリジェントに処理します.複数の呼び出しが発生した場合、それらは連結されます.たとえば、ヘッダービュー、メニュービュー、コンテンツビュー、フッタービューが必要になる場合があります.これは次のようになります.

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class Page extends Controller
{
    public function index()
    {
        $data = [
            'page_title' => 'Your title',
        ];

        return view('header')
            . view('menu')
            . view('content', $data)
            . view('footer');
    }
}

上記の例では、「動的に追加されたデータ」を使用しています。これは以下で説明します.

サブディレクトリ内へのビューの保存

ビューファイルは、そのような構成を好む場合は、サブディレクトリ内に保存することもできます.その場合は、ビューを読み込むときにディレクトリ名を含める必要があります.例:

return view('directory_name/file_name');

名前空間付きビュー

ビューを名前空間化された **View** ディレクトリに保存し、名前空間化されたかのようにそのビューを読み込むことができます.PHP は名前空間からの非クラスファイルの読み込みをサポートしていませんが、CodeIgniter はこの機能を提供することで、ビューをモジュールのようにまとめて再利用または配布しやすくしています.

オートローダー に PSR-4 マッピングが設定されている **example/blog** ディレクトリがあり、名前空間 Example\Blog の下に存在する場合、名前空間化されたかのようにビューファイルを取得できます.

この例に従って、名前空間をビューの名前に付加することにより、**example/blog/Views** から **blog_view.php** ファイルを読み込むことができます.

<?php

return view('Example\Blog\Views\blog_view');

ビューのキャッシュ

3 番目のパラメーターでビューをキャッシュする秒数を指定した cache オプションを渡すことにより、view() 関数でビューをキャッシュできます.

// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60]);

デフォルトでは、ビューはビューファイル自体と同じ名前を使用してキャッシュされます.cache_name と使用するキャッシュ ID を渡すことで、これをカスタマイズできます.

// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);

ビューへの動的データの追加

データは、view() 関数の 2 番目のパラメーターにある配列によって、コントローラーからビューに渡されます.次に例を示します.

$data = [
    'title'   => 'My title',
    'heading' => 'My Heading',
    'message' => 'My Message',
];

return view('blog_view', $data);

コントローラーファイルで試してみましょう.開いて、次のコードを追加します.

<?php

namespace App\Controllers;

class Blog extends BaseController
{
    public function index()
    {
        $data['title']   = 'My Real Title';
        $data['heading'] = 'My Real Heading';

        return view('blog_view', $data);
    }
}

次に、ビューファイルを開き、テキストをデータ内の配列キーに対応する変数に変更します.

<html>
    <head>
        <title><?= esc($title) ?></title>
    </head>
    <body>
        <h1><?= esc($heading) ?></h1>
    </body>
</html>

次に、使用している URL でページを読み込むと、変数が置き換えられているのがわかります.

saveData オプション

渡されたデータは、後続の view() の呼び出しのために保持されます.1 つのリクエストで関数を複数回呼び出す場合、目的のデータを各 view() に渡す必要はありません.

ただし、これでは他のビューにデータが「ブリード」して問題が発生する可能性があるのを防ぐことはできません.1 回の呼び出し後にデータを消去したい場合は、3 番目のパラメーターの $option 配列に saveData オプションを渡すことができます.

$data = [
    'title'   => 'My title',
    'heading' => 'My Heading',
    'message' => 'My Message',
];

return view('blog_view', $data, ['saveData' => false]);

さらに、view() 関数のデフォルトの機能として、呼び出し間でデータをクリアするようにしたい場合は、**app/Config/Views.php** で $saveDatafalse に設定できます.

ループの作成

ビューファイルに渡すデータ配列は、単純な変数に限定されません.多次元配列を渡すことができ、それをループして複数の行を生成できます.たとえば、データベースからデータを取得する場合、通常は多次元配列の形式になります.

簡単な例を次に示します.これをコントローラーに追加します.

<?php

namespace App\Controllers;

class Blog extends BaseController
{
    public function index()
    {
        $data = [
            'todo_list' => ['Clean House', 'Call Mom', 'Run Errands'],
            'title'     => 'My Real Title',
            'heading'   => 'My Real Heading',
        ];

        return view('blog_view', $data);
    }
}

次に、ビューファイルを開いてループを作成します.

<html>
<head>
    <title><?= esc($title) ?></title>
</head>
<body>
    <h1><?= esc($heading) ?></h1>

    <h2>My Todo List</h2>

    <ul>
    <?php foreach ($todo_list as $item): ?>

        <li><?= esc($item) ?></li>

    <?php endforeach ?>
    </ul>

</body>
</html>